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?
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
Testado no DB<>Fiddle
Então, de um modo geral, sua restrição UNIQUE não funciona. Considere mudar de ATIVO para
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)