2016-08-30 2 views
0

アイスクリームショップ(パーラー)のテーブルと、お店で提供されるさまざまな味のテーブルがあります。さらに、ユーザーテーブルがあり、ユーザーはフレーバーを評価できる必要があります。データベースデザイン(DDL)

フレーバーが弱いエンティティであるパー​​ラーとフレーバーの間には1対多の関係があります。 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) 
); 

私の問題は、私もパーラー内に存在しない味に投票することができるよということ、です。 ...

ID 10とパーラーで
INSERT INTO vote (date, ranking, flavour, uid, parlor_id) VALUES ('...', 5, 'Chocolate', 1, 10) 

、5

を持つユーザーIDを持つユーザー1つの速度味 'チョコレート' しかし、私はやる

SELECT * FROM flavour WHERE parlor_id=10; 
例えば:

フレーバー 'チョコレート'がありません

+0

ユーザーはどのようにパーラーに関連付けられていますか?彼らはどこで味を買うのですか?ユーザーは別の店から購入できませんか?違う店のフレーバーや、パーラーBのチョコレートと同じパーラーAのチョコレートが違うのですか? – TommCatt

答えて

1

フレーバーテーブル(flavor_id INTEGER)に実際のキーを追加し、それをプライマリキーとして設定し、そのキーを外部キーで参照させます。これにより、問題が分類され、全体的なデザインが改善されます。

name, parlor_idキーを一意性を維持するために一意制約に「変換」することができます。

1

あなたの風味PKが(名前、parlor_id)ですが、それの一部のみの参照を投票ためです:

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

しかし、実際にそれ:もちろん

FOREIGN KEY (flavour) REFERENCES flavour (name) 

あなたが複雑なFKを行うことができますフレーバーにレギュラー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) 
); 
関連する問題