参考各种表格

时间:2010-10-13 09:35:05

标签: sql

好吧,我正处于一些设计问题的中间。 我正在尝试为我的网站构建一种通用的评论系统。 所以我从两个表开始:

Comment_node 有很多评论

现在我希望能够将我的评论系统附加到我网站上的不同位置。例如,blog_posts和user_pages。

blog_posts 有一个 comment_node

user_pages 有一个(不同的) comment_node

所以我最终想到在blog_posts和user_pages表中存储额外的 comment_node_id 字段。但问题在于这个连接是单向的 - 我可以从博客帖子和用户页面获取Comment节点,但是有了comment_node,我找不到哪个其他表使用它。

当然我可以在comment_nodes或其他东西中存储'linked_table'字符串,但我想这会破坏我的数据库设计。

有没有很好的方法来实现这一目标?感谢

1 个答案:

答案 0 :(得分:1)

其实你的想法是正确的。更改Comment_node表并添加以下列

| commentable_type | commentable_id |

commentable_type列包含一个字符串,其中包含引用表的名称(在您的示例中为blog_posts或user_pages),而commentable_id包含blog_post或user_page的id(取决于commentable_type列)。

然后在blog_post和user_page表中添加一个外键以引用您的Comment_node。

我以前设计过这种评论系统,通常我的方法是

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

我的评论表对应于您的Comment_node(如果我正确地假设这一点)。在我看来,这是实现这一目标的最佳方式。

编辑:然后您可以按如下方式执行左连接:

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