3

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

我当前的解决方案是一个名为“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”等。这使“评论”表保持干净,但同样,这将使我的数据库中的表数量几乎翻倍。如果我添加另一个应该与其他表相关的表怎么办?这不成比例。

一个理想的解决方案是我目前正在使用的解决方案,但不知何故增强了我的外键功能。

总结的问题:

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

4

2 回答 2

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

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

于 2013-04-12T23:03:57.450 回答
0

规范化与非规范化。

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

  • 每个表 1 个注释表,使用 FK 引用
  • 优点:又快又干净
  • 缺点:桌子维护可能吗?很多桌子。但是有一个好的发电机应该没问题。你决定。

非规范化:(部分元建模)

  • 1 个表commentable_object: id, name(task/project/user..expandable in 1 insert。这是您定义接受评论的对象类型的表。体积很小,只有几个插入,因为它包括线性化您的旧 DDL )
  • 1 个表commentable_object_instance: id, object_name(task/project/user), otherpropsofyourchoice- 这是您的实际任务、用户等的表。
  • 1 个表comment: id, text, # id_commentable_object_instance(fk to previous table)
  • 优点:在主commentable_object表中插入一个,您就完成了模型升级
  • 缺点:性能低于标准化模型
于 2013-04-12T23:05:19.717 回答