Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL-我应该在每个子表上使用多列主键吗? 设置:_Mysql_Database_Database Design_Database Schema_Mysql Management - Fatal编程技术网

MySQL-我应该在每个子表上使用多列主键吗? 设置:

MySQL-我应该在每个子表上使用多列主键吗? 设置:,mysql,database,database-design,database-schema,mysql-management,Mysql,Database,Database Design,Database Schema,Mysql Management,当我在stackexchange上找到这篇很棒的文章时,我正试图理解身份关系和非身份关系之间的区别 在读了一些评论之后,我想起了另一个关于我一直遇到的问题 问题: 我应该在每个子表上使用多列主键吗?这样做的优点/缺点是什么 为了更好地说明我的问题,我在下面创建了一个示例。我还包括了引起我问这个问题的评论 例子: 在我的情况下,我知道建筑id,我需要bed.data #1-我当前的数据库结构: TABLE { FIELDS } ---------------------------------

当我在stackexchange上找到这篇很棒的文章时,我正试图理解身份关系和非身份关系之间的区别

在读了一些评论之后,我想起了另一个关于我一直遇到的问题


问题: 我应该在每个子表上使用多列主键吗?这样做的优点/缺点是什么

为了更好地说明我的问题,我在下面创建了一个示例。我还包括了引起我问这个问题的评论


例子: 在我的情况下,我知道
建筑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 }
这张桌子不错(好主意)

  • 在第一个(良好)表中,没有不需要的重复数据
  • 第一个表中的插入速度会快得多
  • 第一个表将更容易放入内存,从而加快查询速度
  • InnoDB的优化考虑的是模型A,而不是模型B
  • 后一个(坏)表有重复的数据,如果数据不同步,您将陷入混乱。由于数据只列出一次,数据库A不可能很难失去同步
  • 如果我想合并来自建筑物、地板、房间和床的数据,我需要合并模型A和模型B中的所有四个表,您如何在这里节省时间
  • InnoDB将索引数据存储在自己的文件中,如果
    仅选择索引
    将永远无法访问表本身。那你为什么要复制索引呢?无论如何,MySQL都不需要读取主表
  • InnoDB将PK存储在每个二级索引中,使用一个复合的长PK,您会减慢每个使用索引的选择并保留文件大小;没有任何收获
  • 你有严重的速度问题吗?如果没有,您是否正在对表进行非规范化
  • 甚至不要考虑使用MyISAM,因为MyISAM受这些问题的影响较小,它没有针对多连接数据库进行优化,不支持引用完整性或事务,与此工作负载不匹配
  • 当使用复合键时,您只能使用键的最右边部分,即,除了使用
    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 }
    
    这张桌子不错(好主意)

  • 在第一个(良好)表中,没有不需要的重复数据
  • 第一个表中的插入速度会快得多
  • 第一个表将更容易放入内存,从而加快查询速度
  • InnoDB的优化考虑的是模型A,而不是模型B
  • 后一个(坏)表有重复的数据,如果数据不同步,则会造成混乱。由于数据只列出一次,DB a不可能更难不同步
  • 如果我想合并来自建筑物、地板、房间和床的数据,我需要合并模型A和模型B中的所有四个表,您如何在这里节省时间
  • InnoDB将索引数据存储在自己的文件中,如果
    选择“仅索引”
    ,表本身将永远不会被访问。那么为什么要复制索引呢?MySQL无论如何都不需要读取主表
  • InnoDB将PK存储在每个二级索引中,使用一个复合的长PK,您会减慢每个使用索引的选择,并保留文件大小;但没有任何好处
  • 你有严重的速度问题吗?如果没有,你是你的表去规范化
  • 甚至不要考虑使用MyISAM,这会让我感到痛苦