2011-03-04 10 views
1

간단한 토너먼트 시스템을 만들려고 노력 중입니다. 이제는 다른 벽으로 ... 테이블이 있습니다. Teams - 각 Team은 여러 경기에 참가할 수 있습니다. 4 열이 나는 Matches라는 이름의 표를하는 것에 대한 생각했습니다SQL : 디자인 데이터베이스가 토너먼트 디자인을 반영하도록

:

  • ID => 식별자를
  • Team2ID => 참고로 팀의 ID에
  • Team1ID => 참조 팀 ID
  • WinnerID => Team1ID 또는 Team2ID
  • 하나로서 동일한 값
01,

WinnerIDTeam1ID 또는 Team2ID과 같은 값을 확인하는 SQL 트리거를 갖습니다 ... 그렇지 않으면 트랜잭션을 롤백합니다.

Team myTeam1 = ... Get team1 ... 
Team myTeam2 = ... Get team2 ... 

Match myMatch = new Match { Team1 = myteam1, Team2 = myteam2; } 

: 나는 어떻게 저를 필요로하기 때문에이"집계 루트 당 저장소"등 여러 가지 "모범 사례"규칙을 부러 실현 될 때까지

이 방법은, 시작에서 완벽한 듯 Match 엔티티가 Team 엔티티에 대한 "하위 엔티티"로 정의되어 있으며 Team 엔티티를 통해서만 추가되어야하므로 잘못되었습니다.

내 필요에 맞게 데이터베이스를 올바르게 디자인하는 방법에 대한 제안 사항이 있으십니까?

+0

나는 문에 동의하는지 모르겠다을 Team2PointsScored "경기는 팀에 대한 자식 엔티티입니다." 이 둘은 관련이 있지만 일치는 독립적 인 검색이 필요합니다. DDD 원칙을 충족시키기 위해 설계를 과도하게 생각할 때 조심해야합니다. –

+0

@ 존 블레소소, 잘 ..Match 엔터티는 Team에 의존합니다. 참조 된 2 개의 Team 엔터티가 필요합니다. – ebb

+0

당신은 당연한 일이지만, 내 말은 "팀 X의 모든 경기를 나에게 줄 수 있습니다."가 아닌 다른 방식으로 경기를 원할 수 있다는 것입니다. " 이 경우 일치 항목을 검색하려면 팀 집계 루트가 아닌 다른 것이 필요할 것입니다. –

답변

1

방아쇠와 관련해서는 몇 가지 제약 조건을 사용합니다.

(Team1ID <> Team2ID) 
AND 
(WinnerID IS NULL OR Team1ID = WinnerID OR Team2ID = WinnerID) 

아마도 하나의 제약이 있습니다.

도메인 모델까지는 팀을 통해 경기를 추가 한 것이 아니라 토너먼트 인스턴스를 통해 경기를 추가 한 것으로 생각됩니다. Match = Tournament.NewMatch (Team1, Team2); 당신의 팀이 컵을 알고처럼 소리 때문에

알만, 팀을 만들거나 데이터베이스에서 검색하는 다음 등

라운드, 검진, 같은 고차 대회 규칙이있을 것, 그것은 갈 것 Cup.NewTeam (팀 이름) 또는 Cup.LoadTeam (팀 ID). Cup에 대해서도 여전히 의미가 있습니다 .NewMatch, 당신은 분명히 다른 컵에있는 팀들 사이에서 경기를하기를 원하지 않기 때문에.

+0

내 잘못 .. 설명해 ~ 내 토너먼트가 더 "컵"이다. 사용자가 팀 이름과 다른 4 명의 플레이어의 이름으로 등록한다. - 팀은 활성 컵에서만 사용되어야한다. 다음 잔에 사용할 수 있습니다. 'Team' 테이블에는'Cup' 테이블에 대한 참조를 가진'CupID'라는 컬럼이 있습니다. 그러면 어떤 팀이 활성 컵에 있는지 알 수 있습니다. – ebb

+0

@ebb 몇 가지 코멘트를 추가했습니다. 나는 아직도 당신의 컵이 관리 실체를 필요로한다고 생각하고 컵 실체 그 자체는 괜찮습니다. 필자는 회의 및 참석자와 같이 수년 동안 여러 회의에 참석할 수있는 등록 및 참석자가있는 회의 (회의)가 있지만 회의에서이 관계를 처리하는 경우가 종종 있습니다. –

+0

@Cade Roux - 알 겠어.하지만 'Match1' 테이블은'Team1ID'와'Team2ID' 권한을 검증하기 위해 여전히'Team' 테이블에 대한 참조가 필요합니까? – ebb

0

귀하의 모델 저장 방법은 무엇입니까? :)

점수를 매치 행에 저장하고이를 기반으로 승자를 결정하는 이유는 무엇입니까?

아이디, Team1Id, Team2Id, Team1PointsScored는,

+0

무승부로해야 할 일에 대한 규칙이 있으므로 경기는 무승부로 끝납니다. 팀 1 또는 팀 2가 경기에서 승리했는지 여부 만 필요합니다. 문제는 테이블을 디자인하는 것입니다. – ebb

+0

OK, 그렇다면 IsTeam1Winner라는 비트 열은 어떨까요? – CyberDude

+0

필자는 설명에 실패합니다 ... 필자의 글에서 설명했듯이,'Match' 테이블이'Team' 테이블을 참조하게 할 것인지 궁금해하고 있습니다. 제 코드는'Match' 이후의 집계 원칙에 따라 저장소를 위반합니다. 엔터티는 '팀'의 자식 개체가되지 않습니다. – ebb

관련 문제