Como você determina se uma tabela de banco de dados méritos relacionamento impor a integridade referencial?

StackOverflow https://stackoverflow.com/questions/581684

Pergunta

Tenho uma aplicação onde a maioria das tabelas de banco de dados tem uma forte relação com uma outra mesa. Atualmente estou impor a integridade referencial com chaves estrangeiras, mas eu estou querendo saber se esta é realmente a melhor abordagem. Dados na tabela primária pode ser excluído de uma interface de administração pelos usuários de negócios, o que significa que têm que fazer uma exclusão em cascata, (ou escrever várias instruções DELETE), mas eu não tenho certeza se eu realmente deseja remover tudo o que outros dados em o mesmo tempo. Poderia ser um monte de dados que * pode * ser útil em uma data posterior (relatando talvez?). No entanto, os dados nas tabelas secundárias é basicamente inútil para a aplicação em si, a menos que exista a relação com a tabela primária.

Foi útil?

Solução

Dada a opção, eu sempre manter os dados ao redor. E uma vez que você já tem as chaves estrangeiras no lugar, você tem alguns built-in proteção contra violações de integridade.

Se o que os usuários querem é "eliminar" um registro, portanto, escondendo-a do aplicativo, considere a estratégia de "virtual exclusão." - marcar um recorde como inativo, em vez de removê-lo fisicamente do banco de dados

Como para a implementação, dependendo do seu db, adicione o que equivale a boolean / lógica bit para a sua mesa. Todas as linhas são atribuídos true / 1 por padrão; "Exclusões" são marcadas como false / 0.

Outras dicas

Você pode usar chaves estrangeiras e relações para impor a integridade referencial sem ter que usar exclusões em cascata. Eu raramente usam exclusões em cascata, como eu sempre achei muitas vezes é melhor ter os dados e gerenciar / arquivá-lo bem do que é para excluí-lo .

Basta escrever sua própria lógica de exclusão para apoiar as suas próprias regras de negócios.

exclusões lógicas funcionar perfeitamente bem e eu usá-los extensivamente.

Você não deseja excluir alguns dos dados - você provavelmente vai acabar com dados falsos, que você não tem idéia de onde ele pertencia, em primeiro lugar. É tudo ou nada.

Macio apagar, ou seja, ter um campo de bits em cada linha que determins se o registro é "excluídos" ou não é o caminho a percorrer. Dessa forma, você simplesmente verificar se o registro é excluído == true na API, e escondê-lo a partir da aplicação.

Você manter os dados, mas ninguém pode recuperá-lo através da aplicação.

Eu diria restrições uso chave estrangeira como uma regra - este "salvaguardas" seu projeto DB longo prazo, bem como a própria integridade dos dados. As restrições são também declarar explicitamente a decisão de um designer.

Eu vi restrições abandonou em extremamente grandes bancos de dados - o que seria uma razão para não usá-los, se você comparar o desempenho e há uma sobrecarga de chave estrangeira significativa.

Eu usaria lógica / soft delete . Isto significa basicamente a adição de mais uma coluna (possivelmente pouco Deleted coluna) para a mesa em questão, o que iria marcar uma linha em particular como excluído.

Dito isso, "excluído" de dados é apenas isso: excluído. Assim, não pode, logicamente, ser utilizada em relatórios e coisas semelhantes. Para superar isso, eu também introduzir coluna Hidden para esconder determinadas linhas reter seu significado lógico.

Nunca faça exclusões físicas. Você pode adicionar uma bandeira BOOL IsDeleted para indicar o registro é excluído. Quando você quiser "Apagar" um registro, basta definir o sinalizador para True.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top