두 개의 서로 다른 테이블에 하나의 열을 외래 키로 사용할 수 없습니다. 동일한 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
)
참고 : 속성 테이블은 이전에 모르는 속성을 사용해야합니다. 속성은 실제 테이블의 필드 여야합니다. 고객 정의 속성에 대한 속성 사용을 예약하십시오.
두 속성 테이블을 대신 고려해야한다고 생각합니다. 하나는 사용자 용이고 다른 하나는 그룹 용입니다. –
또는 상위 키의 트리거로 외래 키 및 제약 조건을 바꿔 삭제를 잡으십시오. – CloudAnywhere
나는 그렇지 않다. FK의 주요 목적은 계단식 삭제가 아닙니다. 존재하지 않는 사용자/그룹에 대한 속성을 추가하지 않도록해야합니다. UserId와 GroupId 모두에서 동일한 필드를 갖는 것은 좋지 않습니다. 두 테이블 대신 Attributes에 두 개의 열을 가질 수 있지만 내가 말한 것처럼 두 개의 테이블로 갈 것입니다. –