MySQL:多个表的注释

时间:2013-12-26 11:51:25

标签: mysql sql orm

免责声明:我知道这是一个常见的问题,但到目前为止我找不到令人满意的答案。

你们中的许多人可能都知道这个问题:我们有一个“评论”表,但我们可以将评论附加到多个点:

enter image description here

那么,我们如何解决这个问题?

方法1(多个fks)

我们可以存储多个这样的外键:

enter image description here

虽然这适用于MySQL,但一般来说这是一个糟糕的方法,因为外键不应包含NULL值。

方法2(抽象)

让我们抽象一篇文章&博客文章:

enter image description here

虽然这似乎是一种更好的方法,但它取决于性能成本。 使用ORM 我们必须抓取很多内容:

我们想要选择article.id。因此,我们必须提取global_id。由于global_id 应该是单向的,我们必须同时获取articleblog post,以便为global_id ORM实体提供水合。 而不是一个简单的

SELECT id FROM article

我们提出:

SELECT global_id.id, article.*, blog_post.* FROM article JOIN global_id ON global_id.id = article.global_id JOIN blog_post ON blog_post.global_id = global_id

至少这是使用教义时会发生的事情,它会立即保持一对一/一对多的关联。

当然,我们可以破解我们的方式并为我们的articleblog_post实体使用两个字段:

protected int id; protected foreign_key global_id;

但事情变得非常混乱,特别是如果我们有一个UnitOfWork和类似的东西,所以这根本不是一个好的解决方案。

问题

那么,我们如何快速,高效,美观地完成这项工作?或者是解决方案吗?

2 个答案:

答案 0 :(得分:0)

我认为最干净的方法是按类型分隔评论。我的意思是创造

  • article_comment
  • blog_comment

表。

答案 1 :(得分:0)

您可以将表创建为:
评论表

- id (PK AU)  
- user_id (int)  
- type_id (int)
- type (enum ['article','blog']  
- content (varchar)

此结构可帮助您检索/更新数据到表中。