2010-12-08 15 views
3

En utilisant un site de questions et réponses comme celui-ci comme exemple. Dites que j'ai question, answer, et comment tables. Les questions et réponses peuvent chacune avoir plusieurs commentaires.Conception de la base de données: dois-je utiliser une table de mappage?

Serait-il préférable de:

  1. créer QuestionComment et AnswerComment tables à la carte de questions/réponses aux commentaires (contenant chacun la question/réponse pk et commentaires pk)? Ou devrais-je seulement avoir la table de commentaire contenant 2 clés étrangères valables à la question et à la réponse (dont une sera toujours nulle puisque qu'un commentaire peut s'appliquer seulement à un seul "article")?

Il semble que (1) conserve l'intégrité référentielle alors que (2) est plus compact. Est-ce que l'un est préféré à l'autre? Les tables de mappage doivent-elles être réservées uniquement aux relations plusieurs-à-plusieurs?

+0

Utilisez-vous un modèle de domaine ou allez-vous accéder à la structure de la base de données directement en mémoire (par exemple, en utilisant ADO.NET DataTables)? –

Répondre

1

Utiliserez-vous les deux commentaires de la même manière? Si oui, alors (2) sinon (1)

Si vous utilisez (1), vous pouvez créer une vue sur les deux tables pour les faire apparaître comme une seule. Dans le cas (2), vous pouvez ajouter un déclencheur pour appliquer une seule colonne étrangère remplie par ligne ou comme suggéré par @Ronnis en utilisant une contrainte CHECK (une meilleure technique).

+0

Merci. (2) "sent" bizarre d'avoir 2 clefs étrangères nulles et "espère" que l'application s'occupe de l'intégrité plus la logique pour vérifier qui est peuplé .. – jmk23

+0

Je suppose que ce que je veux dire, c'est qu'il n'y a rien qui empêche les deux clés étrangères d'être peuplé ce qui n'a pas de sens, car un commentaire ne peut pas s'appliquer à la fois à une question et à une réponse (peut-être cela peut-il être facile de supposer un scénario où cela n'aurait pas de sens). Existe-t-il un moyen d'imposer cette condition xor dans les dbms? – jmk23

+0

@ jmk23: si votre dbms supporte la clause CHECK, vous pouvez implémenter la condition "xor" que vous mentionnez. CHECK ((fk1 est nul et fk2 n'est pas nul) ou (fk2 est nul et fk1 n'est pas nul)) – Ronnis

0

Je l'ai vu une ou l'autre approche fait dans la pratique, mais je préfère (1) un peu plus:

Je pense que (1) exprime votre domaine un peu plus clairement à quelqu'un parcourant le schéma - ils verront Réponse et réponseComment juste l'un à côté de l'autre. Si les commentaires de réponse et les commentaires de question se trouvent dans le même tableau, vous devez explorer la table des commentaires pour voir à quel objet un commentaire peut appartenir.

Si vous utilisez un domain model avec une séparation entre les objets de domaine et la persistance, la question est discutable: peu importe si vous les stockez dans la même table ou dans différentes tables. (Et ils ne seraient des classes séparées que s'ils se comportent différemment.)