2013-05-25 31 views
3

我想創建一個數據庫(使用PHP和MYSQL,與XAMPP),其中存儲有關各種快餐店及其分支機構的信息,連同在其分支機構提供的菜單。我在我的數據庫中創建了一些表格,詳細介紹了快餐店,他們的分店,菜單的類別和子類別以及他們在表格中提供的項目。表格的摘錄/樣本如下所示。如何鏈接多個表到一個ID

Restaurants 
+-------------+----------------+ 
| RestaurantID| RestaurantName | 
+-------------+----------------+ 
|  1  | PizzaHut  | 
|  2  | BurgerKing  | 
|  3  | KFC   | 
|  4  | SubWay   | 
+-------------+----------------+ 

Branches 
+---------------+----------------+ 
| RestaurantName| BranchAddress | 
+---------------+----------------+ 
| KFC   | XXX-1234  | 
| KFC   | AAA-1234  | 
| KFC   | YYY-1234  | 
| BurgerKing | DDD-1234  | 
+---------------+----------------+ 

Categories 
+---------------+----------------+ 
| BranchAddress | Categories  | 
+---------------+----------------+ 
| XXX-1234 | Fries   | 
| AAA-1234 | Burgers  | 
| YYY-1234 | Drinks   | 
| DDD-1234 | Burgers  | 
+---------------+----------------+ 

SubCategories 
+---------------+----------------+ 
| Categories | SubCategories | 
+---------------+----------------+ 
| Fries  | Cheese   | 
| Burgers  | Chicken  | 
| Drinks  | Carbonated  | 
| Burgers  | Beef   | 
+---------------+----------------+ 

Items 
+---------------+----------------+ 
| SubCategories | Items   | 
+---------------+----------------+ 
| Cheese  | CheeseFries | 
| Chicken  | Zinger   | 
| Carbonated | Pepsi   | 
| Beef  | Whopper  | 
+---------------+----------------+ 

正如上面可以看到的,每個餐廳可以有多個分支,每個分支的分支可以有多個類別,每個類別的類別可以有幾個亞類,其然後可以有幾個items.Branches可以具有相同的類別和/或子類別BUT在其中有不同的項目。

我不認爲在這種情況下,集中的類別,子類別和物品表將起作用,因爲每個餐廳的每個分支都是它自己的獨立個體實體,這將需要它自己的一組類別,子類別和項目表。如果是這樣,我該如何創建表以及設置必要的外鍵?

Categories 
+----------------+ 
| Categories | 
+----------------+ 
| Drinks  | 
| Burgers  | 
| Fries   | 
| SetMeals  | 
+----------------+ 

SubCategories 
+----------------+----------------+ 
| Category  | SubCategories | 
+---------------+-----------------+ 
| Drinks   | Carbonated  | 
| Drinks   | Carbonated  | 
| Drinks   | Carbonated  | 
| Drinks   | Non-Carbonated | 
| Burgers  | Beef   | 
| Burgers  | Beef   | 
| Burgers  | Chicken  | 
+----------------+----------------+ 

SubCategories 
+----------------+----------------+-------------+ 
| Category  | SubCategories | Items  | 
+---------------+-----------------+-------------+ 
| Drinks   | Carbonated  | Pepsi  | 
| Drinks   | Carbonated  | Root Beer | 
| Drinks   | Carbonated  | Cola   | 
| Drinks   | Non-Carbonated | Orange Juice | 
| Burgers  | Beef   | Whopper  | 
| Burgers  | Beef   | Cheese Burger| 
| Burgers  | Chicken  | McChicken | 
+----------------+----------------+--------------+ 

當然,我可能是錯的,並且可能在這種情況下工作的集中表。如果是這樣,我可以舉一些例子和/或指導如何進行/或設置表嗎?

我想到了以下解決方案:

Restaurants 
+-------------+----------------+ 
| RestaurantID| RestaurantName | 
+-------------+----------------+ 
|  1  | PizzaHut  | 
|  2  | BurgerKing  | 
|  3  | KFC   | 
|  4  | SubWay   | 
+-------------+----------------+ 

Branches 
+---------------+----------------+ 
| RestaurantName| BranchAddress | 
+---------------+----------------+ 
| KFC   | XXX-1234  | 
| KFC   | AAA-1234  | 
| KFC   | YYY-1234  | 
| BurgerKing | DDD-1234  | 
+-------------+------------------+ 

Categories 
+----------------+----------------+----------------+ 
| RestaurantName | BranchAddress | Category  | 
+----------------+-----------------+----------------+ 
| KFC   |  XXX-1234 | Fries   | 
| KFC   |  AAA-1234 | Burgers  | 
| KFC   |  YYY-1234 | Drinks   | 
| BurgerKing |  DDD-1234 | Burgers  | 
+----------------+----------------------------------+ 

