我有一张名为“评论”的表格。我希望表能够与数据库中的任何其他表相关联。例如,假设我有“用户”,“项目”和“任务”表。我希望能够将注释与任何表中的任何行相关联。
我当前的解决方案是一个名为“comments_relations”的表,它有4列:“id”,“comment_id”,“foreign_table”和“foreign_table_id”。这很好用,但是有一个严重的问题:“comments”表不是实际上与任何其他表相关,所以我没有得到外键的任何优点。当项目被删除时,我希望删除所有相关的注释,对于用户和任务以及我添加的任何未来表都是如此。
凭借我的经验,我只能想象两个真实的解决方案(在我看来都很糟糕):
理想的解决方案是我正在使用的解决方案,但不知何故增压以授予我外键的功能。
定义可与其他表的任何数量相关的表的最具扩展性的方法是什么?
答案 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。
正常化:基本上你说了一切。
反规范:(部分元模型化)
commentable_object
:id
,name
(task / project / user..expandable in 1 insert。这是您定义接受注释的对象类型的表。音量很低,只有一些插入,因为它包含线性化旧的DDL)commentable_object_instance
:id
,object_name
(任务/项目/用户),otherpropsofyourchoice
- 这是您的实际任务,用户等的表格。comment
:id
,text
,#id_commentable_object_instance
(fk到上一个表格)commentable_object
表中插入一个,您已完成模型升级