2016-08-30 118 views
0

我有一張冰淇淋店(會客室)的桌子和一間供客廳內不同口味的桌子。另外還有一個用戶表,用戶應該能夠評定風味。數據庫設計(DDL)

客廳和味道之間存在一對多的關係,味道是一個弱的實體。 Flavor和User之間還有一個多對多的關係,然後創建一個名爲Vote的新表。

我的DDL腳本如下所示:

CREATE TABLE parlor (
    parlor_id INTEGER AUTO_INCREMENT, 
    name VARCHAR(255), 
    street VARCHAR(255), 
    street_numb INTEGER, 
    zip INTEGER, 
    PRIMARY KEY (parlor_id) 
); 

CREATE TABLE flavour (
    name VARCHAR(255), 
    parlor_id INTEGER, 
    PRIMARY KEY (name, parlor_id), 
    FOREIGN KEY (parlor_id) REFERENCES parlor (parlor_id) 
); 

CREATE TABLE user (
    uid INTEGER AUTO_INCREMENT, 
    username VARCHAR(255) UNIQUE, 
    password BINARY(64), 
    PRIMARY KEY (uid) 
); 

CREATE TABLE vote (
    date TIMESTAMP, 
    ranking INTEGER(5), 
    flavour VARCHAR(255), 
    uid INTEGER, 
    parlor_id INTEGER, 
    PRIMARY KEY (date, uid, flavour, parlor_id), 
    FOREIGN KEY (uid) REFERENCES user (uid), 
    FOREIGN KEY (flavour) REFERENCES flavour (name), 
    FOREIGN KEY (parlor_id) REFERENCES flavour (parlor_id) 
); 

我的問題是,我能夠投票選舉的味道,甚至沒有在客廳存在。例如:

INSERT INTO vote (date, ranking, flavour, uid, parlor_id) VALUES ('...', 5, 'Chocolate', 1, 10) 

在ID爲10會客,與用戶ID 1倍速率的味道 '巧克力' 用戶與5

但是當我做...

SELECT * FROM flavour WHERE parlor_id=10; 

沒有味道'巧克力'

+0

用戶如何與客廳關聯?他們在哪裏買口味?用戶不能從不同的商店購買嗎?來自不同客廳的味道有什麼不同,或者客廳A的巧克力與客廳B的巧克力相同? – TommCatt

回答

1

添加一個真正的關鍵字到flavors表(flavor_id INTEGER),將其設置爲主鍵並且有外鍵引用該列。這將對您的問題進行分類並改善您的整體設計。

您可以將您的name, parlor_id密鑰「轉換」爲唯一約束以保持唯一性。

1

那是因爲你的口味PK是(姓名,parlor_id),但投票只引用了其中的一部分:

FOREIGN KEY (flavour) REFERENCES flavour (name) 

當然,你可以做一個複雜的FK:

FOREIGN KEY (flavour, parlour_id) REFERENCES flavour (name, parlour_id) 

但實際上它會更好,如果你只是使用普通的PK風味:

CREATE TABLE flavour (
    id INTEGER PRIMARY KEY, 
    name VARCHAR(255), 
    parlor_id INTEGER, 
    FOREIGN KEY (parlor_id) REFERENCES parlor (parlor_id) 
); 

並引用此ID:

CREATE TABLE vote (
    id INTEGER PRIMARY KEY, 
    date TIMESTAMP, 
    ranking INTEGER(5), 
    flavour_id INTEGER, 
    uid INTEGER, 
    parlor_id INTEGER, 
    FOREIGN KEY (uid) REFERENCES user (uid), 
    FOREIGN KEY (flavour_id) REFERENCES flavour (id) 
);