我一直认为多对多关系违反了Boyce-Codd 范式,因此违反了良好的关系数据库模式。
因此,事实上,将数据与链接表相关联是实现 BCNF 所必需的,因此是好的。如果避免数据更新异常是好的。
转到您提供的特定模式示例。我认为您想要这些逻辑表(或实体),
-----------------------
EventClass
-----------------------
Id
Name
... Other attributes common to every instance
-
-----------------------
TimeSlot
-----------------------
Id
Start
End
-
-----------------------
Place
-----------------------
Id
Name
Address
MaxAttendance
... etc
-
----------------------
EventInstance
-----------------------
Id
EventClassId
TimeSlotId
PlaceId
PresenterName
...Other attributes specific to the instance
EventInstance
是 和 之间的关系,EventClass
任何特定于 的属性都应该存储在该实体上。相关事件组共有的任何属性都应存储在该属性上。TimeSlot
Place
EventInstance
EventClass
这都是数据库规范化的问题,一般来说,数据越规范化越好。然而,当性能受到关注时,存在妥协的情况,如果所需的数据以输出格式存储,它确实使选择查询更简单、更快,尽管更新可能是地狱。
我会建议通过正确的 Indecies、Materialized Views和 Indecies on Materialized Views来抵消妥协的情况,您可以获得两全其美的效果。完全规范化数据的可维护性与性能速度。虽然,它确实需要一些技巧和考虑才能使架构正确。