복붙노트

[SQL] 사거리 표 디자인 - 많은 관계 디자인에 많은

SQL

사거리 표 디자인 - 많은 관계 디자인에 많은

나는 더 나은 디자인은 다 대다 관계에 대한 교차 테이블이 무엇인지 궁금하네요.

내가 고려하고있는 두 가지 방법은 다음과 같습니다 :

CREATE TABLE SomeIntersection 
(
     IntersectionId UNIQUEIDENTIFIER PRIMARY KEY,
     TableAId UNIQUEIDENTIFIER REFERENCES TableA NOT NULL,
     TableBId UNIQUEIDENTIFIER REFERENCES TableB NOT NULL,
     CONSTRAINT IX_Intersection UNIQUE(TableAId, TableBId )
) 

또는

CREATE TABLE SomeIntersection 
(
     TableAId UNIQUEIDENTIFIER REFERENCES TableA NOT NULL,
     TableBId UNIQUEIDENTIFIER REFERENCES TableB NOT NULL,
     PRIMARY KEY(TableAId, TableBId )
) 

다른 통해 하나가 혜택이 있습니까? 편집 2 : **** 참고 : 나는 데이터베이스에 대한 API를 제공하는 엔티티 프레임 워크를 사용할 계획입니다. 염두에두고, 다른보다 EF와 함께 하나의 솔루션으로 작업을 잘합니까?

EDIT : 두 열이 같은 테이블 (아래 예)를 참조하는 교차 테이블 관련 메모에서 두 개의 필드가 레코드에 상이 할 수있는 방법이 있는가?

CREATE TABLE SomeIntersection 
(
     ParentRecord INT REFERENCES TableA NOT NULL,
     ChildRecord INT REFERENCES TableA NOT NULL,
     PRIMARY KEY(TableAId, TableBId )
)

나는 다음을 방지 할

ParentRecord          ChildRecord
=================================
      1                    1         --Cyclical reference! 

