2011-02-05 3 views
2

이 질문을하는 방법을 모르겠으므로 예제를 통해 내가 할 수있는 한 분명 할 것입니다.스키마 : 양방향 관계? 어떤 테이블/엔티티가 '환경 설정'을 소유해야합니까?

페이스 북과 같은 앱에서 프로필은 여러 개의 ProfilePictures를 가질 수 있습니다. 주어진 시간에 이들 중 하나가 "선택된"ProfilePicture입니다 (ProfilePicture가 업로드되었다고 가정).

본능적으로, 나는이 같은 모델 것 :

Table: Profile 
-------------- 
ProfileID 
SelectedProfilePictureId //fk to ProfilePicture 
Name, Age, Etc 

Table: ProfilePicture 
--------------------- 
ProfilePictureId 
ProfileId //fk to Profile, indicating which Profile this picture belongs to 
Url, DateTaken, Etc 

을이 시점에서, 이러한 테이블은 서로 지적하고 그냥 나에게 "잘못된"것으로 보인다. 그것은 쉽게 SelectedProfilePictures없이 프로필을 쿼리하거나 프로필의 SelectedPicture를 얻을 수 있지만 삽입과 업데이 트가 좀 어색합니다.

이 나쁜 형태입니까? 프로필 테이블이 ProfilePicture 테이블과 완전히 독립적이어야합니까? 데이터베이스 설계 이론에 따라 이것을 모델링하는 "올바른"방법이 있습니까, 아니면 프로그래머의 강점입니까?

답변

6

정확합니다. 순환 참조라고하며 실제로 데이터베이스로 만들 수 없습니다.

하나의 간단한 해결책은 그림의 하위 표에 "기본 설정"플래그입니다. 그러나 당신은 여기에 문제가 있습니다 : 주어진 사람을위한 한 줄만 선호 될 수 있습니다. 따라서 누구라도 새로운 사람을 선호하는 사람으로 표시하면 다른 사람은 모두 지워야합니다.

보다 안전한 해결책은 외부 키가있는 "preferredPictures"테이블을 Profiles 및 ProfilePictures에 추가하는 것입니다. profileId에서 고유하게 만들 수 있으므로 하나 이상의 항목을 가질 수 없습니다. 이렇게하면 이전 항목을 삭제 한 후 새 항목을 삽입합니다. 또는 물론 기존의 업데이트 만 수행 할 수 있습니다.

편집 의견 :. 어린이 1 :

1) 프로필 기 때문에 순환 참조는 기술적으로 1 인 것이 정보

Profiles 
    | | 
    | +-----> PreferredPicture 
    | +-----> 
    | | 
    \|/ | 
ProfilePictures 

2) 원하는 화면의 기본 키 profileID가되는 주위에 루프를하지 않고, 모두 하위 테이블 부모 프로필 테이블.

+0

Sql Server 2008 R2에서 순환 참조를 사용할 수있게 만들었지 만, 약간의 해킹이었습니다 (예를 들어, 새 ProfilePicture를 만들고 프로필의 SelectedProfileId 필드를 설정할 수는 없었습니다). – smalltowndev

+0

기본적으로 Profile 테이블이 더 이상 ProfilePicture 테이블을 참조하지 않기 때문에 세 번째 테이블이 순환 참조를 깰 것이라고 말하는 것입니까? 그리고 PreferredPictures 테이블은 각각의 Profiles와 ProfilePictures 테이블과 일대일 관계를 가질 것입니다.PreferredPictures 테이블의 기본 키는 무엇입니까? (매우 많은 질문에 대해 유감스럽게 생각한다!) – smalltowndev

+0

그것은 이해된다. .. 정보와 ascii 예술에 감사드립니다! 나는이 사이트에서 15 개의 "평판"을 얻을 수있게 되 자마자 당신의 답을 upvote 할 것입니다. – smalltowndev

1

왜 ProfilePicture 테이블에서 ProfileID를 유지해야합니까?

이 필요하면 당신은 당신이 연결을 구축하는 3 표해야 할 수 있습니다

profileID가를 < -> ProfilePictureID

내가 전에 다른 프로젝트의 "순환 참조"의 종류와 작업 한
+0

그래서 ProfilePicture 테이블은 Profile 테이블에 대해 알 필요가 없습니까? 단지 이미지를 묘사하는 것이고, 세 번째 테이블은 프로필을 프로필 사진과 관련시킬 것입니까? 세 번째 테이블도 "선택"된 ProfilePicture를 저장할 수 있습니까, 아니면 다른 테이블에 있을까요? – smalltowndev

+0

Profilest에 Picturestable이 저장되어있어 프로필 X에 속한 모든 그림을 선택할 수 있습니다. 각 피벗은 하나의 프로필에만 속합니다. 또한 어떤 그림이 선택된 프로필 사진인지 알아야합니다. 선택한 항목 만 true로 설정하는 부울 IsSelectedProfilePicture-Column을 만들거나 참조를 유지하는 세 번째 테이블을 만드는 것이 더 좋습니다 프로필 및 그림. – CloudyMarble

+0

+ "3 표" – onedaywhen

1

.

Profile.SelectedProfilePictureId가 Nullable이고 ProfilePicture.ProfileId가 필수이면 괜찮습니다. 오직 두 개의 fk를 필수로 설정해야만 불가능합니다.

관련 문제