Question

Quel est l'avantage d'avoir des tables de jonction entre le premier 1: m et le second 1: relations m dans la base de données suivante

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

Le livre Les arbres de Joe Čelko et des hiérarchies dans SQL pour Smarties dit que la raison est d'avoir des relations uniques en 1: Années m. Par exemple, les tableaux suivants resrict utilisateurs de demander exactement le même question deux fois et de donner exactement la même réponse deux fois, respectivement.

La première 1: relation m

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 

La seconde 1: relation m

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

Cet avantage à l'unicité ne me convainc pas faire mon code plus difficile. Je ne comprends pas pourquoi je devrais limiter la possibilité d'avoir des questions ou des réponses avec le même ID dans la db, puisque je peux peut-être utiliser PHP pour interdire cela.

Était-ce utile?

La solution

Il est généralement due à la duplication des données.

En ce qui concerne votre raisonnement, oui, vous pouvez appliquer ce dans la couche d'affaires, mais si vous faites une erreur, il pourrait briser une quantité importante de code. La question que vous avez est votre modèle de données peut avoir seulement quelques tables. Quel chanceux êtes-vous. Lorsque votre modèle de données augmente, si vous ne pouvez pas le sens de la structure et vous devez mettre toute la logique de maintenir les tables dénormalisé dans votre couche graphique, vous pouvez très facilement des problèmes. Notez qu'il est difficile de faire des choses sur une interface graphique thread-safe pour votre base de données SQL sans utiliser de verrouillage qui détruira vos performances.

SGBD sont très très bonnes à faire face à ces problèmes. Vous pouvez garder votre modèle de données propre et utiliser l'indexation pour vous fournir la vitesse dont vous avez besoin. Votre objectif doit être d'obtenir dès la première, et seulement denormalise vos tables où vous pouvez voir un besoin évident de le faire (pour la performance, etc.)

Croyez-le ou non, il existe de nombreuses situations où avoir des données normalisées rend votre vie plus facile, pas plus dur quand il vient à votre application. Par exemple, si vous avez une grande table avec des questions et des réponses, vous devez écrire du code pour vérifier si elle est unique. Si vous avez une table avec une clé primaire, vous écrivez simplement

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

La base de données vous empêchera d'insérer si vous avez une valeur non unique, là ou si vous placez dans une réponse sans question. Tout ce que vous devez faire est de vérifier si l'insertion a travaillé, rien de plus. Lequel pensez-vous est moins de code?

Autres conseils

Eh bien, la chose des relations uniques me semble absurde de, probablement parce que je suis habitué à DBMSes où vous pouvez définir des clés uniques autres que la clé primaire. Dans mon monde, des tables de correspondance comme ceux sont comment vous mettre en œuvre un grand nombre à plusieurs, et de les utiliser pour un à plusieurs est la folie - je veux dire, si vous faites cela, peut-être vous l'intention pour la relation à utiliser comme un à plusieurs, mais ce que vous avez réellement mis en œuvre est beaucoup à beaucoup de soutien.

Je ne suis pas d'accord avec ce que vous dites au sujet qu'il y ait aucune utilité aux clés de composés uniques dans la couche de persistance parce que vous pouvez appliquer que dans la couche d'application, cependant. les contraintes d'unicité La persistance de la couche ont beaucoup d'avantages difficiles à reproduire, comme dans MySQL, la possibilité de tirer parti de INSERT ... ON DUPLICATE KEY UPDATE .

Je suis d'accord que la table de jointure pour un à plusieurs dans cette situation ne semble pas ajouter beaucoup d'avantages, et comme @chaos dit, vous finissons par mettre en œuvre plusieurs à beaucoup de soutien. Mais Joe est Celko un gars intelligent - est-ce vraiment la réponse exacte, il donne

Une autre raison possible de mettre en œuvre une table de jointure sur un à plusieurs est qu'il sépare complètement les questions / réponses d'une dépendance à l'égard des utilisateurs.

Par exemple, supposons que vous avez ajouté une table de Dogs et une table Deities. Nous savons tous que les chiens ne peuvent pas inscrire les utilisateurs car ils n'ont pas les adresses e-mail, et les dieux n'enregistrons pas les utilisateurs parce que, eh bien, il est en dessous. Peut-être des chiens et des dieux posent encore des questions bien, mais pour ce faire, vous voudrez peut-être mettre en place une table chiens-questions et une table divinités-questions. En théorie, cela est encore beaucoup à beaucoup, mais en pratique, vous le faire de sorte que vous pouvez avoir plusieurs one-to-manys.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top