0

我打算有幾張桌子,我不太清楚如何去設計「整件事」。 一些幫助將不勝感激! :)DB設計建議

我基本上想模擬超市的食譜和配料。 所以,我在想:

  • 超市(名稱)
  • 製造商(名稱)< - 擁有衆多產品
  • 產品(量,單位,姓名)< - 屬於製造商
  • 金額(名稱)< - 以產品數量爲中心的數量
  • 單位(名稱)< - 以產品爲單位的支點
  • 成分(名稱,產品)< - 支點與產品

我有點迷路,我可以想象幾種解決方案去做這件事。 從多個數據透視表以及其上的附加數據透視表到真正簡單的解決方案,這些解決方案可能包含整個表中相當一部分重複數據。

你如何創建一個「大」數據透視表,而不是多個小的意見特別感興趣
- 「大」表看起來是這樣的:「ID」,「ingredient_id」「 product_id「」unit_id「...所以基本上將一個大表上的所有數據透視數據結合起來。
- 「小」表反而看起來像「product_unit」,「ingredient_product」。 這個問題讓我很困惑。
我認爲一張大桌子最好,但我沒有誠實的想法。

我正在使用Laravel,我對編碼很陌生。如果有某種工具或某件事會讓你的建議更容易,請讓我知道,我會試一試!

非常感謝!

回答

1

我有很多麻煩先與Laravel一起學習。關於這個問題的好處是,你可以使用遷移來嘗試一些事情,如果它不是最好的方法,那麼就回滾它。

雄辯是基於[活動記錄模式] [1],所以閱讀活動記錄指南將是一個很大的幫助。你的目標是[數據庫規範化] [2]。由於RoR已經存在了很長時間,並且使用了相同的模式,所以我有更好的運氣搜索「數據庫規範化軌道」。

我發現它更容易繼續做你最初做的事情。

supermarket->有多對一>廠商

與製造商>屬於多對一>超市

產品 - >屬於單>製造商

與製造商>具有多對一>產品

如果一個產品總是有一定的數量,而一個產品沒有多少金額,那麼通常只需將其放在產品表上即可。通常情況下,產品將在桌面上有wholesale_amt,retail_amt。

如果您有類似的單位量:

unit_amount table: 
id | title 
1 pallet 
2 case 
3 box 
4 single 

...比你會提出,在一個單獨的表。原因是,您可以輕鬆修復拼寫錯誤,只在一處添加不同的金額。如果您的開發人員在更新SQL中拼錯了托盤,則不會在產品表中出現重複的有點拼寫錯誤的記錄。

產品表將有unit_amount列,存儲這樣的標識:

product table: 
id | title | unit_amount 
1 | water | 2 

你只需要一個數據透視表的多對多關係。數據透視表應允許你這樣做的查詢是這樣的:

select * from manufacturer_product where manufacturer_id = 2 

...,並得到生產廠家2.每一個產品最重要的是,如果製造商有很多產品,他們都是各自的新紀錄。

manufacturer_product table: 
manufacturer_id | product_id 
    2   | 1 
    2   | 8 
    2   | 12 

該系統類型的分崩離析,如果您有該表的warehouse_id也和廠商有900個產品,但2個倉庫:

manufacturer_id | product_id | warehouse_id 
    2   | 1  | 1 
    2   | 8  | 
    2   | 12  | 

如果你有一大堆其他列的你1 。)返回一堆你不需要的數據2.)不能再使用雄辯的關係,並且3.)你要命名錶格是什麼?

Dayle里斯有說服力的關係,一個真棒指南這裏是真正幫助我:

http://daylerees.com/codebright/eloquent-relationships

我基本上要加載這些都與「產品」,這是相關的「成分」 to'製造商

因此,您需要使用'有很多通'的關係。它應該是這樣的:

class Manufacturer extends eloquent { 

    public function products { 
     return $this->hasMany('Product'); 
    } 

    public function ingredients { 
     return $this->hasManyThrough('Ingredient', 'Product'); //has many ingredients through products 
    } 

} 

可以查詢這樣的關係:

$manufacturer = new Manufacturer; 
$ingredients = $manufacturer->ingredients(); 

逆工程太:

class Ingredient extends eloquent { 

    public function products { 
     return $this->belongsToMany('Product'); 
    } 

    public function manufacturer { 
     //this is actually belongToThrough but they don't call it that 
     return $this->hasManyThrough('Manufacturer', 'Product'); 
    } 

} 

http://laravel.com/docs/4.2/eloquent#relationships

逆變得有點更容易混淆,請看這裏的討論:

https://github.com/laravel/framework/issues/6161

[1] http://en.wikipedia.org/wiki/Active_record_pattern [2] http://en.wikipedia.org/wiki/Database_normalization

+0

非常感謝!這非常有幫助!我會試着實現它,看看我能得到多少:)如果你偶爾能夠拿回戰利品,那將會很好。我正在嘗試實現它,但我腦海中仍然有一些體面的大問號 – ptrckolous 2014-12-03 08:00:59