首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

數據庫設計:餐廳-菜單-評價三表關聯,如何實現「菜單唯一、評價多條」?

     編輯:程式設計綜合問答

需求拆解

  • 餐廳表:`RestaurantID` (PK) …
  • 菜單表:一道菜在一家餐廳只出現一次 → 聯合唯一鍵 `(RestaurantID, DishName)`;
  • 評價表:同一餐廳同一道菜可有多條評價 → 無唯一性約束,只需外鍵關聯菜單表主鍵。

推薦結構

CREATE TABLE Restaurant (
    RestaurantID INT PRIMARY KEY,
    Name VARCHAR(100) NOT NULL
);

CREATE TABLE Menu (
    MenuID INT PRIMARY KEY,                -- 單列主鍵,便於外鍵引用
    RestaurantID INT NOT NULL,
    DishName VARCHAR(100) NOT NULL,
    Price DECIMAL(10,2),
    CONSTRAINT FK_Menu_Restaurant FOREIGN KEY (RestaurantID) REFERENCES Restaurant(RestaurantID),
    CONSTRAINT UQ_Menu_Restaurant_Dish UNIQUE (RestaurantID, DishName)  -- 核心:聯合唯一
);

CREATE TABLE Review (
    ReviewID INT PRIMARY KEY,
    MenuID INT NOT NULL,                   -- 關聯 Menu 表主鍵,而非直接關聯 Restaurant+DishName
    UserID INT NOT NULL,
    Rating TINYINT CHECK (Rating BETWEEN 1 AND 5),
    Comment TEXT,
    CreatedAt DATETIME DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT FK_Review_Menu FOREIGN KEY (MenuID) REFERENCES Menu(MenuID)
);

關鍵點

  1. 菜單表用代理主鍵 + 聯合唯一索引:滿足「一餐廳一菜名唯一」,同時給評價表提供穩定的單列外鍵;
  2. 評價表關聯 MenuID:避免在評價表重複存 `RestaurantID`、`DishName`,符合第三範式(3NF);
  3. 若業務允許同名菜不同價格/描述,可在 Menu 表增加 `Version` 或 `Category` 列,並調整唯一索引包含該列。

總結

「代理主鍵 + 關鍵業務列聯合唯一索引 + 子表引用代理鍵」是處理此類「父級唯一、子級多條」經典模式的標準做法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved