2016-08-30 4 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, пользователь с идентификатором пользователя 1 ставки на вкус 'Шоколад' с 5

Но когда я делаю ...

SELECT * FROM flavour WHERE parlor_id=10; 

нет вкуса 'шоколад'

+0

Как пользователи связаны с гостиной? Это где они покупают аромат? Нельзя ли покупать у разных салонов? Есть ли что-то другое в отношении аромата из разных салонах или шоколад из Паркера А так же, как шоколад из Паркера Б? – TommCatt

ответ

1

Добавить фактический ключ в таблицу ароматов (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) 

Но на самом деле это было бы лучше, если бы вы просто использовали обычный ПК по вкусу:

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) 
); 
Смежные вопросы