我想设计一个表来帮助跟踪坦克的内容。坦克通常是一次性填充,并且将对其应用很多名称,并且它将被清空。如果这是唯一的情况,那么我会这样做。
表: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。这样做的一个缺点是我必须使用一些更复杂的触发器,而不是依赖内置的外键级联来保持参照完整性。
第一个解决方案似乎更简单,但第二个解决方案似乎可以提供更大的灵活性。
第三种解决方案是忽略油漆罐到罐的转移发生的事实,只记录“绿色”罐的产生,作为黄色罐中所有批次的转移和绿色罐中的所有批次
任何人都可以看到任何解决方案的特定优点或缺点,或者对类似问题使用不同的东西吗?
答案 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
。要查找坦克的颜色,您必须运行一个查询来计算坦克中材料颜色的组合。
您的批次没有数量......因此可能难以计算颜色。但也许这个模型试图比你的现实更适合类比。