2010-07-20 4 views
0

저는 실제로 Doctrine Reference: One to Many, Unidirectional with Join table을 읽습니다. 그러나 이것은 아마 더 많은 SQL quesiton이 될 것입니다. 기본적으로, 이것은 일대 다, 단방향 관계를 모델링하기로되어 있습니다. 나는 PHP 코드 (그 링크에)에서, 그 같은 1 사용자가 많은 phonenumbers 있다고 생각합니다.이 SQL을 이해하는 데 도움이 필요합니다 (doctrine에 의해 생성 됨)

질문은 SQL에서 나온 것입니다. 1 명의 사용자가 많은 전화 번호를 가질 수있는 것처럼 보입니다. 1 개의 전화 번호는 1 명의 사용자에게만 속할 수 있습니다. 내가 맞습니까?

CREATE TABLE User (
    id INT AUTO_INCREMENT NOT NULL, 
    PRIMARY KEY(id) 
) ENGINE = InnoDB; 

CREATE TABLE users_phonenumbers (
    user_id INT NOT NULL, 
    phonenumber_id INT NOT NULL, 
    UNIQUE INDEX users_phonenumbers_phonenumber_id_uniq (phonenumber_id), 
    PRIMARY KEY(user_id, 
phonenumber_id) 
) ENGINE = InnoDB; 

CREATE TABLE Phonenumber (
    id INT AUTO_INCREMENT NOT NULL, 
    PRIMARY KEY(id) 
) ENGINE = InnoDB; 

ALTER TABLE users_phonenumbers ADD FOREIGN KEY (user_id) REFERENCES User(id); 
ALTER TABLE users_phonenumbers ADD FOREIGN KEY (phonenumber_id) REFERENCES Phonenumber(id); 

나는 단지 데이터베이스를 단순화 할 수 없습니다 ... 아래 ... 조인 테이블이 필요하지 않습니다.

Users (id, name) 
Phonenumbers (id, user [FK], number) 
+0

대답을 업데이트했습니다 – garik

+0

사용자가 전화 번호없이 존재할 수 있습니까? (맞는 것 같아요). Phonenumber 사용자는 사용자없이 존재할 수 있습니까? (맞는 것 같아요). 어떤 경우에는 자신의 테이블을 가질 가치가있는 두 엔티티 사이의 관계가 있습니다. 그러나, 나는 phonenumber가 그 자체로 엔티티 라기보다 속성이라고 주장 할 것이다. – onedaywhen

+0

실제로 어떤 식 으로든 쓸모없는 디자인입니다. :) – garik

답변

3

올바른 내용은 동일한 문제에 대한 두 가지 유효한 접근 방법입니다. 그리고 예, users_phonenumbers의 고유 색인은 각 전화 번호가 한 명의 사용자에게만 속할 수 있음을 의미합니다.

+0

거기에 적시에 대답, 데이비드 M. 나는 완전히 잘못된 대답을 게시하려고 막. –

+0

간단한 접근 방법은 내가 한 일을 할 때 사용되는 것 같다 [Bi to directional **] (http://www.doctrine-project.org/projects/orm/2.0/docs/reference/association- 매핑/en # 일대 다, - 양방향) 그러나 차이점은 무엇입니까? –

0

실제로 디자인은 차선입니다.

전화 번호와 사용자가 있고, many-to-many에 링크 될 수 있어야한다는 아이디어가 있어야합니다. 전화 번호에 대한 고유 색인으로 인해 각 번호는 한 명의 사용자에게만 할당 될 수 있습니다.

그러면 전체 users_phonenumbers는 phonenumbers 테이블에 userid 열을 추가하고 조인을 저장하기 때문에 중복되어 버렸습니다.

나에게 묻는다면 BAd 테이블 디자인.

+0

죄송합니다, 마지막 라인을 읽는 것을 잊어 버렸습니다. 그렇습니다. 참여가 불필요하므로 제안 된대로 디자인을 단순화 할 수 있습니다. – gjvdkamp

+0

@David M 올바른 답변 : 두 방법 모두 유효합니다. "BAd"라고 생각하는 것은 테이블이 엔티티 테이블 또는 관계 테이블이지만 절대 둘 다이 아니라는 가치있는 원칙에 기반합니다. 그것은 단지 스타일에 관한 질문 일뿐입니다. 당신이 그것을 사용하는 맥락에서, "차선책"이라는 용어는 주관적입니다 (당신이 증명을 게시하는 것을 신경 쓰지 않는 한 ...?) – onedaywhen

관련 문제