ATUALIZAÇÃO: Como implementar o conceito de chave estrangeira no MySQL quando não temos recursos de integridade referencial no MySQL?

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

Pergunta

Minha pergunta é sobre o conceito de integridade referencial no banco de dados MySQL. Devido a algum tipo de restrição do nosso DBA, não temos permissão para usar os recursos de integridade referencial do MySQL e, portanto, minha pergunta é "como podemos implementar o conceito de chave estrangeira no MySQL quando não temos recursos de integridade referencial no MySQL?"

Obrigado.

Foi útil?

Solução

Presumo que você esteja usando tabelas Myisam? Você está praticamente preso em fazer os cheques.

Portanto, se a Tableb depende do Tablea, antes de excluir do tablea, você deve excluir da tabela (ou executar outra atualização) primeiro. Com inserções, você criaria o registro na tabela principal e, em seguida, criaria o registro na tabela dependente.

É complicado e a única razão pela qual já encontrei para manter uma mesa do Myisam foi a indexação completa. Se eu soubesse mais sobre suas restrições de banco de dados, poderia fazer outras sugestões.


ETA:

Se ele estiver restringindo você de usar mesas Innodb, eu me pergunto sobre o seu DBA. De qualquer forma, se ele não permitir que você crie e use tabelas Innodb por razões de segurança, é realmente improvável que ele permita que você use procedimentos ou gatilhos armazenados. Então você estará essencialmente preso escrevendo um aplicativo para fazer o seu Crud operações em alguma linguagem de script.

Portanto, você precisa pensar sobre o que as restrições nessas operações devem ser para cada caso específico. Provavelmente a maneira mais fácil é mapear seu esquema de banco de dados como se fosse fez aplicar integridade referencial. Inclua detalhes sobre o que, se houver, as ações podem acontecer devido a uma alteração em qualquer tabela. As opções de sequelas de operação são restritas, definidas nulas e cascata.

Depois de saber como seu banco de dados deveria Para responder, você pode programas que você consulta de acordo.

Portanto, se os funcionários tiverem endereços, e os endereços devem desaparecer quando um funcionário for excluído:

Versão Innodb (onde os endereços têm chave estrangeira para os funcionários e ON DELETE CASCADE ação)

DELETE FROM Employees WHERE employee_id=7;

Versão de Myisam:

DELETE FROM Employees WHERE employee_id=7;
DELETE FROM Addresses WHERE employee_id=7;

Espero que isso deixa as coisas um pouco mais claras.

Outras dicas

O que isso significa é que todos os desenvolvedores devem conhecer especificamente os relacionamentos que devem estar lá e trabalhar da tabela pai em todas as tabelas infantis ao fazer inserções ou atualizações e trabalhar nas tabelas da criança através das tabelas pais ao fazer exclusão. É claro que o problema é que nem todo desenvolvedor estará ciente de todas as tabelas envolvidas em restrições não são definidas. E se você tiver camadas de relacionamentos, precisará seguir todo o caminho para o fundo da corrente para fazer uma exclusão.

Se você usa um ORM, acho que pode definir relacionamentos lá? Não tenho certeza de nunca usaram um, mas acho que você pode. Vale a pena investigar o aspecto.

Se você não estiver usando um ORM e não pode definir a integridade referencial, pelo menos armazene os relacionamentos em uma tabela em algum lugar para que os desenvolvedores possam procurar quais tabelas seriam afetadas.

Outra abordagem se você não puder definir a integridade referencial especificamente seria aplicá -la através de gatilhos.

Editado para expandir os gatilhos: se você criar um gatilho em vez de gatilho (estes estão disponíveis no meu SQL?) Na tabela pai, você pode imitar o comportamento de uma exclusão em cascata especificando as tabelas para excluir antes de fazer a exclusão real (isso como como Costumávamos fazer isso nos velhos tempos antes de termos excluídos em cascata). Você também pode especificar as tabelas para atualizar se as principais alterações da chave em uma atualização (espero que seu design tenha uma chave que não mudará, mas não se você usou nenhuma chave natural). Um gatilho de inserção em qualquer tabela infantil veria se o valor do campo principal existia na tabela pai e depois a rejeitou se não o fizesse.

Eu costumava trabalhar com a mesa Myisam.

Então, isso significa que você precisa fazer manualmente o trabalho. Você precisará fazer algumas seleções antes de excluir alguma linha pai, por exemplo.

É possível fazer, mas sem integridade referencial não é a mesma. Mas funciona.

Se puder usar procedimentos armazenados para facilitar as 'seleções'. Outro bom Atorach é ocultar o esquema de banco de dados por trás de um modelo e usá -lo através da interface.

Um argumento frequentemente ouvido de DBA nesse contexto é que "se o RI for usado, a descarga/carregamento para reorganizar é mais difícil para nós".

É claro que isso é verdade, por si só, mas o Vilain é que o 'mais difícil' é geralmente sugerido para significar 'muito mais difícil que se torne quase impossível para nós, dbas, fazer nosso trabalho'.

E isso é bullocks.

Existem estruturas de persistência que farão isso por você. Para trabalhar no maior número possível de DBs, essas estruturas não dependem de recursos específicos de banco de dados, como o FKS, e implementam -os. Kodo é um exemplo.

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