基于另一个 ID 的 ID 扩展 table
Extension of an ID based off the ID of another table
我有两张桌子。订单和托盘。每个订单可以有多个托盘。我想弄清楚是否可以使 PalletID 成为 OrderID 的扩展。例如,OrderID 为 8000。当一个托盘被添加到订单中时,palletID 变为 8000-1,当下一个托盘被添加到订单中时,palletID 变为 8000-2,依此类推。
这可能吗?
是的,这是可能的。
根据第一范式的原则,你不应该用复合属性来做这个(例如“8000-1”,没有RDBMS可以与之建立关系)但是有两个属性(例如“8000”和“1”)一起构成 composite primary key:
Pallet
-------------------------
PK orderID int NOT NULL
PK palletNR int NOT NULL
在这种情况下 palletNR
只需要在同一个 OrderID
中是唯一的。
在 ER 术语中,Pallet
将是 weak entity。
是否合意?
关于whether composite primary keys are good or bad, or to use surrogate key vs. a natural key(复合与否)的争论很频繁。但最终的问题是它是否符合您的目的。
轻松阅读每个托盘的顺序和序列号对人类读者来说是一个优势。但在托盘通过条形码或RFID追踪的时代,它真的不再是决定性的信息。
此外,如果您在复合主键中使用 orderID
,则在没有订单的情况下无法注册托盘。您不能仅仅重复使用进货托盘来交付出货订单;您无法提前准备托盘进行批量交付;如果您使用托盘在仓库之间移动库存,您也会被搞砸的。
这就是为什么我的个人建议是避免它:代理人自治 PalletID
是处理它的最灵活的方法。如果客户真的坚持在标签上使用订单号和序列号,您可以轻松地将它们作为可选的托盘数据,并为即将出货的托盘计算它们——不是作为关键,而是为了礼貌地将它们打印在标签上;-)
这可能吗?
是的,这是可能的。
根据第一范式的原则,你不应该用复合属性来做这个(例如“8000-1”,没有RDBMS可以与之建立关系)但是有两个属性(例如“8000”和“1”)一起构成 composite primary key:
Pallet
-------------------------
PK orderID int NOT NULL
PK palletNR int NOT NULL
在这种情况下 palletNR
只需要在同一个 OrderID
中是唯一的。
在 ER 术语中,Pallet
将是 weak entity。
是否合意?
关于whether composite primary keys are good or bad, or to use surrogate key vs. a natural key(复合与否)的争论很频繁。但最终的问题是它是否符合您的目的。
轻松阅读每个托盘的顺序和序列号对人类读者来说是一个优势。但在托盘通过条形码或RFID追踪的时代,它真的不再是决定性的信息。
此外,如果您在复合主键中使用 orderID
,则在没有订单的情况下无法注册托盘。您不能仅仅重复使用进货托盘来交付出货订单;您无法提前准备托盘进行批量交付;如果您使用托盘在仓库之间移动库存,您也会被搞砸的。
这就是为什么我的个人建议是避免它:代理人自治 PalletID
是处理它的最灵活的方法。如果客户真的坚持在标签上使用订单号和序列号,您可以轻松地将它们作为可选的托盘数据,并为即将出货的托盘计算它们——不是作为关键,而是为了礼貌地将它们打印在标签上;-)