我被要求对现有的SQL数据库进行一些调整,但是在设计如何建模以下场景时遇到了问题:
目前,订单商品可以与托盘相关联,也可以不与托盘相关联。目前,这只是数据库表上的整数字段。如果该订单商品上的某些字段已更新,则需要在共享相同PalletID的所有其他商品中进行反映。我被要求通过代码进行这种同步,但感觉很糟糕,很容易变得不同步。
我考虑制作一个包含共享字段的新表tblPallet,但是在订单商品没有托盘的情况下,订单商品仍然需要存储这些细节的副本:
ID, 描述, PalletID, CurrentStage, 位置,
ID, CurrentStage, 位置
有没有人为此建模有任何其他想法?
答案 0 :(得分:0)
1)如果在托盘上之前,一个或多个项目可以共享相同的W/AutomaticGainControl: not enough memory
和CurrentStage
我将使用以下解决方案(在这种情况下为Location
和{{1}项目级别的列和托盘级别的CurrentStage
和Location
是xor;如果填充CurrentStage
和Location
,则OrderItemGroup.CurrentStage
应为NULL或OrderItemGroup.Location
1}}填充然后OrderItemGroup.PalletID
和OrderItemGroup.PalletID
应为NULL):
OrderItemGroup.CurrentStage
2)但是如果在托盘之前,来自同一订单的商品(大多数情况下)不同OrderItemGroup.Location
和OrderItem(
ID - PK,
OrderID - FK,
... other columns except PalletID, CurrentStage, Location ...
)
OrderItemGroup(
ID - PK,
OrderItemID - FK,
CurrentStage - allows NULLs,
Location - allows NULLs,
PalletID - FK - it allows NULLs,
CHECK(CurrentStage IS NOT NULL AND Location IS NOT NULL AND PalletID IS NULL
OR CurrentStage IS NULL AND Location IS NULL AND PalletID IS NOT NULL)
-- {CurrentStage, Location} xor {PalletID}
)
Pallet(
ID - PK,
CurrentStage - NOT NULL,
Location - NOT NULL
)
我将使用以下解决方案(在这种情况下{{1}项目级别的{}和CurrentStage
列以及托盘级别的Location
和CurrentStage
是xor):
Location
2.1)如果您必须存储位置历史记录,那么我会使用以下方法(这不是唯一的解决方案,但在我看来 - 这是最简单的方法):
CurrentStage