设置:
当我在stackexchange上找到这篇伟大的文章时,我正试图理解标识关系和非标识关系之间的区别。What's the difference between identifying and non-identifying relationships?
在读了几句评论后,我想起了另一个关于我所遇到的问题的问题。
问题:
我应该在每个子表上使用多列主键吗?这样做的优缺点是什么?
为了更好地说明我的问题,我创建了下面的一个例子。我还包括了引起我提出这个问题的意见。
示例:
在我的情况下,我知道building_id,我需要得到bed.data。
#1 -我当前的DB结构:
TABLE { FIELDS }
-----------------------------------------------------------------------
building { id, data } 
floor { id, building_id, data }
room {id, floor_id, data }
bed {id, room_id, data }这种类型的表结构需要我使用几个联接来获取我需要的数据。没什么大不了的,但我经常遇到这种情况,所以有点痛苦。
#2 -我对Bill建议的DB结构的解释(见下面的文章注释):
TABLE { FIELDS }
-----------------------------------------------------------------------
building { id, data } 
floor { id, building_id, data }
room {id, building_id, floor_id, data }
bed {id, building_id, floor_id, room_id, data }这个表结构似乎消除了在我的情况下加入的需要。那么这个表结构的缺点是什么呢?我真的很喜欢不做这么多联合声明的想法。
来自条款的评论:
What's the difference between identifying and non-identifying relationships?
@hobodave:这是“约定高于配置”的论点。有些学派认为,每个表都应该为一个名为id的单列伪键定义其主键,该id自动生成它的值。Rails等应用程序框架已经将其推广为默认设置。他们将自然键和多列键视为与使用“遗留”数据库时所需的约定不同的键。许多其他框架也遵循了这一思路。-比尔·卡温( Bill Karwin ),3月10日23:06
似乎“正确地”构建标识关系会导致巨大的主键。楼有地板有房间有床。床的PK为(bed_id,floor_id,room_id,building_id)。奇怪的是,我从来没有在实践中见过这个,也没有听说过它是一种做任何事情的方法。这是PK中的大量冗余数据。-3月10日23:34
@霍博达夫:我见过更大的多列主键。但我接受你的观点。请考虑多列主键传递更多信息;您可以在不进行任何连接的情况下查询特定建筑物中所有床位的床表。-比尔·卡温(BillKarwinMar11 '10 ) 1:00
发布于 2011-09-08 20:52:59
这些数据是标准化的。
TABLE { FIELDS }
-----------------------------------------------------------------------
building { id, data } 
floor { id, building_id, data }
room {id, floor_id, data }
bed {id, room_id, data }这张桌子不错(好主意)
TABLE { FIELDS }
-----------------------------------------------------------------------
building { id, data } 
floor { id, building_id, data }
room {id, building_id, floor_id, data }
bed {id, building_id, floor_id, room_id, data }在第一个(好的)表中,
select floor_id的匹配很差--您只能使用键的最右边的部分,也就是说,除了使用id+building_id+floor_id之外,不能在表bed中使用floor_id,这意味着您可能必须使用比模型A中需要的更多的密钥空间,或者您需要添加一个额外的索引(这将拖曳PK的完整副本)。In
我看到了绝对零的好处和许多缺点,在模式B,永远不要使用它!
https://stackoverflow.com/questions/7354271
复制相似问题