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 / 252247
Accepted
Sarov
Sarov
Asked: 2019-10-31 11:47:43 +0800 CST2019-10-31 11:47:43 +0800 CST 2019-10-31 11:47:43 +0800 CST

Faz sentido colocar uma restrição exclusiva em um sinalizador de exclusão reversível anulável?

  • 772

Portanto, atualmente temos o seguinte:

MYTABLE
COLUMN: ID (INTEGER Primary key, auto-incrementer)
COLUMN: START (DATE)
COLUMN: COMPANYID (INTEGER, Foreign key to COMPANY)
COLUMN: DELETED (INTEGER)
CHECK: DELETED = 0 OR DELETED = 1

Agora, há o requisito de permitir infinitos registros excluídos, mas permitir apenas um único registro não excluído para cada data + empresa.

Eu sugeri mudar o esquema para:

MYTABLE
COLUMN: ID (INTEGER Primary key, auto-incrementer)
COLUMN: START (DATE)
COLUMN: COMPANYID (INTEGER, Foreign key to COMPANY)
COLUMN: ACTIVE (Nullable INTEGER)
CHECK: ACTIVE = 1 OR ACTIVE IS NULL
UNIQUE: START, COMPANYID, ACTIVE

Enquanto meu colega de trabalho é da opinião de que isso está "indo longe demais com restrições" e que devemos confiar apenas na verificação de exclusividade no aplicativo.

Existe uma prática recomendada geralmente aceita aqui?

database-design unique-constraint
  • 1 1 respostas
  • 304 Views

1 respostas

  • Voted
  1. Best Answer
    Lennart - Slava Ukraini
    2019-10-31T12:08:36+08:002019-10-31T12:08:36+08:00

    Você não menciona a qual DBMS você está se referindo, mas sua restrição exclusiva sugerida não funcionará para vários por aí, porque null não é igual a null

    create table t (x int not null, y int, unique(x,y));
    insert into t (x) values (1);
    insert into t (x) values (1);
    
    Postgres12
    Does not violate the constraint
    
    Oracle18c
    Violates constraint
    
    Db2 Developer C 11.1
    Does not accept nullable columns in unique constraint
    
    Firebird 3.0
    Violates constraint
    
    MariaDB 10.4
    Does not violate the constraint
    
    MySQL 8.0
    Does not violate the constraint
    
    SQLlite 3.27
    Does not violate the constraint
    
    SQLServer 2017
    Violates constraint
    

    Testado no DB<>Fiddle

    Então, de um modo geral, sua restrição UNIQUE não funciona. Considere mudar de ATIVO para

    ACTIVE SMALLINT NOT NULL,
    CHECK (ACTIVE BETWEEN 0 AND 1),
    UNIQUE (START, COMPANYID, ACTIVE)
    

    Embora eu não esteja convencido de que um determinado ID DA EMPRESA em um START específico possa ser ATIVO e NÃO ATIVO, mas não conheço o seu negócio.

    EDIT: Dadas as novas informações na pergunta, algo assim pode ser possível (não tenho acesso aos documentos do sistema i agora, então não sei se existem colunas geradas ou restrições em expressões)

    create table t 
    ( a int not null generated always as identity
    , x int not null
    , y int
    , z int not null generated always as ( 
        case when y is null then -1*a else y end 
    )
    , unique(x,z)
    , check (y is null or y = 1)
    );
    
    insert into t(x) values (1); -- ok
    insert into t(x) values (1); -- ok
    insert into t(x,y) values (1,1); -- ok
    insert into t(x,y) values (1,1); -- fails because of constraint violation.
    
    • 2

relate perguntas

  • Os índices filtrados podem ajudar a melhorar as consultas baseadas em uma hora inserida ou isso deve ser evitado?

  • Qual é a diferença entre os tipos de dados MySQL VARCHAR e TEXT?

  • É melhor armazenar os valores calculados ou recalculá-los a pedido? [duplicado]

  • Armazenar vs calcular valores agregados

  • Quais são algumas maneiras de implementar um relacionamento muitos-para-muitos em um data warehouse?

Sidebar

Stats

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

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

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

    • 4 respostas
  • Marko Smith

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

    • 10 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
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +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

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