MySQL-我应该在每个子表上使用多列主键吗? 设置:
当我在stackexchange上找到这篇很棒的文章时,我正试图理解身份关系和非身份关系之间的区别 在读了一些评论之后,我想起了另一个关于我一直遇到的问题MySQL-我应该在每个子表上使用多列主键吗? 设置:,mysql,database,database-design,database-schema,mysql-management,Mysql,Database,Database Design,Database Schema,Mysql Management,当我在stackexchange上找到这篇很棒的文章时,我正试图理解身份关系和非身份关系之间的区别 在读了一些评论之后,我想起了另一个关于我一直遇到的问题 问题: 我应该在每个子表上使用多列主键吗?这样做的优点/缺点是什么 为了更好地说明我的问题,我在下面创建了一个示例。我还包括了引起我问这个问题的评论 例子: 在我的情况下,我知道建筑id,我需要bed.data #1-我当前的数据库结构: TABLE { FIELDS } ---------------------------------
问题: 我应该在每个子表上使用多列主键吗?这样做的优点/缺点是什么 为了更好地说明我的问题,我在下面创建了一个示例。我还包括了引起我问这个问题的评论
例子: 在我的情况下,我知道
建筑id
,我需要bed.data
#1-我当前的数据库结构:
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 }
这种类型的表结构需要使用一些联接来获取所需的数据。这没什么大不了的,但有点痛苦,因为我经常遇到这种情况
#2-我对比尔·卡温建议的DB结构的解释(见下面的文章评论):
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 }
在我的情况下,这种表结构似乎消除了连接的需要。那么这种表结构的缺点是什么呢?我真的很喜欢不做那么多join语句的想法
第条评论: @hobodave:这是“约定优先于配置”的论点。一些学派认为,每个表都应该为自动生成其值的名为id的单列伪键定义其主键。像Rails这样的应用程序框架已经将其作为默认应用程序加以推广。它们将自然键和多列键视为与使用“遗留”数据库时所需的约定不同。许多其他框架也遵循了这一原则比尔·卡温2010年3月10日23:06 似乎“正确”构建识别关系会导致令人讨厌的巨大主键。e、 大楼有地板有房间有床。床的主键为(床号、楼层号、房间号、建筑号)。奇怪的是,我从来没有在实践中看到过这一点,也没有听到有人建议用它来做任何事情。PK中有大量冗余数据霍博达夫3月10日23:34 @hobodave:我见过更大的多列主键。但我同意你的观点。考虑多栏主键传达更多信息;您可以查询特定建筑中所有床位的床位表,而无需进行任何连接比尔·卡温2010年3月11日1:00
这些数据是标准化的
TABLE { FIELDS }
-----------------------------------------------------------------------
building { id, data }
floor { id, building_id, data }
room {id, floor_id, data }
bed {id, room_id, data }
这张桌子不错(好主意)
仅选择索引
,将永远无法访问表本身。那你为什么要复制索引呢?无论如何,MySQL都不需要读取主表李>
id+building\u id+floor\u id
之外,您不能使用表bed
中的floor\u id
,这意味着您可能需要使用比模型a中所需更多的键空间。或者您需要添加额外的索引(这将拖动PK的完整副本)我在模型B中看到了绝对零的好处和大量的缺点,永远不要使用它!此数据是标准化的
TABLE { FIELDS }
-----------------------------------------------------------------------
building { id, data }
floor { id, building_id, data }
room {id, floor_id, data }
bed {id, room_id, data }
这张桌子不错(好主意)
选择“仅索引”
,表本身将永远不会被访问。那么为什么要复制索引呢?MySQL无论如何都不需要读取主表