MySQL:多个表的注释
Posted
技术标签:
【中文标题】MySQL:多个表的注释【英文标题】:MySQL: Comments for multiple tables 【发布时间】: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 之类的东西,所以这根本不是一个好的解决方案。
问题
那么,我们如何快速、高效、美观地做到这一点?或者那里有解决方案?
【问题讨论】:
【参考方案1】:我认为最简洁的方法是按类型分隔 cmets。我的意思是创造
article_comment blog_comment 等表格。
【讨论】:
绝对不是。假设您想在评论中添加“时间戳”。虽然这在您的业务逻辑中很容易,但在您的数据库中会很痛苦(修改 10 多个表)。 一般来说你是对的。而且我认为没有通用的解决方案。这取决于要求。否则,您可能只需要为一种数据引入时间戳...... 当然,但我仍然认为这不是要走的路。假设我们不仅想要“cmets”,还想要“投票”(在文章、博客文章和 cmets 上)。您必须创建多个评论表(article_comment、blog_comment)和多个投票表(article_vote、blog_vote、blog_comment_vote、article_comment_vote),因为该结构完全缺乏抽象。 嗯。我错过了你问的问题......可能如果你有这种限制,那么这种方法不适合你...... 只是想指出,这种方法无法进行缩放。但是感谢您的贡献:)【参考方案2】:您可以将表创建为: 评论表
- id (PK AU)
- user_id (int)
- type_id (int)
- type (enum ['article','blog']
- content (varchar)
此结构可帮助您将数据检索/更新到表中。
【讨论】:
我没有看到外键? 谢谢 :) 但是,我不确定性能会更好(因为你没有使用 fks),我不确定这是否可以无缝地与 ORM 一起使用(因为再次,没有 fks) .检索$article->getComments()
将是一个巨大的痛苦。
@machete:我不认为检索会很痛苦,因为您将添加 coditioins 作为您想要检索的评论类型,例如文章、博客等。
使用自定义 ORM 是的,但是 ORM 关联概念本身并不是用来处理这样的事情(我认为)。以上是关于MySQL:多个表的注释的主要内容,如果未能解决你的问题,请参考以下文章