【发布时间】:2013-12-26 11:51:24
【问题描述】:
免责声明:我知道这是一个常见问题,但目前我还没有找到令人满意的答案。
你们中的许多人可能都知道这个问题:我们有一个“评论”表,但我们可以将 cmets 附加到多个点:
那么,我们该如何解决呢?
方法 1(多个 fks)
我们可以像这样存储多个外键:
虽然这适用于 MySQL,但总的来说这是一种不好的方法,因为外键不应包含 NULL 值。
方法 2(抽象)
让我们抽象一下文章和博文:
虽然这似乎是一种更好的方法,但它是以性能为代价的。 使用 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 之类的东西,所以这根本不是一个好的解决方案。
问题
那么,我们如何快速、高效、美观地做到这一点?或者那里有解决方案?
【问题讨论】: