1

PHP 웹 응용 프로그램을 빌드하고 Codeigniter + DataMapper (OverZealous 버전)을 사용하기로 결정했습니다.일대 다 관계가있는 경우에도 연관 테이블을 사용하여 성능 향상 또는 감소

DataMapper (OverZealous edition)은 실제로는 일대 다 관계가있는 경우에도 추가 연결 테이블을 사용해야 함을 발견했습니다.

예를 들어 한 국가에는 많은 플레이어가있을 수 있지만 플레이어는 한 국가에만 속할 수 있습니다. 일반적인 데이터베이스 설계는 다음과 같이 될 것이다 :

[countries] country_id(pk), country_name 
[players] player_id(pk), player_name, country_id(fk) 

그러나, DataMapper에,이처럼되고 설계가 필요합니다

[countries] country_id(pk), country_name 
[players] player_id(pk), player_name 
[asso_countries_players] countries_players_id(pk), country_id(fk), player_id(fk) 

나중에 우리는 플레이어 우리의 마음이 바뀌면 때문에 유지 보수에 대한 좋은 둘 이상의 국가에 속할 수 있습니다. 아주 적은 노력으로 완료 될 수 있습니다. 전형적인 디자인에 비해

하지만 같은 데이터베이스 설계에 대해 알고 싶은 것이, 일반적으로 어떤 성능 이득 또는 손실이? 더 의미합니다 데이터 검색을 선택

+0

죄송합니다. 실수를했습니다. 그것은 DataMapper의 원래 버전입니다. OverZealous 버전이 아닙니다. OverZealous 버전에는 1 : N 관계에 대한 추가 조인 테이블이 필요하지 않습니다. – bobo

답변

3

"무엇을 할 수있는 가장 빠른 방법은 전혀하지 않는 것입니다." - Cary Millsap, 오라클 성능 최적화.

는 "디자이너는 그가 진정한 우아함을 달성했다 알고하지 아무것도 추가 왼쪽,하지만이있을 때 아무것도 빼앗아 남아 있지있을 때." - 앙투안 드 생 텍쥐페리

더 단순한 구현은 두 개의 테이블 세 인덱스,이 독특한이있다. 더 복잡한 구현은 세 개의 테이블과 다섯 개의 인덱스를 가지며, 네 개의 고유 한 인덱스가 있습니다. (대리 ID해야 ? - 채드 오초 싱코 (옛 성은 존슨) 그랬던 것처럼 그들은, 결혼 또는 법적를 변경하는 경우처럼, 플레이어의 이름을 변경하는 경우 발생하는) asso_countries_players.player_name에 인덱스도를 시행 할 고유해야합니다 0..1 선수와 국가 간의 관계의 본질.

연관 개체가 데이터 모델에서 필요하지 않은 경우이를 제거하십시오. 일반적으로 0..1 관계 또는 1..n 관계를 n .. 관계로 변환하는 것은 매우 사소합니다.N 관계 :

  1. 가 연관 엔티티를 추가 (내가 관계 자체가 시작 또는 종료 날짜와 같은 특성을 가지고있다하지 않는 대용 키의 필요성에 의문을 제기 것) 기존 데이터
  2. 을 가진
  3. 채우기 연관 기업
  4. 외래 키 제약 조건을 다시 구현하십시오.
  5. 하위 테이블의 대체 외래 키 열을 제거하십시오.
+0

"더 많은 일을하는 데 더 오래 걸립니다"라는 매우 멋진 말입니다. :-) –

2

조인 : 당신이 쿼리를 더 의미 삽입합니다 2.

삽입 데이터 대신 3 개 테이블에서 작동해야합니다 : 당신이 3 표를 삽입하는 대신이해야합니다 . 회전에서 공연 조금을 해칠 수있는 -

그래서 나는이 조금 더 많은 작업을 의미 할 수 같은데요. 이 때문에

1

내가 개인적으로 연관 테이블을 사용하지 않는 게 좋을 일대 하나, 그것은 완전히 불필요하다.

이 결정으로 인해 성능이 크게 떨어지지는 않을 것입니다. 그러나 데이터의 컨텍스트에 대해서도 생각해보십시오. 일부 프로그램에서는 사용자에게 알려주므로 데이터를 이해하기 때문에 그렇게하지 마십시오.