2011-11-11 4 views
0

내 응용 프로그램에서 지원하는 가능한 모든 메시지를 저장하려는 "메시지"테이블이 있다고 가정합니다. 예를 들어 FB와 유사한 응용 프로그램에는 "미디어 메시지"(예 : 사진, 비디오, 오디오), "미디어 앨범 메시지", "개인 메시지"등이있을 수 있습니다.이 모델을 작성하는 한 가지 방법은 다음과 같습니다.데이터베이스 디자인 : NULL 인 FK는 좋든 나쁘지?

Table: message 
- messag_id (PK) 
- user_id (FK, this is the sender of the message) 
- message 

TABLE: media_message 
- media_message_id (PK, receiver of the message implied by the owner of the media) 
- message_id (FK) 

TABLE: media_album_message 
- media_album_message_id (PK, receiver of the message implied by the owner of the media album) 
- message_id (FK) 

TABLE: private_message 
- private_message_id (PK) 
- message_id (FK) 
- user_id (FK, receiver of the message) 

... etc. 

그래서 모든 유형의 메시지에 대해 "매핑 테이블"을 만들어야합니다. 이 작품 같은

겠습니까 뭔가 :

TABLE: message 
- message_id (PK) 
- receiver_user_id (FK) 
- sender_user_id (FK) 
- message 
- media_album_id (FK, NULL allowed) 
- media_id (FK, NULL allowed) 

나는 아직도 참조 무결성을 적용 할 수있는이 디자인으로 생각합니다. media_album_idmedia_id이 둘 다 NULL이면 "개인"메시지라고 가정 할 수도 있고 응용 프로그램 계층에서 유사한 논리를 구현할 수도 있습니다. 아래쪽 면도 아래쪽 면도 항상 사용되지 않는 컬럼이 있습니다. 그럼 다시, 어쩌면 이것은 더 나은 규모가 될 것입니다 - 적은 JOINs 등

생각들?

답변

1

나쁜. nullable "foreign key"는 피하십시오. 그들은 여러 가지 단점이 있습니다.

외래 키에 null이 포함되어있는 경우 참조 행에 대한 제약이 항상 적용되는 것은 아닙니다. 그러나이 기본 동작은 다른 DBMS간에 일관성이 없습니다. 일부 DBMS는 nullable 외래 키의 동작을 변경하는 구성 옵션을 지원하지만 일부는 지원하지 않습니다. 따라서 SQL 개발자와 사용자는 null 허용 가능 외래 키 제약 조건이 실제로 데이터 무결성 관점에서 무엇을 의미하는지에 대해 명확하지 않을 수 있습니다. DBMS 제품 간 또는 동일한 제품을 사용하는 다른 서버간에 데이터베이스를 이식하면 일관성없는 결과가 발생할 수 있습니다.

데이터베이스 디자인 도구, 통합 도구 및 기타 소프트웨어가 항상 해당 도구를 올바르게 지원하지 못하고 생성 된 결과가 잘못되었을 수 있습니다.

외래 키는 조인 및 다른 쿼리 논리에서 자주 사용되어 제한 조건이 아닌 경우 효과가 있다고 생각하는 사용자에게 문제를 복잡하게합니다.

논리적 인 측면에서 볼 때 nullable "foreign key"제약 조건은별로 논리적이지 않습니다. SQL 표준에 따르면 이러한 제약 조건은 참조되는 테이블이 비어 있더라도 위반되지 않을 수 있습니다. 이는 null을 사용하는 가장 일반적인 주장 중 하나 인 "알 수없는"사례를 나타냅니다. X의 유효한 값이 없다면 "알 수없는"X는 확실히 유효한 값이 될 수 없으며 SQL은이를 허용 할 것입니다!

마지막으로 필요하지 않습니다. 널 (NULL)이 필요하지 않도록 항상 테이블을 구성 할 수 있습니다. 따라서 단순성과 정확성을 위해 null을 넣는 것이 더 바람직합니다.

1

FK는 데이터 무결성을 보장하기 위해 2 개의 테이블간에 참조 제약 조건 설정입니다. FK는 NULL이 될 수 없습니다. media_album_id & media_id가 Null 인 경우 FK가되어서는 안됩니다.

+2

NULL 가능 FK는 허용되며 선택적으로 존재하는 관계에 문제가되지 않습니다. –

+0

래리, dportas의 의견에 대해 어떻게 생각하십니까? – StackOverflowNewbie