澄清數據庫創建和關係
我試圖用很少的表和它們之間的關係來創建數據庫。由於我根本不擅長數據庫,因此我需要一些說明。這個想法是連接
table
,這裡有兩個選項:table_1``table_2``table_3
選項 1 - 表直接連接到其他表,並且在查詢中將加入它們。
選項 2 - 將使用中間表將它們與外鍵連接..
目前我的數據庫模式是
mess
我與這兩種方法都有關係。有些有中間桌子,有些沒有。這是我目前對關係的看法,我認為這不是很好。在選項 3(目前)中,您可以看到連接是雙重的 - 一個來自中間表,另一個是直接連接。這裡最好的解決方案是什麼?
比如說 :
table = hotel
、table_1 = rooms
和table_2 = reservation
。table_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_id
,hotels_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;
隨時回來提供更多詳細資訊。