2011-08-18 2 views
0

Person 테이블과 Song 테이블과 Person_Song 테이블이 다른 두 테이블간에 다 대다 조인 테이블이라고 가정 해 봅시다.집계 엔티티의 확인 된 부재를 추적하는 기능을 어떻게 모델링합니까?

노래에 대한 모든 가사를 알고있는 사람은 Person_Song 테이블에 레코드가 삽입됩니다. 그 사람이 3 곡을 알고 있으면 3 개의 레코드가 삽입됩니다. 좋아 ... 쉬운 물건.

그래서 우리는 100 명에게 설문 조사를 보냅니다. 대부분의 사람들이 설문 조사를 작성하고 2 곡 또는 3 곡을 입력하게됩니다. 어떤 사람들은 설문 조사를 전혀 작성하지 않을 것입니다. 그리고 설문 조사를 작성하고 "모든 노래에 가사를 모르겠습니다"라고 적어주는 사람들이 있습니다.

노래를 지정하지 않은 상황과 제로 노래를 명시 적으로 명시한 상황을 구분하고 싶습니다.

데이터베이스에서이 조건을 추적하는 가장 좋은 방법은 무엇입니까? 이것에 대한 잘 알려진 패턴이 있습니까?

1) "알려진 노래"(같은 ID == 0 또는 무언가)에 대한 노래 테이블에 항목을 작성 : 여기

내가 가진 몇 가지 생각을합니다. 명시 적으로 노래를 모르는 경우 명시된 후 Person_Song 테이블에 단일 레코드를 삽입하십시오. 또한이 레코드가 할당 된 다른 레코드가있는 경우이 레코드가 삽입되지 않도록 DB 제약 조건 또는 코드를 통해 적용해야합니다. 이것은 확실히 "해킹"이지만, 나는 그것이 효과가있을 것이라고 생각합니다.

2) 이라는 테이블을 만들고 Person 테이블과 1 : 0 또는 1의 관계가 있어야합니다. Person에 대해이 플래그가 설정되면 레코드가 삽입됩니다. 소급하여 Person_Song 테이블에 레코드를 추가하면이 레코드를 삭제하거나 레코드의 플래그를 업데이트합니다. 이것은 효과적이고 해킹이 덜한 것처럼 보이지만, 첫 번째 해결책과 거의 같은 양입니다.

내 필요성을 더욱 복잡하게 만드는 이유는 다른 aggreate 엔티티도 추적해야하기 때문입니다. 따라서 Movie 테이블과 사람이 본 영화를 추적하는 Person_Movie 조인 테이블이 있다고 상상해보십시오. 또한 우리는 Book 테이블과 사람이 읽은 책을 추적하는 Person_Book 조인 테이블이 있다고 상상해보십시오. 이러한 모든 엔티티에 대해, 나는 어떤 사람이 집합체의 어떤 형태에 대해서도 잘 모른다는 것을 명시 적으로 인정했는지 추적 할 필요가있다.

3) 만들기 별도의 테이블이 PersonNoKnownEntityStatus라고는 Person 테이블과 Entity 테이블 간의 다 대다 관계를 가지고, Entity가 포함되어 있습니다

그래서 나는이 세 번째 디자인을 위해 문을 열어 가정 조회 기록 노래, 영화 및 도서. 해당 사용자가 영화를 본 적이 없다는 것을 인정하면 Person ID와 Movie 행에 대한 연관된 ​​Entity 레코드에 대한 레코드가 삽입됩니다. 책과 노래도 마찬가지입니다 ...

다른 디자인을 고려해야합니까?

(편집) Person 테이블에 새 열을 추가 할 가능성을 언급하는 것을 잊었습니다. 이것들은 불리언 플래그이거나 엔티티의 명시 적 부재를 나타내는 비트 마스크 일 수도 있습니다. Person 테이블에 이미 많은 논쟁이 있었기 때문에이 솔루션을 피하고자했습니다.

답변

1

나는 클라이언트가 "특별한"기록에서 의미를 추론 솔루션을 싫어한다, 그래서 당신의 옵션을 선택하지 않을 1. 옵션 3 우리가 말은 당신이 표시 한대로, 그것은 확장 정확히 기록 할 것으로 보인다

그러한 많은 부정적인 반응들.

한 가지 문제 : 데이터베이스는 모순적입니다. 데이터베이스에는 "나는 노래 A를 알고있다"는 사람과 "나는 노래를 모른다"라는 사람에 대한 두 개의 레코드가 포함될 수 있습니다. 이것은 일어나지 않아야하지만 일어나는 것을 방지하는 것은 번거 로움의 전체 부하입니다.

관련 문제