2012-09-06 45 views
3

想象一家麪包店。我有一個產品表,它與公式表有一對多的關係,而公式表又與成分有一對多的關係。問題是我有一個蛋糕,但其中一個成分是糖霜,它本身就是一種產品(你不能將糖霜分解成單個糖塊,因爲糖霜適用於許多事情,蛋糕上的糖霜量可能需要改變)。什麼是這樣的設置表設計?帶循環參考的設計關係數據庫

+0

「配方」與「配方」是一樣的,對吧?同一產品可以有多個公式嗎?即如果你用不同的方式做蛋糕,它應該仍然被認爲是蛋糕的同一個孩子嗎?您的陳述:_「與公式表具有一對多關係的產品」似乎暗示了這一點,但我不確定您是在描述數據的基本屬性,還是僅僅描述當前數據庫設計(這可能與數據的實際外觀差異)。 –

+0

樹,搜索SQL樹。 –

回答

2

你正在尋找的是一種常見的數據庫設計模式,稱爲Bi材料爲

這是一個很好的blog about bill of materials

爲了更容易地使用這種設計所涉及的不平等樹結構,您可以使用一種稱爲訪問數字的物理實現技術,我在我對this question的回答中詳細描述了這種技術。

3

如何在您的配料表中的兩列,一個用於實際配料,另一個指向其他配方。只有一個將被設置爲任何給定的行。

使用兩列還可以強制執行參照完整性。

1

看來你只有兩個對象:公式和東西。一個公式用其他東西來描述東西。一件東西可能是也可能不是產品。這是一個二元屬性:第三個表。該計劃將是這樣的:

Stuff 
----- 
id : integer 
name : string 

FormulaPairs 
------------ 
stuff_described_id : integer 
ingredient_id : integer 
amount : float 

Product 
------- 
stuff_id : integer 

查詢示例:

獲取蘋果派成分的所有ID:

select ingredient_id from Stuff s inner join FormulaPairs p 
where s.id == p.stuff_described_id and s.name == 'Apple Pie' 

獲得的產品的所有名稱:

select name from Stuff s inner join Product p where s.id == p.stuff_id