2012-04-20 3 views
0

2 테이블 UserGroup이 있습니다. 나는 테이블이 Attributes가 열이 사용자 및 그룹에 의해 공유가 :SQL 부모 테이블 2 개가있는 외부 키 문제

  • attributeName.
  • AttributeValue.
  • ObjectID.

ObjectID은 사용자의 기본 키 또는 그룹의 기본 키를 가리 킵니다. 사용자 또는 그룹이 삭제 될 때 자동으로 특성을 삭제하기 위해 Cascade on Delete이라는 외부 제약 조건을 추가했습니다.

이제는 사용자에 대한 특성을 삽입 할 때 그룹이 존재하지 않기 때문에 외래 키 제약 조건이 있습니다.

어떻게해야합니까?

+0

두 속성 테이블을 대신 고려해야한다고 생각합니다. 하나는 사용자 용이고 다른 하나는 그룹 용입니다. –

+0

또는 상위 키의 트리거로 외래 키 및 제약 조건을 바꿔 삭제를 잡으십시오. – CloudAnywhere

+0

나는 그렇지 않다. FK의 주요 목적은 계단식 삭제가 아닙니다. 존재하지 않는 사용자/그룹에 대한 속성을 추가하지 않도록해야합니다. UserId와 GroupId 모두에서 동일한 필드를 갖는 것은 좋지 않습니다. 두 테이블 대신 Attributes에 두 개의 열을 가질 수 있지만 내가 말한 것처럼 두 개의 테이블로 갈 것입니다. –

답변

2

당신은 기본적으로 3 가지 옵션이 있습니다 : 현재 디자인을 유지

  1. 을하지만, 그들 (Group 대한 하나 User 대한 다른)에 각각 별도의 FK을 첨부 UserIDGroupIDAttribute.ObjectID을 대체 할 수 NULL이 될 수도 있습니다. CHECK 제약 조건을 사용하여 이 모두 NULL이 아닌이 아닌지 확인해야합니다.

    enter image description here

  2. 분할 AttributeUserAttributeGroupAttribute에 따라서 자신의 테이블에 각 외래 키를 분리.이 같은

    enter image description here

  3. 사용 상속 :

    enter image description here

솔루션 (1) DBMS가 널 (NULL)에 UNIQUE 처리 방법에 크게 의존 모두 (1) (2) 동일한 AttributeName을 두 개의 서로 다른 속성, 즉 사용자 용과 그룹 용으로 사용할 수 있습니다.

0

이 외부 키 필드 ObjectId에 대해 NULL 값을 허용해야합니다. ObjectId = null 인 행을 삽입 할 수 있도록 임의의 사용자 또는 그룹을 참조하지 마십시오.

더 나은 디자인을 위해 당신이 ObjectId 열을 제거해야합니다 두 테이블 UserGroup에 새 열 AttributeId을 추가합니다.

0

두 개의 서로 다른 테이블에 하나의 열을 외래 키로 사용할 수 없습니다. 동일한 ID를 가진 그룹이 없으면 사용자에 대한 속성을 추가 할 수 없습니다. 물론 속성이 사용자 또는 그룹을위한 것인지 여부는 물론 알 수 없습니다.

의견에서 사용자와 그룹 간의 m : m 관계를 언급 했으므로 다음을 제안합니다.

create table [User] 
(
    UserID int identity primary key, 
    Name varchar(50) not null 
) 

go 

create table [Group] 
(
    GroupID int identity primary key, 
    Name varchar(50) not null 
) 

go 

create table UserGroup 
(
    UserID int not null references [User](UserID), 
    GroupID int not null references [Group](GroupID), 
    primary key (UserID, GroupID) 
) 

go 

create table UserAttribute 
(
    UserAttributeID int identity primary key, 
    Name varchar(50) not null, 
    Value varchar(50) not null, 
    UserID int not null references [User](UserID) on delete cascade 
) 

go 

create table GroupAttribute 
(
    GroupAttributeID int identity primary key, 
    Name varchar(50) not null, 
    Value varchar(50) not null, 
    GroupID int not null references [Group](GroupID) on delete cascade 
) 

참고 : 속성 테이블은 이전에 모르는 속성을 사용해야합니다. 속성은 실제 테이블의 필드 여야합니다. 고객 정의 속성에 대한 속성 사용을 예약하십시오.

+0

Mikael 대단히 감사합니다. – CloudAnywhere