免责声明:我知道这是一个常见的问题,但到目前为止我找不到令人满意的答案。
你们中的许多人可能都知道这个问题:我们有一个“评论”表,但我们可以将评论附加到多个点:
那么,我们如何解决这个问题?
我们可以存储多个这样的外键:
虽然这适用于MySQL,但一般来说这是一个糟糕的方法,因为外键不应包含NULL值。
让我们抽象一篇文章&博客文章:
虽然这似乎是一种更好的方法,但它取决于性能成本。 使用ORM 我们必须抓取很多内容:
我们想要选择article.id
。因此,我们必须提取global_id
。由于global_id
应该是单向的,我们必须同时获取article
和blog 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
至少这是使用教义时会发生的事情,它会立即保持一对一/一对多的关联。
当然,我们可以破解我们的方式并为我们的article
和blog_post
实体使用两个字段:
protected int id;
protected foreign_key global_id;
但事情变得非常混乱,特别是如果我们有一个UnitOfWork和类似的东西,所以这根本不是一个好的解决方案。
那么,我们如何快速,高效,美观地完成这项工作?或者是解决方案吗?
答案 0 :(得分:0)
我认为最干净的方法是按类型分隔评论。我的意思是创造
表。
答案 1 :(得分:0)
您可以将表创建为:
评论表
- id (PK AU)
- user_id (int)
- type_id (int)
- type (enum ['article','blog']
- content (varchar)
此结构可帮助您检索/更新数据到表中。