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应该是单向的,我们必须同时获取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 之类的东西,所以这根本不是一个好的解决方案。

问题

那么,我们如何快速、高效、美观地做到这一点?或者那里有解决方案?

【问题讨论】:

【参考方案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:多个表的注释的主要内容,如果未能解决你的问题,请参考以下文章

mysql怎样加注释

mysql 字段的注释有啥用

mysql添加表注释字段注释查看与修改注释

各种数据库中的sql语句中都怎么加注释

sql 创建表的时候添加 表注释

仅向多个表的主键添加 @NonNull 注释的房间迁移