【发布时间】:2019-11-05 16:43:45
【问题描述】:
我正在研究具有某些类型(例如User、Appointment、Task 等)的数据库,这些类型可以有零个或多个 Notes 与每种类型相关联。
我遇到的实现这些关系的可能解决方案是:
- 多态关系
- 每种类型的单独表格
多态关系
许多人认为这是最容易实现的解决方案,并且似乎是遵循 Active Record 模式的框架最常见的实现,我将添加一个数据为 morphable 的表:
我的notable_type 可以让我区分Note 所涉及的类型(User、Appointment、Task),而notable_id 可以让我获得个人type记录在相关的type 表中。
优点:
- 易于扩展,可轻松将更多模型与多态类关联
- 限制表膨胀
- 一个类可以被许多其他类使用 (DRY)
缺点
- 随着数据的增长,更多类型会使查询变得更加困难和昂贵
- 不能有外键
- 缺乏数据一致性
每种类型的单独表格
或者,我可以为每种类型创建一个表,该表只负责与该类型关联的Notes。 type_id 外键可以让我快速获取个人 type 记录。
许多在线认为是代码异味,许多文章提倡避免多态关系以支持替代方案(例如here 和here)。
优点:
- 允许我们有效地使用外键
- 高效的数据查询
- 保持数据一致性
缺点:
- 增加表膨胀,因为每种类型都需要单独的表
- 产生多个类,每个类代表单独的
type_notes表
想法
多态关系当然是这两个选项中实现起来更简单的一个,但缺少外键约束以及因此可能出现的一致性问题让人感觉不对。
每个带有外键的notes 关系(user_notes、task_notes 等)的表似乎是正确的方法(与设计模式保持一致)但可能会导致很多表(添加其他 types可以有notes 或添加类似于notes 的类型[例如events])。
感觉我的选择是要么简化表结构但放弃外键并增加查询开销,要么增加具有相同结构的表数量但简化查询并允许外键。
根据我的情况,以上哪种情况更合适,或者我应该考虑其他替代方案吗?
【问题讨论】:
标签: mysql laravel database-design database-schema polymorphic-associations