假设我正在设计亚马逊等产品的在线销售商的数据库数据模型,我有几个选择:
在OrderLine中插入行时,要确定每个OrderLineID:
select max(OrderLineID) + 1
from OrderDetail
where OrderID={OrderID}
OrderLineID将包含很好的简单小数字,每行都有很好的编号:
OrderID OrderLineID
------- -----------
100 1
100 2
100 3
etc
选项2:设置列OrderLineID自动增量,而不是选择max()+ 1。
优点 - 无需选择max()+ 1
缺点 - OrderLineID不会有漂亮的小行号,即1,2,3,4等,OrderLineID将有非常大的数字。
选项3:将OrderLineID移至第一列
哪个是最好的数据模型?
答案 0 :(得分:2)
如果订单行中的相同产品无效,则:
OrderLineID
列是多余的,您可以使用{OrderID , ProductID }
的组合作为OrderLine表的pk
如果您想使用代理标识符列,让OrderLineID
具有增量值,作为唯一的PK列,您可以考虑将{OrderID , ProductID }
作为唯一键约束。
答案 1 :(得分:0)
您最好的选择是使用自动增量。或者甚至更好,使用1序列填充数据库中每个表中的每个唯一ID。
为什么呢?将记录插入表中时,您不希望查询表以查找当前ID。这很慢,并且当少数进程尝试同时插入所有进程时最终会出错。序列生成器旨在即使在多用户环境中也能快速返回下一个值。
就个人而言,我喜欢在每个表中使用1个序列生成器作为pk id字段。
真正重要的是每条记录都标有唯一编号。数字是否被跳过并不重要。
确保使用主键/唯一索引强制实现唯一性。