我有两张桌子。订单和托盘。每个订单可以有多个托盘。我想弄清楚是否可以使 PalletID 成为 OrderID 的扩展。例如,OrderID 为 8000。当将托盘添加到订单时,托盘 ID 变为 8000-1,当将下一个托盘添加到订单时,托盘 ID 变为 8000-2,依此类推。
这可能吗?
根据第一范式原理,您不应该使用复合属性(例如“8000-1”,没有RDBMS可以与之建立关系)而是使用两个属性(例如“8000”和“1”)一起执行此操作制作复合主键:
Pallet
-------------------------
PK orderID int NOT NULL
PK palletNR int NOT NULL
在这种情况下palletNR
需要唯一的只是在同一个OrderID
.
在 ER 行话中,Pallet
将是一个弱实体。
关于复合主键是好还是坏,或者使用代理键与自然键(复合与否) ,经常存在争论。但最终的问题是它是否符合您的目的。
易于阅读每个托盘的顺序和序号对于人类阅读者来说可能是一个优势。但在使用条形码或 rfid 跟踪托盘的时代,它真的不再是决定性的信息。
此外,如果您orderID
在复合主键中使用 ,则您无法在没有第一个订单的情况下注册托盘。您不能只重复使用传入的托盘来交付传出订单;您无法提前准备托盘以进行批量交付;如果您在仓库之间使用托盘进行库存移动,那么您也会被搞砸。
这就是为什么我的个人建议是避免它:代理自治PalletID
是处理它的最灵活的方式。如果客户真的坚持标签上的订单号和序列号,您可以轻松地将它们作为可选托盘数据并为即将发出的托盘计算它们 - 不是作为关键,而只是为了礼貌地将它们打印在标签上;-)