【发布时间】:2017-04-26 01:30:05
【问题描述】:
当两个表具有多对多关系或当一个表与其自身具有多对多关系时,我们可以使用联结表对其进行建模。
但是关系的类型可以超出原始类型,例如:
要求:我们有用户。每个用户可以有 0 个或多个其他用户作为朋友
解决方案:一个用户表和一个名为“user_user”的联结表。
然后我们发现了一个新要求:一些友谊是浪漫的,或者换句话说,两个用户可以以不同于友谊的方式联系。
解决方案 a:在联结表中添加一列,其中包含友谊类型(朋友 | 合作伙伴 | 前朋友)等。
解决方案 b:将 'user_user' 表重命名为 'friendships'(用这种方法开头会是一个更好的名称)并创建一个名为romass 的新表,同时将用户连接到用户。
然后我们发现另一个新要求:用户可以欠其他用户的钱。同样,我们可以搭载同一个连接表或创建一个名为“债务”的新连接表。这次我的直觉是 100% 有一个单独的表。
每次我们发现一种新的关系类型或已知关系的子类型时,我们都可以向一个联结表添加一列或创建一个新的联结表。
我的问题是,决定何时必须创建新表的好规则是什么?
是不是每个有序对必须有不止一行?例如,如果过去的关系从未被删除,那么如果两个用户在过去两年中成为朋友,失去联系,然后重新成为朋友,我们希望旧行也有开始和结束日期,但有两行使其他列信息重复(旧行显示用户欠钱,新行没有)。
是不是当额外的列在逻辑上不是单一类型关系的定义时?
OK:友谊的开始日期与友谊1对1直接相关
不好:一个用户拥有另一个用户多少钱的列可以是一对一的关系,但逻辑上不是对友谊的描述。
如果我们提前知道两张表会有很多多对多的关系,是不是要计划很多联结表,还是制作一个更灵活的联结表(即使类型连接不是任意的)?
【问题讨论】:
标签: database-design relational-database data-modeling database-normalization