2016-08-30 119 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) 
);