Eu estava lendo os erros mais comuns de design de banco de dados cometidos pelo desenvolvedor Q & A no stackoverflow. Na primeira resposta havia uma frase sobre arco exclusivo:
Um arco exclusivo é um erro comum onde uma tabela é criada com duas ou mais chaves estrangeiras onde uma e apenas um deles pode ser não nulo. Grande erro. Por um lado, torna-se muito mais difícil manter a integridade dos dados. Afinal, mesmo com integridade referencial, nada impede que duas ou mais dessas chaves estrangeiras sejam definidas (apesar das restrições de verificação complexas).
Eu realmente não “Não entendo por que o arco exclusivo é mau. Provavelmente não entendia o básico disso. Existe alguma boa explicação sobre arcos exclusivos?
Resposta
Pelo que entendi há muito tempo, de forma exclusiva arc uma tabela contém várias colunas que são chaves estrangeiras para outras tabelas, mas apenas uma delas pode ser definida por vez (devido a alguma restrição lógica no domínio decorrente do mundo real). Como essa regra não pode ser aplicada no banco de dados, um registro corrompido pode ser criado onde mais de uma dessas chaves estrangeiras tem um valor.
Vou dar um exemplo. Considere um aplicativo em que uma empresa mantém o controle de os caminhões que usa para entregar as mercadorias. Um caminhão só pode estar em um dos três lugares ao mesmo tempo: pode estar com um funcionário, pode estar em um estacionamento ou pode estar em uma oficina de manutenção. Isso pode ser modelado por ter uma tabela Truck com employeeId, parkingGarageId e maintenanceShopId, referenciando as tabelas Employee, ParkingGarage e MaintenanceShop. Não há como impor a regra de que apenas um desses campos é preenchido no nível do banco de dados. Código incorreto ou alguém com acesso direto ao banco de dados poderia inserir um registro com dois ou três campos preenchidos, o que equivale a corrupção de dados no banco de dados.
Comentários
Resposta
Não há nada de mal em arcos exclusivos. Basta aplicar a regra de negócios correspondente usando uma restrição de verificação. A maioria dos principais sistemas de gerenciamento de banco de dados oferece suporte a restrições de verificação (Oracle, SQL Server, PostgreSQL). Se você estiver usando uma ferramenta de modelagem de dados, há uma boa chance de que sua ferramenta gere automaticamente o código para implementar a restrição de verificação.
Resposta
O arco exclusivo é muito útil no design conceitual ou lógico. Não significa que você tenha que implementar dessa forma. No exemplo anterior, o designer pode decidir implementar o design com três mesas. Uma para estacionamento local, um para o funcionário e outro para a oficina de manutenção.
alter table mytable add constraint myconstraint check ((col1 is not null and col2 is null and col3 is null) or (col1 is null and col2 is not null and col3 is null) or (col1 is null and col2 is null and col3 is not null))
. Eu não ' não gosto de arcos exclusivos, mas eles podem ser aplicados com uma restrição de verificação. É claro que a restrição FK também deve estar presente.