2010-12-06 63 views
0

我正在使用基於mysql的系統來管理食品加工過程中的數據。 此時我橫跨以下具體問題就來了:以m:n關係引用這兩個表的數據

我有一些項的表A中:

Farmer  Quantity 
Farmer A 1000 kg 
Farmer B 500 kg 

然後我有一個表B,其是一個m:從表A中的數據的n個agregation :

Batch  Quantity  Quality etc. 
LI1   200 kg  .... 
LI2   12000 kg  .... 

爲了表示M:N關係我有一個表AB連接兩個:

FK_Farmer FK_Batch 
FarmerA  LI1 
FarmerB  LI1 
FarmerA  LI2 

現在的問題是:表B中的一些批次實際上由其他批次組成......這意味着它們是遞歸組成的。我很想知道在數據庫設計方面實施這種情況的最佳方法是什麼。

我應該在表格AB中引用一個額外的外鍵引用回批表嗎?我不應該強制外鍵,並通過同一列引用農民和批處理表(並添加一個標誌來指示遞歸或其他)? 我有沒有其他明顯的解決方案?

能夠通過直接MySQL對所有數據進行深入查詢會很好,但不是必需的。

+0

我假設的批次有某種形式的層次結構,至少沒有循環,所以父母不能成爲自己的後代?批次也是分裂的,所以它們是不止一批的後代? – Orbling 2010-12-06 14:31:56

回答

0

表示數據的最簡單方法是向批處理表添加一個Parent指針。層次結構的根在此字段中將爲空。任何非root用戶都會指向它的父母,而父母可能會指向另一個父母等等,因爲它們可能會有多個級別。

查詢這樣的結構是棘手的,因爲標準SQL無法處理樹。 Oracle在他們的SQL方言中有專有的擴展,但我不認爲MySQL會這樣做。這意味着要追逐整個樹,必須編寫循環查詢的代碼,或者必須編寫一個查詢,以針對任意數量的最大級別執行多個連接。

但我不知道任何更簡單的方法。基本上我打算用代碼而不是單個查詢追蹤樹。

0

如果父批處理可以有多個子批次,和一個孩子批次可以有多個父批次,那麼你需要一個新的映射表:

FK_ParentBatch FK_ChildBatch 
LI1    LI5 
LI1    LI6 
LI2    LI5 
LI2    LI3 
LI3    LI4 

使用外鍵,以確保關係保持;但我不知道數據庫是否可以阻止你進入循環,你可能不得不依賴代碼或存儲特效。