해결법

  1. ==============================

    1.두 번째 버전은 별도의 인덱스의 생성을 방지, 나를 위해 최고입니다.

    두 번째 버전은 별도의 인덱스의 생성을 방지, 나를 위해 최고입니다.

  2. ==============================

    2.그것은 어떤 토론의 주제입니다. 나는 더 나은 하나의 값으로 매핑 행을 조회 할 수 있도록 고려하기 때문에 첫 번째 양식을 선호하고, 반드시 모든 테이블에서 사용할 수있는 단일 열 기본 키를 가진의 아마도 - 어리석은 일관성을 적용 할 것을 좋아합니다. 다른 사람들은 그 열을 갖는 공간의 바보 낭비라고 생각합니다.

    그것은 어떤 토론의 주제입니다. 나는 더 나은 하나의 값으로 매핑 행을 조회 할 수 있도록 고려하기 때문에 첫 번째 양식을 선호하고, 반드시 모든 테이블에서 사용할 수있는 단일 열 기본 키를 가진의 아마도 - 어리석은 일관성을 적용 할 것을 좋아합니다. 다른 사람들은 그 열을 갖는 공간의 바보 낭비라고 생각합니다.

    우리는 뉴저지에있는 바 두 달에 한 번씩에서 베어 너클 권투의 몇 라운드 만난다.

  3. ==============================

    3.사용 버전-1 당신의 "교차"실제로 의미 그 자체 엔티티 인 경우 :

    사용 버전-1 당신의 "교차"실제로 의미 그 자체 엔티티 인 경우 :

    사용자 버전 2는 순수 N-M 관계 테이블 인 경우. 이 경우에 해당해야합니다 :

    두 경우 모두 당신은 당신이 종종 관계의 다른 측면에서 검색하면, 2 열을 포함하는 다른 인덱스를 만들 수 있지만 다른 순서로 할 수 있습니다.

  4. ==============================

    4.첫 번째로 갈 경우, 단지 PK에 IDENTITY를 사용하여, 당신은 고유 식별자와 공간 (디스크 및 메모리 캐시)을 낭비 할 필요가 없습니다.

    첫 번째로 갈 경우, 단지 PK에 IDENTITY를 사용하여, 당신은 고유 식별자와 공간 (디스크 및 메모리 캐시)을 낭비 할 필요가 없습니다.

  5. ==============================

    5.당신은 무엇을 구축하는 것은 "교차로"라고합니다.

    당신은 무엇을 구축하는 것은 "교차로"라고합니다.

    나는 교차로 관계가 거의 항상 그 자체의 실체 말하는 학교에서 내 데이터베이스 교수의 아주 명확한 메모리를 가지고 있고, 그래서 그것을 위해 일반적으로 가치가 할당하는 공간 같은입니다. 이 전보다 "올바른"임을 나타냅니다.

    그건 내가 개인적으로 후자를 선호하는 경향이 말했다. 정말 당신이 이제까지 직접 이러한 기록 중 하나를 검색할지 여부에 온다 또는 당신은 단지 테이블을 사용합니다 경우 원래의 테이블 중 하나에 가입 할 때.

  6. ==============================

    6.개발자의 관점보기에서, 나는 전자를 선호한다. 그것은 처리 할 때 쓰기 및 테스트에 더 쉽습니다.

    개발자의 관점보기에서, 나는 전자를 선호한다. 그것은 처리 할 때 쓰기 및 테스트에 더 쉽습니다.

    두 개의 키가 고유 레코드를 검색하는 내가 확인 할 필요가 없습니다.

  7. ==============================

    7.교차로 테이블에 추가 필드가되지 않습니다 정말 자신의 ID를 필요로하지 않으며, 하나를 추가하면 어떤 혜택을 추가하지 않습니다. 해당 테이블에 다른 필드를 가하고 될거야 경우, 많은 경우에 당신은, 그것은 기본 키와 같은 자신의 ID가 있어야합니다.

    교차로 테이블에 추가 필드가되지 않습니다 정말 자신의 ID를 필요로하지 않으며, 하나를 추가하면 어떤 혜택을 추가하지 않습니다. 해당 테이블에 다른 필드를 가하고 될거야 경우, 많은 경우에 당신은, 그것은 기본 키와 같은 자신의 ID가 있어야합니다.

    엄지 손가락의 규칙, 물론,하지만 당신은 거기 가서.

  8. ==============================

    8.두 번째 질문에 대답 ...

    두 번째 질문에 대답 ...

    당신은 다음과 같이 점검 제한 조건을 추가해야합니다 :

    CREATE TABLE SomeIntersection 
    (
         ParentRecord INT REFERENCES TableA NOT NULL,
         ChildRecord INT REFERENCES TableA NOT NULL,
         PRIMARY KEY(TableAId, TableBId),
         CHECK (ParentRecord <> ChildRecord)
    )
    
  9. ==============================

    9.첫 번째의 장점 :

    첫 번째의 장점 :

    능력은 하나의 값으로 테이블을 조인 찾아 볼 수 있습니다. 이것은 클라이언트 측면에서 보면 최대 작업 간단합니다.

    일부으로 ORMs (NHibernate에)도 제대로 작동하려면 지속성에 대한 각 엔티티의 ID를 필요로한다.

    두 번째의 장점 :

    추가 인덱스를 생성 할 필요없이 간단한 데이터 모델.

    적은 메모리가 필요합니다.

  10. ==============================

    10.두 번째는 더 좋다. 동일한 쌍 이상의 모양을 가지고 있지에 접합 상자 (교차로 박스)를 제한한다. 정션 박스에 다른 열이없는 경우, 당신은 두 개의 외래 키의 방법에 의한 경우를 제외 어쨌든,이 테이블의 조회를 수행하지 않습니다.

    두 번째는 더 좋다. 동일한 쌍 이상의 모양을 가지고 있지에 접합 상자 (교차로 박스)를 제한한다. 정션 박스에 다른 열이없는 경우, 당신은 두 개의 외래 키의 방법에 의한 경우를 제외 어쨌든,이 테이블의 조회를 수행하지 않습니다.

  11. ==============================

    11.TableAId-TableBId 조합이 고유 점을 감안 테이블 내가 두 번째 옵션과 함께 갈 것 대다 관계를 implemet하기 위해서만 사용된다. 순전히 논리적 관점에서 주먹 implemtnation 번째로 감소시킨다. 구조적 관점에서 데이터베이스는 기본 키 / 인덱스뿐만 아니라 그것은 단지 기본 키 / 인덱스를 maitain해야하는 두 번째의 첫 번째 구현 wereas에 제약을 모두 유지해야합니다.

    TableAId-TableBId 조합이 고유 점을 감안 테이블 내가 두 번째 옵션과 함께 갈 것 대다 관계를 implemet하기 위해서만 사용된다. 순전히 논리적 관점에서 주먹 implemtnation 번째로 감소시킨다. 구조적 관점에서 데이터베이스는 기본 키 / 인덱스뿐만 아니라 그것은 단지 기본 키 / 인덱스를 maitain해야하는 두 번째의 첫 번째 구현 wereas에 제약을 모두 유지해야합니다.

  12. from https://stackoverflow.com/questions/977615/many-to-many-relation-design-intersection-table-design by cc-by-sa and MIT license