2015-09-11 16 views
0

我想設計一個表格來幫助跟蹤坦克的內容隨着時間的推移。坦克一般都是一次裝滿,並且將會應用很多名字,並且它將被清空。如果這是唯一的情況,那麼我會這樣做。批量跟蹤的最佳餐桌設計

表: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 

有了這個,我可以在源類型設置爲是「漆」或「染」,並設置SOURCE_ID是來源成分的適當PK。這樣做的一個缺點是我不得不使用一些更復雜的觸發器,而不是依靠內置的外鍵級聯來維護參照完整性。

第一個解決方案看起來更簡單,但第二個解決方案似乎可以提供更大的靈活性。

第三個解決方案是忽略油漆桶到油罐轉移發生的事實,並將「綠色」油罐創建記錄爲從黃色油罐和所有從綠色油罐轉移的所有油罐坦克。

任何人都可以看到具體的優點或缺點解決方案,或使用不同的東西類似的問題?

+1

爲什麼要使用這樣的小列名。 dye_id,paint_id,transfer_id更易於理解和閱讀。對於具有人們可以理解的列名的性能沒有影響。 – Hogan

+0

我已經改變了它 –

+0

我會爲兩種轉移類型推薦兩個表格,除非您希望存在許多不同類型的轉移。只有兩種類型,兩張表更好。 4個或更多更通用的系統會更好。如果您覺得需要這種格式的數據,您可以隨時查看組合表格。 – Hogan

回答

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。要查找坦克的顏色,您必須運行查詢來計算坦克中材料的顏色組合。

您的批量沒有數量......因此可能會使計算顏色變得困難。但是,也許這種模式試圖將比喻比你的現實更緊密。

+0

這對於「當前快照」很有用,但是如果從現在開始的六個月內,我們想知道配料進入150911的成分是多少,那麼就不會有記錄。批次跟蹤用於供應商執行大量染料回收的情況,您可能想知道市場上會受到影響的所有大量油漆。在相反的方向上,如果您注意到大量油漆存在質量問題,則可以回溯到所有原材料以嘗試確定哪些可能是問題的根源。 –

+0

易於修復...只需將坦克內容移動到歸檔表格而不是刪除它。 –

+0

添加到我的答案,詳細說明我的意思。 –