我有一个项目清单。这些物品中的大部分都没有库存。item 表有 id、name、description。项目的数量存储在另一个名为 inventory 的表中。库存表具有 item_id 和库存商品的数量。
我需要库存表的主键吗?如果是这样,我应该使用串行密钥还是复合密钥?表什么时候可以没有主键?
编辑:谢谢大家提供的非常丰富的信息。除了极少数例外,我现在将始终拥有主键。我还学到了更多关于串行键和复合键的知识。
我有一个项目清单。这些物品中的大部分都没有库存。item 表有 id、name、description。项目的数量存储在另一个名为 inventory 的表中。库存表具有 item_id 和库存商品的数量。
我需要库存表的主键吗?如果是这样,我应该使用串行密钥还是复合密钥?表什么时候可以没有主键?
编辑:谢谢大家提供的非常丰富的信息。除了极少数例外,我现在将始终拥有主键。我还学到了更多关于串行键和复合键的知识。
始终以拥有主键为目标。
如果您不确定,请使用主键。
即使你 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
和这里:
我应该使用复合主键吗?
在你的例子中,我肯定会有一个。
“不”拥有一个的决定应该基于非常明确的需求和理解以及拥有一个的实际或预测(例如数量)问题。
调试和故障排除时出现了这种需求的一个很好的例子。就像在每个表中创建和更新列(我最喜欢的另一个)一样,此信息最初可能不会被前端使用/用于前端,但男孩可以帮助跟踪和解决问题。(顺便说一句,更新戳现在通常在像Ruby On Rails这样的框架中是标准的,它也适用于每个表都有一个id
字段的约定!)
我需要库存表的主键吗?
我们可以假设数据是相关的吗?根据定义,关系没有重复的元组。SQL 允许表中有重复的行。因此,为了确保在实践中没有重复行,每个表都应该至少有一个唯一约束。长话短说,您最好有充分的理由不对表中的每个候选键设置唯一约束。根据定义,可以将零个或一个候选键指定为“主键”,而哪个(如果有)应该接收此指定是任意的。
我应该使用串行密钥还是复合密钥?
我认为这是一个错字。单列键称为“简单键”而不是“序列键”。根据您的描述,您的 Inventory 表有一个唯一的候选候选键 on item_ID which is a simple key
。唯一可能的复合键是超键,除非它被外键引用,否则不应使用唯一约束来约束。
表什么时候可以没有主键?
当所有候选键都已使用约束进行UNIQUE
约束或表不打算保存关系数据时。
一般来说:每张桌子都应该有一个PK。至少每个表都应该有一些 CLUSTER 索引。PK 不能是一个特殊的列,但是在系统 (RDBMS) 中没有唯一标识的行不是好的做法。
可能有几种情况不需要 PK,但这是规则中的例外。
如果 item_id 在库存表中是唯一的,我会说您可以使用它作为标识符。主键通常用于唯一标识一行,但我可以看到,在您的情况下,库存行标识没有用处。
编辑:正如其他人所指出的那样,通常如果您没有充分的理由使用主键,您会很好地查看您的表结构以查看是否可以将其与另一个表合并,在这种情况下可能是项目桌子。我可以看到这不是一个选项的情况(例如,您不能更改架构,只需添加新表)但值得一看。
如果每个项目只有一个库存行 - 那么它会在同一个项目表中便宜得多(平均 CPU 和 IO),
如果不是 - 这取决于。而且它根本不是标准化数据
但据我了解这个问题,如果您坚持使用两个表 - 是的,最好在 item_id 字段上建立索引