SubCategories 
+----------------+----------------+----------------+----------------+ 
| RestaurantName | BranchAddress | Category  | SubCategories | 
+----------------+-----------------+---------------+----------------+ 
| KFC   |  XXX-1234 | Fries   | Cheese   | 
| KFC   |  AAA-1234 | Burgers  | Chicken  | 
| KFC   |  YYY-1234 | Drinks   | Carbonated  | 
| BurgerKing |  DDD-1234 | Burgers  | Beef   | 
+----------------+---------------------------------+----------------+ 

Items 
+----------------+----------------+----------------+----------------+-------------+ 
| RestaurantName | BranchAddress | Category  | SubCategories | Items  | 
+----------------+-----------------+---------------+----------------+-------------+ 
| KFC   |  XXX-1234 | Fries   | Cheese   |CheeseFries | 
| KFC   |  AAA-1234 | Burgers  | Chicken  |Zinger  | 
| KFC   |  YYY-1234 | Drinks   | Carbonated  |Pepsi  | 
| BurgerKing |  DDD-1234 | Burgers  | Beef   |Whopper  | 
+----------------+---------------------------------+----------------+-------------+ 

雖然這些表格中給出了每個餐廳及其分支機構的個人類別,子類別,項目,它違背了擺在首位分裂起來的全部目的,而且很愚蠢。

編輯:我試圖denormalise上面的表格,這樣我可以用它

$query="SELECT * FROM Items WHERE Restaurantname='BurgerKing' AND 
BranchAddress='XXX-1234' AND Category='Fries'; 
$result=mysqli_query($cxn,$query) or die("Error"); 
while($row=mysqli_fetch_assoc) 
{ 
extract($row); 
echo "$Item"; 
} 

注意查詢:我計劃將數據庫擴展到包括非快餐店,甚至非-F在未來& B及其相關的商店,所以各種表格(類別/子類別和項目)必須能夠從非-F包括類別& B及其相關商店(例如電子/書籍等)

對於非常長的問題,我表示歉意,並希望得到任何建議和幫助。

謝謝!

+0

你爲什麼要這樣去規範化它。你爲什麼有分行地址有子分類。誰知道這可能是合法的。你是什​​麼意思,它打敗了整個目的,很愚蠢? – Drew

+0

@ Drew Pierce我已經編輯了我的問題,以說明爲什麼我將其歸一化。我只是覺得它很愚蠢,因爲它不是將其歸一化,而是將所有東西都整合到一張巨大的表中,然後像Excel表一樣使用它使用像過濾器這樣的查詢。例如(SELECT * FROM Item WHERE RestaurantName ='KFC';)不必在我的查詢中使用JOINS,儘管這樣做會破壞關係數據庫的整個目的。 @ yvytty –

回答

0

不知道爲什麼你要反規範化。您可以從分類和子分類中選取與分支有關的列,從子類別中取出類別名稱等。通過將它們留在您中,您複製了大量數據,而傳統上這不是您如何使用關係數據庫的方式!您還應該通過ID關聯這些表格,而不是通過名稱,因爲連接時的比較速度更快。

您可以考慮將項目鏈接到具有多對多鏈接表的分支。通過這種方式,您可以滿足您的要求,即可以將某個類別/子類別的特定項目與分支關聯,而無需關聯整個類別/子類別。

CREATE TABLE item_link (
    id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    branch_id INT(11) NOT NULL, 
    item_id INT(11) NOT NULL, 
    KEY composite (`branch_id`, `item_id`) 
); 

看到這個fiddle我爲你做的,詳細說明我的建議修改的方案,並給出了你將如何使用這個新表顯示的一個分支菜單/庫存的例子。

+0

我對錶格進行了非規範化處理,以便我能夠在不使用任何連接的情況下使用查詢。你的關鍵字KEY在你的小提琴中做了什麼?我嘗試使用Google搜索,但我得到的只是複合主鍵,因爲在使用KEY關鍵字之前您已經設置了主鍵(我指的是item_link表以及其他表,例如(鏈))。 –

+0

非規範化應該只在極少數情況下才會使用,通常當表格非常龐大(數十億條記錄)和索引無法通過性能方式獲取時。有關更多信息,請參閱Jeff Atwood的[本文](http://www.codinghorror.com/blog/2008/07/maybe-normalizing-isnt-normal.html)。關鍵字鍵添加索引。如果您查看小提琴中查詢的執行計劃,您將看到組合鍵用於在加入item_link時檢索記錄。 –

相關問題