Pergunta

O que é o benefício de ter tabelas de junção entre o primeiro 1: m e o segundo 1: relações m na seguinte base de dados

alt texto http://dl.getdropbox.com/u /175564/db/db-simple.png

O livro árvores e hierarquias de Joe Celko em SQL para Smarties diz que o motivo é ter relações únicas em 1: m de. Por exemplo, as tabelas a seguir resrict usuários de pedir ao exatamente a mesma pergunta duas vezes e dar exatamente a mesma resposta duas vezes, respectivamente.

O primeiro 1: m relação

users-questions
===============
user_id REFERENCES users( user_id )
question_id REFERENCES questions ( question_id )
PK( user_id, question_id)           // User is not allowed to ask same question twice 

O segundo 1: m relação

questions-answers
=================
question_id REFERENCES questions( question_id)
answer_id REFERENCES answers( aswer_id )
PK( question_id, answer_id )       //  Question is not allowed to have to same answers

Este benefício sobre singularidade não convencer-me a fazer o meu código mais desafiador. Eu não consigo entender por que eu deveria restringir a possibilidade de ter perguntas ou respostas com a mesma ID no db, desde que eu talvez possa usar o PHP para proibir isso.

Foi útil?

Solução

Sua geralmente devido a duplicação de dados.

Quanto ao seu raciocínio, sim, você pode aplicar isso na camada de negócios, mas se você cometer um erro, ele poderia quebrar uma quantidade significativa de código. O problema que você tem é o seu modelo de dados pode ter apenas algumas mesas. Sortudo. Quando seu modelo de dados cresce, se você não pode fazer o sentido da estrutura e você tem que colocar toda a lógica de manter tabelas Desnormaliza em sua camada de GUI você poderia muito facilmente ter problemas. Note-se que é difícil fazer as coisas em encadeamento em uma GUI para o seu banco de dados SQL sem o uso de bloqueio que irá destruir o seu desempenho.

DBMS são muito, muito bom em lidar com estes problemas. Você pode manter o seu modelo de dados limpo e uso de indexação para fornecê-lo com a velocidade que você precisa. Seu objetivo deve ser fazer a coisa certa em primeiro lugar, e só denormalise suas tabelas quando você pode ver uma clara necessidade de fazê-lo (para o desempenho etc.)

Acredite ou não, há muitas situações em que ter dados normalizado facilita a sua vida, não mais difícil quando se trata de sua aplicação. Por exemplo, se você tem uma grande mesa com perguntas e respostas, você tem que escrever código para verificar se ele é único. Se você tem uma tabela com uma chave primária, basta escrever

insert into table (col1, col2) values (@id, @value) --NOTE: You would probably 
--make the id column an autonumber so you dont have to worry about this

O banco de dados vai impedi-lo de inserção se você tiver um valor não exclusivo lá ou se você está colocando em uma resposta sem pergunta. Tudo que você precisa fazer é verificar se a inserção trabalhou, nada mais. Qual deles você acha que é menos código?

Outras dicas

Bem, a coisa relações única parece sem sentido para mim, provavelmente porque eu estou acostumado a DBMSes onde você pode definir diferentes da chave primária chaves únicas. No meu mundo, tabelas de mapeamento como essas são como implementar um relacionamento muitos-para-muitos, e usá-los para um relacionamento um-para-muitos é loucura - Quer dizer, se você fizer isso, talvez você pretendem para o relacionamento para ser usado como um-para-muitos, mas o que você realmente implementada é muitos-para-muitos apoio.

Eu não concordo com o que você está dizendo sobre a existência de nenhuma utilidade para chaves compostas únicas na camada de persistência, porque você pode impor que na camada de aplicação, no entanto. Persistência da camada de restrições de exclusividade tem um monte de benefícios difíceis de replicar, tais como, em MySQL, a capacidade de tirar vantagem de INSERT ... ON DUPLICATE KEY UPDATE .

Eu concordo que a tabela de junção para um um-para-muitos nesta situação não parece acrescentar muito benefício, e como @chaos diz, você realmente acabar execução do apoio de muitos para muitos. Mas Joe Celko é um cara inteligente? - isso é realmente a resposta exata que ele dá

Uma outra razão possível para a implementação de uma tabela de junção em um one-to-many é que ele separa completamente perguntas / respostas de uma dependência de usuários.

Por exemplo, digamos que você acrescentou tabelas Dogs e uma tabela Deities. Nós todos sabemos que os cães não podem registrar-se como usuários, porque eles não têm endereços de e-mail, e os deuses não se registrar como usuários, porque, bem, é abaixo deles. Talvez cães e deuses ainda fazer perguntas embora, mas para fazer isso você pode querer implementar uma tabela de cães-perguntas e uma mesa de divindades-perguntas. Em teoria, este é ainda muitos-para-muitos, mas na prática você fazê-lo de modo que você pode ter vários one-to-manys.

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