Database design 数据库设计(DDL)
我有一张放冰淇淋店(客厅)的桌子,还有一张放不同口味冰淇淋的桌子。此外,还有一个用户表,用户应该能够评价口味 在客厅和风味之间存在一对多的关系,而风味是一个薄弱的实体。风味和用户之间也存在多对多关系,然后创建一个名为Vote的新表 我的DDL脚本如下所示:Database design 数据库设计(DDL),database-design,rdbms,ddl,Database Design,Rdbms,Ddl,我有一张放冰淇淋店(客厅)的桌子,还有一张放不同口味冰淇淋的桌子。此外,还有一个用户表,用户应该能够评价口味 在客厅和风味之间存在一对多的关系,而风味是一个薄弱的实体。风味和用户之间也存在多对多关系,然后创建一个名为Vote的新表 我的DDL脚本如下所示: CREATE TABLE parlor ( parlor_id INTEGER AUTO_INCREMENT, name VARCHAR(255), street VARCHAR(255), street_nu
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;
没有风味“巧克力”将实际键添加到风味表(
flavor\u id INTEGER
),将其设置为主键,并使外键引用该列。这将解决您的问题并改进您的总体设计
您可以将您的
姓名、客厅id
键“转换”为唯一约束以保持唯一性。向香料表添加一个实际键(flavor\u id INTEGER
),将其设置为主键,并让外键引用该列。这将解决您的问题并改进您的总体设计
您可以将您的
姓名、客厅id
密钥“转换”为唯一约束以保持唯一性。这是因为您的风味PK是(姓名、客厅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)
);
这是因为你的口味主键是(名字,客厅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)
);
用户如何与会客室关联?这是他们买口味的地方吗?用户不能从不同的客厅购买吗?不同客厅的口味有什么不同吗?或者a客厅的巧克力和B客厅的巧克力是一样的吗?用户是如何与一个客厅联系在一起的?这是他们买口味的地方吗?用户不能从不同的客厅购买吗?不同客厅的口味有什么不同吗?或者a客厅的巧克力和B客厅的巧克力是一样的吗?