2009-11-04 6 views
2

나는 2 개의 데이터베이스 테이블을 가지고있다 : 팀과 게임.2 대 다 데이터 관계를 many-to-many로 취급해야합니까?

이 질문의 목적을 위해 우리는 축구 (축구) 팀과 게임을 다루고 있습니다.

각 게임에는 정확히 2 팀이 있지만 일반적으로 홈 팀과 원정 팀이 있습니다.

제 질문은 Games 테이블 (home_team_id, away_team_id)에서 2 개의 외래 키를 사용하여이 데이터 관계를 나타내야하는지 또는 games_teams 테이블과 many-to-many 관계를 사용하여이 둘을 연결해야하는지 여부입니다. 나는 팀이 집이나 떨어져있는 팀인지 여부를 조금이라도 남겨 두어야 할 것입니다.

혼란을 줄이기 위해 KohanaPHP에서 ORM 라이브러리를 사용하고 있는데,이 경우 fk는 team_id 또는 링크 테이블이 2 열만 포함될 것으로 기대됩니다. KohanaPHP에서이 문제에 경험이 있으신 분은 회신을 남겨주세요. 그렇지 않으면 일반적인 조언도 많이 있습니다.

+0

것은 (이 함께 멀리 가지 않을 경우 당신이 games_teams 피벗 테이블을 설정 한 경우, 다음을 수행 할 수 있습니다 중립 장소에서 게임 등), 간단하게 말하면 좋겠다. 한 번 비슷한 것을했고 게임 테이블에 두 개의 외래 키가있는 것 같았습니다. 그러나 내가 도와 드릴 수없는 것은 KohanaPHP 항목입니다.이 답변으로 게시하지 않습니다;) – Franz

+1

생각 주셔서 감사합니다, 모두가 2 fk를 사용하는 것에 동의하는 것 같습니다. Malphas에 대한 답변은 처음이었고 (나와 같은) 많은 것이 없었습니다. :) – Matt

+2

WTF에게 다음과 같은 프로그래머가 오지 않았고 관계가 어떻게 작동하는지 궁금합니다. –

답변

3

데이터베이스 서버에서 "Xth 정규형"배지를 고정하려면 다 대다로 처리해야합니다. 그렇지 않으면 쿼리 오버 헤드가 줄어들 것이라고 생각해야합니다. 을 통해 조인하려는 테이블이 1 개 더 적습니다. 시간마다 유용한 데이터가 필요합니다.

+0

나는 동의하지 않습니다. . 두 테이블 디자인은 최소한 BCNF이고,이 경우 더 이상 쓸모가 없을 것입니다. –

+0

윌보다 12 초 앞서 또한 정확합니다. De-normalization은 친구가 될 수 있습니다. –

8

두 개의 열만 사용하십시오. 그렇지 않으면 결합 자 테이블에서 한정해야합니다. 이것은 마치 수면 시간 폭탄과 같지 않습니다. 갑자기 언젠가는 많은 것을 가질 필요가 있음을 알게 될 것입니다.

+1

+1 수면 시간 폭탄에 –

+0

규칙이 6 개 팀이 육각형으로 진행되도록 변경 될 수도 있습니다 ... –

+4

심각하게 생각합니다. 윌이 맞습니다. 그것은 더 빠르며, 특정 요구 사항은 곧 바뀔 것입니다. –

5

2 개의 열이 내 생각에 여기에 완벽하게 적합합니다. 게임에 대해 두 팀만있을 수 있다는 사실은 두 개의 열을 가짐으로써 데이터베이스 스키마에 반영됩니다. 연결 테이블을 도입하면 단일 게임에 2 개의 원정 팀과 2 개의 원정 팀이있을 수 있으며이 시나리오가 발생하지 않도록 추가 검증이 필요하다는 가능성을 소개합니다. 사물을 두 컬럼에 격리시킴으로써 스키마는 본질적으로 데이터 무결성을 강화합니다.

+0

올바르지 않습니다. 두 열이 고유하다고 지정하면 –

+0

죄송합니다, 조금 명확하지 않을 수 있습니다. 내가 말한 것은 연결된 테이블 접근 방식이 2 개의 홈 팀 (또는 모든 숫자)의 가능성을 허용하기 때문에 유효성 검사가 필요하다는 것입니다. 당신은 칼럼이 두 칼럼 접근법으로 독특해질 수 있다는 것이 맞습니다. –

2

정규화 관점에서 : 예. one-to-many 또는 many-to-many만이 하나 이상의 one-to-many 관계로 분류됩니다.

그러나 현실적으로 말하면, 나는 성별과 같은 것을 구하십시오. 정말이 다중 상태 및 datetime 스탬프가 첨부해야합니까?

놀랍게도 대답은 '예'입니다.하지만 사업상의 이유로 성 변경 사항을 추적해야하는 경우에만 가능합니다. 가장 실용적인 목적으로 대답은 '아니오'입니다.

나는 하나의 테이블을 두 개의 키로 유지할 것입니다.

1

당신이 추상화 한 방법에 따라, 나는 축구 팀이 2 개의 팀을 가져야한다고 말합니다.이 경우 게임 테이블의 열을 더 편리하게 사용할 수있을뿐만 아니라 더 정확합니다.

팀 ID가 게임의 기본 키의 자연스러운 부분이라고 상상할 수도 있습니다.

1

완전히 별개의 테이블이 없어야한다고 생각합니다. 프로그래머가 쉽고 DB를 쉽게 사용할 수 있습니다. ifs에 대해 생각하기에 좋지만 이미 들었던 것처럼 들립니다. 정규화가 항상 모든 것을 추구하는 방법이라고 생각하지 마십시오.

1

나는 두 개의 열을 사용하는 것이 최선의 선택이라고 말하면서 다른 대답을 존중합니다. 그러나 Kohana에서 ORM 라이브러리를 사용한다고 언급합니다. 게임 테이블에서 두 개의 열을 사용하면 다 대다 관계에 대한 ORM 기능이 손실됩니다. 그런 다음

$game = ORM::factory('game', 1); // 1 is the game id 

당신이 게임에서 팀을 통해 루프 수 :

foreach ($game->teams as $team) { 
// do stuff with $team 
}