我有一个实体表。例如,我们称它们为Vehicles
: Car
, Boat
, Motercycle
, 等。
理想情况下,我希望将所有实体放在一个Vehicles
表中,因为许多相关表(VehicleRatings
、VehicleComments
、VehicleHistory
等)将应用于任何实体,而不仅仅是其中一个。
但是一些实体有一些不与其他实体类型共享的单独属性。现在,一个实体只有 1 个额外属性,另一个实体有 2 个。我预计以后可能会发现更多,但总体而言并不多。
我怎么知道什么时候最好为每个实体类型创建一个子表来存储这些单独的属性,而不是仅仅在父Vehicles
表中添加一个额外的列?我可以问自己任何问题来帮助确定这个答案吗?
我希望主要优化查询性能,其次是易于维护。
从逻辑 ERD 的角度来看,合适的设计显然是实体超类型/子类型模式。您正在努力解决的是如何从物理角度实现这一点。
像许多数据建模问题一样,没有硬性规定。你正在寻求妥协。您是否希望应用程序逻辑和查询(超类型/子类型)更加复杂,或者您是否希望您的应用程序逻辑可能无法正确执行您的约束以及合并表中的Car
vehicle
记录可能会获得非空值的风险列中的值anchor_weight
?在决定如何权衡这些替代方案时,您应该考虑的事项有:
归根结底,您将根据对您最重要的事情做出实际决定。无论您决定什么,都会有利有弊 - 但它们将是您的利弊。
您可能想研究两种技术:类表继承和共享主键。这两种技术具有在 SO 中描述它们的标签。
通过将这两种技术应用到您的案例中,您最终可能会得到一个比您建议的更简单但更强大的设计。在某些情况下,您可以完全放弃 TypeID,因为通用表和适当的专用表之间的连接将精确地产生您正在寻找的对象。另外,因为连接是在两个主键上,所以连接会比较快。