2012-03-08 2 views
0

2 테이블, 고객 및 제휴사가 있습니다. customers.email 및 affiliates.email이 독점적인지 확인해야합니다. 즉, 한 사람이 고객이 될 수도 있고 계열사가 될 수도 없습니다. 그것은 기본적으로 외래 키의 반대입니다. 이것을 할 수있는 방법이 있습니까?mysql 외부 키의 반대

답변

1

당신은 이메일을 저장하고 이메일에 고유의 구속이 테이블을 사용하고, 고객과 제휴사에서 해당 테이블을 참조 할 수 있습니다. (여전히 동일한 키를 참조하는 레코드가 2 개가 없음을 보장해야 함)

삽입 전에 및 업데이트 전에 트리거를 사용하여 전자 메일이 존재하지 않는지 확인할 수 있습니다.

또는이 유효성 검사를 응용 프로그램 논리에 그대로 둘 수 있습니다 - 데이터베이스가 아닌 응용 프로그램 논리에 그대로 둘 수 있습니다.

+1

첫 번째 해결 방법은 customers 테이블과 affiliates 테이블이 전자 메일 테이블의 단일 레코드를 참조하는 것을 어떻게 방지합니까? – octern

+0

예, 옥탄에 동의합니다. 그러나 대답의 두 번째 부분은 합법적입니다. 응용 프로그램 논리 (새 레코드를 삽입하기 전에 검사를 실행하는)로 남겨 두는 것이 가장 쉬운 방법 인 것 같습니다. 답을 수정하면 받아 들일 것입니다. – user617123

+0

@ user617123 메모를 촬영하고 답변을 수정했습니다. –

1

키를 사용할 수 없지만 두 개의 테이블을 사용하지 않아야하는 것처럼 들립니다. 대신 고객/제휴사 데이터 (이 표에서 고유해야 함)와 유형 (고객/제휴사)이있는 다른 표가있는 하나의 표를 가질 수 있습니다.

CREATE TABLE People (
    pplid, 
    pplEmail, 
    ptid, 
    UNIQUE KEY (pplEmail) 
) 
CREATE TABLE PeopleType (
    ptid, 
    ptType 
) 
INSERT INTO PeopleType VALUES (1, 'affiliates'), (2, 'customers'); 
+0

, 당신은 또한 열의를 할 수 : 고객 및 제휴사에 대한 마스터가 될 것이다, 새 테이블을 만듭니다 고객은 0이고 제휴사는 1 인 테이블. –

+0

@ Fls'Zen 다소 차이가 있습니다 (예를 들어'enum '을 사용할 수도 있습니다). 당신이 원하는 정상적인 방법에 달려 있습니다 :) –

+0

기본적으로 고객과 제휴사를 하나의 테이블 (사람들)로 결합했습니다. 문제는 고객과 계열사가 서로 다른 필드를 가지고 있기 때문에 이것이 실제로 나에게 도움이되지 않는다는 것입니다. – user617123

0

다음을 시도해보십시오. 그것은 확실히 정규화 아니지만

CREATE TABLE party 
( 
    id int not null auto_increment primary key , 
    party_type enum('customer','affiliate') not null, 
    email varchar(100), 
    UNIQUE (id,party_type) 
); 
--Then 
CREATE TABLE customer 
(
    .... 
    party_id INT NOT NULL, 
    party_type enum('customer') NOT NULL DEFAULT 'customer', 
    PRIMARY KEY (party_id,party_type) 
    FOREIGN KEY (party_id,party_type) REFERENCES party(id,party_type) 
); 
CREATE TABLE affiliates 
(
    .... 
    party_id INT NOT NULL, 
    party_type enum('affiliate') NOT NULL DEFAULT 'affiliate', 
    PRIMARY KEY (party_id,party_type) 
    FOREIGN KEY (party_id,party_type) REFERENCES party(id,party_type) 
) 
-- enum is used because mysql still doesn't have CHECK constraints 

각 당사자는 하나 개의 유형이 될 수있는이 방법은