如何以可扩展的方式使一个MySQL表与任何其他表相关?

时间:2013-04-12 22:47:37

标签: mysql

我有一张名为“评论”的表格。我希望表能够与数据库中的任何其他表相关联。例如,假设我有“用户”,“项目”和“任务”表。我希望能够将注释与任何表中的任何行相关联。

我当前的解决方案是一个名为“comments_relations”的表,它有4列:“id”,“comment_id”,“foreign_table”和“foreign_table_id”。这很好用,但是有一个严重的问题:“comments”表不是实际上与任何其他表相关,所以我没有得到外键的任何优点。当项目被删除时,我希望删除所有相关的注释,对于用户和任务以及我添加的任何未来表都是如此。

凭借我的经验,我只能想象两个真实的解决方案(在我看来都很糟糕):

  1. 为每个相关表的“comments”表添加一个可空列,例如“user_id”,“project_id”和“task_id”。我可以在所有这些列上定义外键并获得我想要的行为。但是,当我有10张表需要评论的那一天呢?然后是20?我不认为这是一个非常可扩展的解决方案。
  2. 为每个相关表添加另一个表,例如“users_comments”,“projects_comments”等将每个表链接到注释表。这使“注释”表保持干净,但同样,这将使我的数据库中的表数量几乎翻倍。如果我添加另一个表应该与其他表相关联怎么办?这不会缩放。
  3. 理想的解决方案是我正在使用的解决方案,但不知何故增压以授予我外键的功能。

    总结的问题:

    定义可与其他表的任何数量相关的表的最具扩展性的方法是什么?

2 个答案:

答案 0 :(得分:0)

大声思考并假设您想维护1个评论表,但是如何为每个表分配ID。像这样:

ID  |  table_name
-----------------
 1  |  users
 2  |  projects
 3  |  tasks

然后在您的注释表中,您只有一个表ID列,然后是用户/项目/任务数据的特定行ID:

ID  |  table_id  |  data_id  |  comment
---------------------------------------------------
 1  |     1      |    468    |  yadda yadda yadda
 2  |     2      |    915    |  yadda yadda yadda
 3  |     1      |    195    |  yadda yadda yadda
 4  |     3      |    731    |  yadda yadda yadda
 5  |     1      |     5     |  yadda yadda yadda

设置初始关联表会有一些开销,但我不认为这很糟糕,因为表的添加/删除往往不是动态的。

答案 1 :(得分:0)

normalize vs denormalise。

正常化:基本上你说了一切。

  • 每个表的评论表,使用FK参考
  • 专业人士:快速而​​干净
  • 缺点:表维护可能吗?很多桌子。但是有了一个好的发电机,它应该没问题。你决定。

反规范:(部分元模型化)

  • 1 table commentable_objectidname(task / project / user..expandable in 1 insert。这是您定义接受注释的对象类型的表。音量很低,只有一些插入,因为它包含线性化旧的DDL)
  • 1表commentable_object_instanceidobject_name(任务/项目/用户),otherpropsofyourchoice - 这是您的实际任务,用户等的表格。
  • 1个表格commentidtext,#id_commentable_object_instance(fk到上一个表格)
  • 专业人员:在主commentable_object表中插入一个,您已完成模型升级
  • 缺点:表现低于标准化模型