如果我有类似于此的架构:
TABLE 1
id
column
other_column
etc
TABLE 2
id
table1_id
some_other_table_id
添加第三个表是个好主意:
TABLE 3
id
table2_id
row_from_another_table_id
修改
为了使事情更清楚,请考虑这样的架构:
EVENTS
id
name
other_stuff
RANGES
id
time_from
time_to
max_people
etc
EVENTS_PLACES
id
event_id
place_id
我想要做的是定义一个事件的时间范围。但是特定位置(EVENTS_PLACES
)中的特定事件可以“覆盖”此范围。事件也可以有多个范围。
我希望现在这个问题能够更加明确。
答案 0 :(得分:2)
我一直认为多对多关系是违规Boyce-Codd Normal Form,因此违反了良好的关系数据库架构。
因此,将数据与链接表相关联实际上是实现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
属性中。
这是Database Normalization的问题,一般来说,数据越规范越好。但是,当性能受到关注时,有一种妥协的情况,如果所需的数据以输出格式存储,它确实使选择查询更简单,更快,尽管更新可能是地狱。
我会通过建议,通过Materialized Views以及Materialized Views上的不同内容,建议你可以充分利用两个世界,从而抵制妥协的理由。完全标准化数据的可维护性与性能的速度。虽然,确实需要一些技巧和考虑才能使架构正确。
答案 1 :(得分:1)
因此,您在具有属性的两个表之间存在关系,并且您具有该关系的子类以及更多属性。这种情况很少见,但可能。
假设在您的一夫多妻异性交友网站中,一个或多个女性实体与一个或多个男性有关系。这两个表可以与联结表,关系相结合。现在他们中的一些已婚,你认为这是一种特殊的关系。所以Marriage是Relationship的子类,Marriage表引用了Relationship表中的id。
当然,以另一种方式解决这种情况可能更简单,例如简单地在男人和女人之间有两个联结表。但是在某种情况下,您可能希望扩展联结表中的关系。
答案 2 :(得分:0)
另一种选择是向TABLE2添加一列,描述“事物”之间连接的性质。例如,PERSON表和RELATIONSHIPS表,您在第一个表中为“对象”建模,然后在秒中为“链接”建模,例如
+---------+---------+-------+--------+
| link_id | from_id | to_id | type |
+---------+---------+-------+--------+
| 1 | 2 | 3 | Mother |
| 2 | 8 | 3 | Sister |
+---------+---------+-------+--------+
使用适当的索引,这意味着您可以执行诸如查找给定人员的所有关系或查找拥有姐妹的所有人等事情。这是一个简单的示例,但是当from_id和to_id可以时,它开始变得有趣是不同类型的对象,即不只是人。
过去我使用这种方法时,使用的是非常通用的模式,该模式汇集了来自各种其他来源的数据,并且必须具有灵活性。显然,在灵活性和例如灵活性之间存在权衡。速度,查询复杂性。你必须决定它是否对你的情况有用。