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

내 문제는 내가 심지어 가게에 존재하지 않는 맛을 위해 투표 할 수 있어요 있다는 것입니다. 예를 들면 다음과 같습니다 ID (10)와 가게에서

INSERT INTO vote (date, ranking, flavour, uid, parlor_id) VALUES ('...', 5, 'Chocolate', 1, 10) 

, 5

하지만 내가 할 ...

SELECT * FROM flavour WHERE parlor_id=10; 
와 사용자 ID 1 비율 맛 '초콜릿'을 가진 사용자

맛이없는 '초콜릿'

+0

사용자는 팔러와 어떤 관련이 있습니까? 그들이 맛을 사는지? 사용자가 다른 매장에서 구입할 수 없습니까? 다른 가게의 맛에 대해 다른 점이 있습니까? 아니면 Parlor A의 초콜릿이 Parlor B의 초콜릿과 같은가요? – 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) 

을하지만 실제로 당신이 단순히 향기에 일반 PK를 사용한다면 더 좋을 것입니다 :

CREATE TABLE flavour (
    id INTEGER PRIMARY KEY, 
    name VARCHAR(255), 
    parlor_id INTEGER, 
    FOREIGN KEY (parlor_id) REFERENCES parlor (parlor_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) 
);