AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 4916
Accepted
bernd_k
bernd_k
Asked: 2011-08-23 07:54:15 +0800 CST2011-08-23 07:54:15 +0800 CST 2011-08-23 07:54:15 +0800 CST

Como implementar um atributo cancel em uma tabela?

  • 772

Qual é a melhor maneira de implementar um atributo cancelado em uma tabela de banco de dados, desde que menos de 3% das linhas sejam canceladas.

Para dados cancelados, desejo armazenar as informações adicionais

  • por quem
  • quando
  • Por quê

Em cerca de 95% das consultas, desejo selecionar apenas as linhas não canceladas.

Além disso, quero poder implementar restrições exclusivas em algumas colunas para as colunas não canceladas.

Quais são os prós e contras de usar NULL em alguma coluna como indicador de não cancelado?

sql-server oracle
  • 4 4 respostas
  • 436 Views

4 respostas

  • Voted
  1. Aaron Bertrand
    2011-08-23T08:08:02+08:002011-08-23T08:08:02+08:00

    Não tenho certeza se gosto NULLpor falta de cancelamento. Acho que prefiro ter um sinalizador Active que seja 1 por padrão e definido como 0 quando algo for cancelado. Agora suas verificações são simplesmente WHERE active = 1 ou WHERE active = 0, em vez de lidar com todas as verificações OR IS NULLou OR IS NOT NULL, e uma linha pode estar inativa por outros motivos além de "cancelada" caso esse modelo amadureça por outros motivos. Você pode usar índices filtrados para tornar as consultas de um tipo ou outro um pouco mais eficientes se estiver usando o SQL Server 2008+. NULLimplica desconhecido e, no caso de você ter apenas dois estados, "não cancelado" não é desconhecido.

    Quanto a quem, por que, quando? Talvez seja uma tabela completamente separada e possa funcionar como um log de auditoria (incluindo se as entidades forem marcadas como canceladas, depois tornadas ativas novamente, depois canceladas novamente, etc.). Seria apenas algo como:

    CREATE TABLE dbo.<something>AuditLog
    (
        key INT NOT NULL FOREIGN KEY REFERENCES dbo.<something>(key),
        action NVARCHAR(32) NOT NULL, 
          -- perhaps a CHECK here or a foreign key to an 
          -- action code table, e.g. 'made active, made inactive'
        who NVARCHAR(64) NOT NULL,
        when DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
        why NVARCHAR(MAX)
    );
    
    • 3
  2. Best Answer
    gbn
    2011-08-23T08:17:17+08:002011-08-23T08:17:17+08:00

    Você tem 97% de linhas ativas e 95% de consultas nesses 97%.

    Uma cláusula WHERE que seleciona 97% das linhas não será ajudada pela indexação: não é seletiva o suficiente

    Eu consideraria 2 tabelas para suas "Coisas": ThingActive e ThingCancelled

    Para os 5% em que você consulta linhas canceladas, você lê apenas a tabela Cancelada ou um UNION/View

    Uma reviravolta nisso...

    A tabela cancelada armazena apenas o ID da tabela principal e as colunas extras (portanto, NÃO EXISTE para encontrar a ativa).

    • 3
  3. Jack Douglas
    2011-08-23T08:08:35+08:002011-08-23T08:08:35+08:00

    Em cerca de 95% das consultas, desejo selecionar apenas as linhas não canceladas.

    Isso provavelmente não importa se "menos de 3% das linhas forem canceladas". - deixá-los ser digitalizados de qualquer maneira?

    Oráculo:

    Para a restrição exclusiva, se você incluir cancelled_seq(de uma sequência) no índice, as linhas canceladas nunca farão com que a restrição falhe

    Quais são os prós e contras de usar NULL em alguma coluna como indicador de não cancelamento?

    profissional: você pode procurar as linhas canceladas rapidamente se indexar essa coluna, pois as linhas com todos os nulls serão omitidas do índice

    contra: obscuridade

    • 1
  4. Richard
    2011-08-23T08:11:30+08:002011-08-23T08:11:30+08:00

    Realmente depende dos dados de que estamos falando.

    No entanto, eu pessoalmente não gosto de usar um NULL para indicar um status (a menos que seja uma chave estrangeira ou algo desse tipo). Prefiro um número inteiro com o padrão zero, usando zero como forma de indicar que o não foi cancelado.

    Meu raciocínio: se você decidir adicionar outro "status" posteriormente, terá que implementar uma lógica complicada, em vez de apenas incrementar o inteiro.


    Outra opção é criar uma segunda tabela (quase duplicada) com essas linhas extras. Quando a for cancelado, mova-o para a tabela "cancelled_". Claro, isso presumindo que sua tabela original tinha poucas colunas. Caso contrário, meus instintos de normalização começam a entrar em ação.

    Como alternativa, você pode criar uma tabela de "cancelamento" que contém os dados cancelados com referências de chave estrangeira de volta à tabela principal. Mas, novamente, depende totalmente dos seus dados e do seu ambiente.

    • 0

relate perguntas

  • ORDER BY usando prioridades personalizadas para colunas de texto

  • Interface sqlplus confortável? [fechado]

  • Como encontrar as instruções SQL mais recentes no banco de dados?

  • Como posso consultar nomes usando expressões regulares?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve