批次跟踪的最佳表格设计

时间:2015-09-11 20:16:11

标签: sql

我想设计一个表来帮助跟踪坦克的内容。坦克通常是一次性填充,并且将对其应用很多名称,并且它将被清空。如果这是唯一的情况,那么我会这样做。

表:dye_tank

dye_id (PK)
dye_lot
dye_color

表:油漆

paint_id (PK)
paint_lot
paint_color

表:dye_transfer

dye_transfer_id(PK)
dye_id (FK)
paint_id (FK)
dye_transfer_note

这样我就可以将多批染料转移到一个涂料罐中,并在多批涂料之间使用一罐染料。

如果我还希望能够将大量油漆转移到另一批油漆中,该怎么办?例如,我可以将黄色染料添加到油漆罐中以制作大量黄色油漆,然后将其泵入现有的一批蓝色油漆中,以制作一批新的绿色油漆。您是否建议使用单独的表进行批次转移,例如:

表:paint_transfer

paint_transfer_id (PK)
paint_id (FK)
paint_id (FK)

还是有更好的解决方案。我可以扩展染料转移表并制作它:

表:转移

transfer_id (PK)
source_id
source_type
paint_id (FK)
transfer_note

有了这个,我可以将源类型设置为'paint'或'dye',并将source_id设置为源成分的适当PK。这样做的一个缺点是我必须使用一些更复杂的触发器,而不是依赖内置的外键级联来保持参照完整性。

第一个解决方案似乎更简单,但第二个解决方案似乎可以提供更大的灵活性。

第三种解决方案是忽略油漆罐到罐的转移发生的事实,只记录“绿色”罐的产生,作为黄色罐中所有批次的转移和绿色罐中的所有批次

任何人都可以看到任何解决方案的特定优点或缺点,或者对类似问题使用不同的东西吗?

1 个答案:

答案 0 :(得分:0)

另一种看待它的方法是将其视为物料清单。每个罐都混合了许多不同类型的材料。所以像这样:

Table: tank
tank_id (PK)

Table: material
material_id (PK)
material_class (paint, dye, anything else...)
material_color

Table: material_lot
lot_id (PK)
material_id

Table tank_contents
tank_id (PK)
lot_id (PK)
transfer_note

Table tank_contents_history
date_emptied (PK)
tank_id (PK)
lot_id (PK)
transfer_note

填充油箱时,将批次添加到tank_contents。如果它为空,则删除批次并将其添加到tank_contents_history。要查找坦克的颜色,您必须运行一个查询来计算坦克中材料颜色的组合。

您的批次没有数量......因此可能难以计算颜色。但也许这个模型试图比你的现实更适合类比。