2010-05-17 3 views
0

나는 db에서 일하고있다. 그러나 나는 이것에 대해 약간 새로운 것이므로 지금 문제에 부딪 혔다. 몇 가지 테이블이 있습니다 : 사무실, 객실, 직원 및 문서. 문서에는 보낸 사람을 지정해야합니다. 보낸 사람은 단일 직원, 전체 회의실 또는 전체 사무실 일 수 있으므로 해당 테이블의 기본 키에 대한 참조가 있어야합니다. 처리 할 "병렬"테이블을 사용해야합니까 (예 : 여러 수신자 문서 처리 용으로 한 것) 다른 방법이 있습니까? 감사합니다.SQL에서 다중 참조

+0

스키마에 대해 더 많이 게시 할 수 있습니까? 아직 받아 보지 못했습니다. – vodkhang

+0

물론, 나는 3 개의 테이블 : 사무실, 객실 및 직원을 보유하고 있습니다. 그들은 자신의 ID (기본 키)와 다른 정보가있는 컬럼을 가지고 있습니다. 그런 다음 다른 테이블 (예 : 직원, 방 또는 사무실 전체)에서 하나, 하나 뿐인 열이있는 다른 테이블 인 DOCUMENT가 있으므로 다른 테이블 테이블의 기본 키 (따라서 ID가 ab34 인 방 A2에 문서를 작성한 경우 ID가 kv45 인 직원 Kevin 인 경우 "발신자"장소에 ab34를 쓸 수 있으므로 kv45를 쓸 수 있습니다. 도움이 되었으면 좋겠다. – AGarofoli

답변

1

하나만 값을 가질 수 있도록하는 점검 제한 조건으로 세 테이블 각각에 외래 키가 있어야합니다. 이 방법으로 표준 참조 무결성을 계속 사용할 수 있습니다. Btw, 이것은 비즈니스 규칙은 각 문서가 하나의 발신자 만 가져야한다는 것을 전제로합니다.

Create Table Document 
(
    SenderEmployeeId ... 
    , SenderRoomId ... 
    , SenderOfficeId.... 
    , Constraint CK_Document_SingleSender Check (Case 
                When SenderEmployeeId Is Not Null And SenderRoomId Is Null And SenderOfficeId Is Null Then 1 
                When SenderRoomId Is Not Null And SenderEmployeeId Is Null And SenderOfficeId Is Null Then 1 
                When SenderOfficeId Is Not Null And SenderEmployeeId Is Null And SenderRoomId Is Null Then 1 
                Else 0 
                End = 1) 
)
+0

예, 문서에는 발신자가 한 명만있을 수 있으므로 체크 제약 솔루션을 사용할 것입니다. 고마워요 – AGarofoli

0

SQL Server에서 수행 할 수없는 조건부 외래 키를 만들려고합니다. Document와 Sender를 보관할 테이블을 만드는 것이 좋은 생각이지만 외래 키를 만들 수는 없을 것입니다. 그래도 데이터를 제어하기 위해 Check Constraint을 구현할 수 있습니다.

+0

너무 잘 체크 contraint 몰라하지만 그것은 최고의 솔루션 것 같습니다. 링크 주셔서 감사합니다! – AGarofoli

0

필자가 언급 한 것처럼 병렬 테이블로 구현할 것입니다. 표는 다음과 같은 것이다 :

OfficeDocuments (OfficeID, DocumentID)

RoomDocuments (RoomID, DocumentID)

EmployeeDocuments 당신은 디자인보다 유연한 쿼리를 디자인 할 수

(직원 ID, DocumentID) 예를 들어 Room 및 Office 테이블에 대한 조인은 직원 목록을 얻는 것과 같습니다.

선택하는 방법은 유연성이 얼마나 필요한지에 따라 달라집니다. 이 테이블과 함께 사용하기 위해 하나 또는 두 개의 쿼리 만 디자인하는 경우 대신 (테이블 제약 조건을 사용하고 보낸 사람이 될 수있는 테이블 유형마다 여러 속성을 사용하여) 비정규 화 된 테이블을 만드는 것이 좋습니다.

+0

내가 가지고 있어야하는 유일한 쿼리는 누가 문서를 작성했는지 확인하게 해주는 것이고, 체크 제약은 "병렬 테이블"방법보다 쉽게 ​​만들 것이지만 당신이 옳다. 이것은 더 유연한 해결책이다. 지금은 유연하지 않아도 곧 솔루션을 전환해야 할 수도 있습니다. 아마도 둘 다 시도하고 어느 것이 더 잘 작동하는지 확인해 볼 것입니다. 고마워요! – AGarofoli

관련 문제