Database design 数据库设计(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

我有一张放冰淇淋店(客厅)的桌子,还有一张放不同口味冰淇淋的桌子。此外,还有一个用户表,用户应该能够评价口味

在客厅和风味之间存在一对多的关系,而风味是一个薄弱的实体。风味和用户之间也存在多对多关系,然后创建一个名为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;

没有风味“巧克力”

将实际键添加到风味表(
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客厅的巧克力是一样的吗?