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)
);
「代理主鍵 + 關鍵業務列聯合唯一索引 + 子表引用代理鍵」是處理此類「父級唯一、子級多條」經典模式的標準做法。