Eu tenho as seguintes dependências funcionais que estão no BCNF:
a,b -> c
a -> d
b -> d
Com a restrição adicional, que no a
e b
devem ser combinados com a c
, onde a
e b
têm d
s diferentes.
Exemplo:
a | d b | d a | b | c
----- ----- ---------
1 | 3 5 | 3 1 | 5 | 6
2 | 4 2 | 5 | 7
A primeira linha a,b,c
é permitida ( 1->3
, 5->3
), mas a segunda linha é proibida, pois ( 2->4
, 5->3
) 4 != 3
.
Essa restrição adicional pode ter dois efeitos em meus dados. Para cada um a,b,c
, existem duas maneiras redundantes de determinar o d
. Pode haver dados que violam a restrição. Como meu esquema pode refletir essa restrição adicional?
Em poucas palavras, introduza
d
na terceira tabela para permitir restrições de chave estrangeira de baunilha, por exemplo, sintaxe Transitional SQL-92:" Então a sua resposta é "não é possível"? "
Muitas coisas são possíveis. Em seu caso muito particular, parece-me que a aplicação de sua restrição 'adicional' pode ser alcançada mantendo a tabela única do banco de dados (4 colunas). Isso garantirá que qualquer a, b combinado sempre corresponderá ao mesmo d (porque só pode haver um único d). O preço que você paga é que não há mais uma maneira "natural" (ou seja, uma consequência imediata da própria estrutura lógica do próprio banco de dados) que aplicará seus FDs a->d e b->d "automaticamente" .
É um fato bem conhecido que o processo clássico de normalização por decomposição, às vezes requer que certos DFs sejam restabelecidos como uma restrição de banco de dados, porque no projeto decomposto a regra não pode mais ser declarada como um DF. Seu caso particular parece ser um desses, onde você tem a escolha entre um projeto que aplica "automaticamente" a->d e b->d, mas onde você tem que fazer um esforço extra para impor sua restrição adicional, ou um projeto que "automaticamente" impõe sua restrição adicional, mas onde você tem que fazer trabalho extra para impor [as restrições correspondentes a] seus DFs a->d e b->d.
Tendo TODAS as restrições que você mencionou impostas apenas pela estrutura do banco de dados, é possível, no seu caso particular, usar a solução do onedaywhen. No entanto, (a) isso é apenas uma solução para casos particulares, como o seu exemplo, (b) o preço que você paga é maior redundância e, portanto, complexidade adicional na atualização de seu banco de dados (e certas atualizações podem ser impossíveis de alcançar !!!) , e (c) ainda permanece um fato que nem todas as restrições de banco de dados concebíveis são expressáveis como um DF.
(Desculpe por postar uma segunda resposta. Meu login do Stackoverflow não me permite comentar aqui.)
Em poucas palavras, crie um
ASSERTION
para garantir que em nenhum momento a regra de negócios seja violada, por exemplo, sintaxe SQL-92 padrão completa:A má notícia é que nenhum produto SQL comercial (ou não?) oferece suporte a arquivos
CREATE ASSERTION
.A maioria dos produtos SQL de força industrial oferece suporte a gatilhos: pode-se implementar o acima em um gatilho em cada tabela aplicável . O MS Access é o único produto comercial que conheço que oferece suporte a subconsultas em
CHECK
restrições, mas não o considero de força industrial. Existem outras soluções alternativas, por exemplo, forçar os usuários a atualizar tabelas apenas por meio de procedimentos armazenados que podem ser mostrados para nunca deixar o banco de dados em um estado ilegal.