2010-10-13 4 views
2

Eh bien, je suis au milieu d'un problème de conception. J'essaie de construire un système de commentaire un peu universel pour mon site. Alors j'ai commencé avec deux tables:Référence à divers tableaux

COMMENT_NODE a beaucoup Commentaires

Maintenant, je veux être en mesure d'attacher mon système cool commentaire à divers endroits sur mon site. Par exemple à blog_posts et à user_pages.

blog_posts a un COMMENT_NODE

user_pages a un (différent) COMMENT_NODE

donc j'ai fini en idée de stocker supplémentaire comment_node_id champ dans blog_posts et user_pages tables. Mais le problème ici réside dans le fait que cette connexion est unidirectionnelle - je peux obtenir un nœud Comment à partir de posts de blog et de pages d'utilisateurs, mais avec comment_node je ne peux pas trouver quelle autre table l'utilise. Bien sûr, je peux stocker la chaîne 'linked_table' dans comment_nodes ou quelque chose, mais je suppose que cela va tuer ma conception de base de données.

Existe-t-il un bon moyen d'y parvenir? merci

Répondre

1

En fait votre idée est correcte. Modifier votre table de COMMENT_NODE et ajouter des colonnes suivantes

| commentable_type | commentable_id | 

La colonne commentable_type contient une chaîne avec le nom de la table référencée (de votre exemple, soit blog_posts ou user_pages) et l'commentable_id contient l'identifiant soit du blog_post ou user_page (en fonction de la colonne commentable_type).

Ajoutez ensuite une clé étrangère à la fois à la table blog_post et à la table user_page pour référencer votre noeud "Comment".

J'ai conçu ce genre de systèmes de commentaires avant, généralement mon approche est

commentable_type [0..n] <--> [1] commentings [1] <--> [0..n] comment 

Ma table commentings correspond à votre COMMENT_NODE (si je suppose que cela correctement). À mon avis, c'est le meilleur moyen d'y parvenir.

EDIT: Vous pouvez ensuite effectuer une jointure gauche comme suit:

SELECT * FROM Comment_node c 
LEFT JOIN Blog_post b 
ON c.commentable_id = b.id 
WHERE c.commentable_type = 'blog_post' 
+0

Mais cela me permettra de LEFT JOIN blog_post de COMMENT_NODE? – undsoft

+0

Bien sûr que oui, j'ai édité ma réponse pour inclure ceci. – thomaux

+0

Mais je ne serai pas en mesure de sélectionner la table correspondante dans une requête. Je vais devoir avoir un nombre de requêtes égal au nombre de commentable_types, non? – undsoft