SQL主键 - 是否有必要?
我有一个项目列表。大多数这些项目将不会有货。项目表具有ID,名称,说明。物料的数量存储在名为库存的另一个表中。库存表具有item_id和库存物料的数量。SQL主键 - 是否有必要?
我是否需要库存表的主键?如果是这样,我应该使用串行密钥还是复合密钥?什么时候表可以没有主键?
编辑:谢谢大家的信息丰富。除了非常罕见的例外,我现在总是有主键。我还学习了更多关于串口和复合键的知识。
始终瞄准拥有主键。
如果你不确定,有一个主键。
即使你99.99%确定你不需要它,有一个。我通过多年的经验了解到需求的变化。
我真正能想到的唯一例子是多对多的表,只有两个foreign_keys和巨大(数亿行)的表,每个字节都是有效的。但即便如此,仍然强烈建议使用单独的,独特的无业务价值ID密钥。
有这方面的一些更伟大的信息在这里:
http://weblogs.sqlteam.com/jeffs/archive/2007/08/23/composite_primary_keys.aspx
这里:
http://www.techrepublic.com/article/the-great-primary-key-debate/1045050
这里:
http://databases.aspfaq.com/database/what-should-i-choose-for-my-primary-key.html
这里:
Should I use composite primary keys or not?
在你的榜样,我肯定会有一个。
“不”的决定应该基于非常明确的需求和理解以及实际或预测(例如数量)具有问题的问题。
调试和故障排除时会出现这种需求的一个很好的例子。就像创建和更新每个表中的列(我的另一个最爱)一样,此信息最初可能不会用于/前端,但男孩可以帮助追踪和解决问题。 (顺便说一句更新的邮票往往是现在这个样子Ruby on Rails的这也与具有id
场的每个表的惯例运作良好的框架标准!)
'我真正能想到的唯一例子是多对多的表,只有两个foreign_keys'--为什么不把这两个外键变成复合主键呢? – gldraphael 2017-01-12 01:50:27
如果每个项目只有一个盘点行 - 那么它会便宜很多(均值 - CPU和IO),这将是在同一个项目表,
如果没有 - 它依赖。而且它不会在所有
归一化数据,但据我了解这个问题,如果你两个表坚持 - 是的,它能够更好地对ITEM_ID场
我仍然在研究是否应该将两个表合并在一起,有些事情感觉不对。感觉每个表格中描述的实体是相似的,但不完全相同。 – deadghost 2012-01-08 13:41:51
两张桌子只有在您有类似物品以其独立价格交付的情况下才有理由,否则您可以轻松地将它们合并在一起 – 2012-01-08 13:44:36
嗯,好吧,您的积分已被拍摄。我会将它们合并在一起。我已经断定数量属于项目实体。我的推理是项目表描述了每一行中的一个项目,并且该数量仍在描述该项目。也许我会将表格重命名为Items,因为每行描述的项目不仅仅是单个项目...或者不是,因为1项目非常愚蠢。 – deadghost 2012-01-08 13:54:48
指数一般:每张桌子都应该有一个PK。至少每个表都应该有一些CLUSTER索引。 PK不能是一个特殊的列,但是在系统(RDBMS)中没有唯一标识的行不是很好的做法。
可能有几种情况下不需要PK,但这是规则中的例外。
聚集索引是索引的物理实现细节,与是否需要PK的问题完全无关。此外:并非每个DBMS *都有*聚簇索引 – 2012-01-08 12:43:16
a_horse_with_no_name:如果DBMS没有用户定义的集群索引,那么DBMS有一些自己的内部方式,如何布线数据。当然 - 如果你的数据库管理系统是这种情况,请忽略我关于该数据库系统的CLUSTER的说明:)。 – TcKs 2012-01-08 13:30:33
如果item_id在库存表中是唯一的,我会说你用它作为标识符是很好的。主键通常用于唯一标识一条线,但您可以看到您的情况下的库存线标识没有用处。
编辑:正如其他人已经指出,通常如果你没有一个主键的好理由,你会很满意地看着你的表结构,看看你是否可以将它与另一个表合并,在这案件可能是项目表。我可以看到这种情况不是一种选择(例如,您不能更改模式,只需添加新表),但值得一看。
我需要的库存表的主键?
我们可以假设数据是关系型的吗?根据定义,关系没有重复的元组。 SQL允许在表中存在重复行。因此,为确保实践中不存在重复行,每个表至少应有一个唯一约束。长话短说,最好有一个很好的理由,不要在表中的每个候选键上设置唯一的约束。根据定义,零个或一个候选键可以被指定为“主要”,并且哪一个(如果有的话)应该接收该指定是任意的。
我应该使用串行密钥还是复合密钥?
我认为这是一个错字。单列键被称为“简单键”而不是“序列键”。根据您的描述,您的库存表在item_ID which is a simple key
上仅有一个候选人候选人密钥。唯一可能的组合键是超级键,除非它被外键引用,否则不应该使用唯一约束来约束。
什么时候表可以没有主键?
当所有候选键已被限制使用UNIQUE
约束或当表不打算保存关系数据。
** ANY **实数据表需要一个主键 - 这是唯一标识表中每一行的方法。为什么你会**没有**想要一个PK超越了我.....在表上没有主键的唯一情况可能是临时表来批量加载数据或类似的东西。 .. – 2012-01-08 12:37:29
@mark_s没有任何问题的联系,但我有私人意见,在非常特殊的情况下,我可以更好地利用堆,比基于PK的表8)让我们去聊天? – 2012-01-08 12:39:11
@mark_s是的,只是批量加载的堆规则8-) – 2012-01-08 12:43:53