Mysql

澄清數據庫創建和關係

  • January 11, 2015

我試圖用很少的表和它們之間的關係來創建數據庫。由於我根本不擅長數據庫,因此我需要一些說明。這個想法是連接table,這裡有兩個選項:table_1``table_2``table_3

選項 1 - 表直接連接到其他表,並且在查詢中將加入它們。 在此處輸入圖像描述

選項 2 - 將使用中間表將它們與外鍵連接.. 在此處輸入圖像描述

目前我的數據庫模式是mess我與這兩種方法都有關係。有些有中間桌子,有些沒有。這是我目前對關係的看法,我認為這不是很好。 在此處輸入圖像描述

在選項 3(目前)中,您可以看到連接是雙重的 - 一個來自中間表,另一個是直接連接。這裡最好的解決方案是什麼?

比如說 :table = hoteltable_1 = roomstable_2 = reservationtable_3 = food

當使用者進行預訂時,系統會向他顯示免費房間。他還可以看到這家酒店的餐廳有什麼樣的食物。所以酒店的桌子應該與房間、食物和預訂聯繫起來。

更新:我用來顯示膳食的查詢之一是

   $hotels_id = $_GET['meal_id'];
   $strSQL = "SELECT m.meal_id, meal_name, meal_image, meal_image_big, meal_weight, meal_price, meal_description 
       FROM meals m 
       JOIN meal_hotel mr 
       ON m.meal_id = mr.meal_id 
       WHERE hotels_id = '$hotels_id'";

所以表格meal_hotel有兩列meal_idhotels_id這兩列是酒店和餐飲的 FK。我對嗎?

只是一個開始:

通常,這應該通過規範化數據變得清晰。您需要為每個實體創建一個單獨的表。而且您需要一個用於多對多 (m:n) 關係的中間表。

對於酒店和房間/預訂,特定房間/預訂不太可能與單個酒店相關。對於膳食,你需要決定,究竟是什麼定義了一個。例如,如果您只關心某個特定酒店是否提供奶酪三明治,那麼它看起來像 m:n。您需要詢問您(r 領域專家),您正在處理的系統生命週期內的真實情況。

無論您是否有中間表,都需要外鍵 - 不同之處在於它們的儲存位置。

查看您目前的架構:想到兩件事。要麼您將可選屬性儲存在中間表中 - 如果沒有填寫可選屬性,則使用快捷方式。或者您實際上在這些實體之間有多個關係。您需要檢查數據以區分兩者。我通常會投票支持一致性——因此使用一種方法來儲存特定類型的事實。


關於“hotel_meal”的更新:有了膳食記錄中的所有這些細節,我懷疑不止一家酒店會提供一道菜(除非您的系統中有連鎖酒店,或者幾家酒店的廚房由同一個餐飲服務商經營)。

你可以檢查:

SELECT
 meal_id
 , COUNT(hotels_id)
FROM meal_hotel
GROUP BY meal_id
HAVING COUNT(COUNT(hotels_id)) > 1;

如果它返回任何記錄,則您有理由使用中間表 - 如果您確定返回的記錄在您的域中確實有意義(連鎖酒店,同一個餐飲服務商 - 您應該知道)。


關於“hotel_meal”的更新二:如果不止一家酒店提供任何餐點,則不需要額外的桌子;只需將hotel_id 作為餐表中的外鍵即可。就像房間和預訂一樣……

列出特定酒店的所有餐點:

SELECT * FROM meals WHERE hotel_id=1;

隨時回來提供更多詳細資訊。

引用自:https://dba.stackexchange.com/questions/89030