[SQL] SQL : 마 당신은 많은-많은 테이블의 자동 증가 기본 키를해야합니까?
SQLSQL : 마 당신은 많은-많은 테이블의 자동 증가 기본 키를해야합니까?
당신은 예술가와 팬 사이에 많은 - 많은 테이블을 말해봐. 이 테이블을 디자인에 올 때, 당신은 같은 테이블을 설계 할 :
ArtistFans
ArtistFanID (PK)
ArtistID (FK)
UserID (FK)
(ArtistID and UserID will then be contrained with a Unique Constraint
to prevent duplicate data)
아니면 두 개의 관련 분야에 대한 복합 PK를 사용하여 구축 할 :
ArtistFans
ArtistID (PK)
UserID (PK)
(The need for the separate unique constraint is removed because of the
compound PK)
이전 스키마를 사용하는 모든 장점 (어쩌면 색인?)가 있습니까?
해결법
-
==============================
1.
ArtistFans ArtistID (PK) UserID (PK)
자동 증분의 PK의 사용은 부모 테이블을 경우에도, 여기에는 장점이 없습니다.
또한도 (사용자 ID, ArtistID 순)에 자동으로 "역 PK"인덱스를 만들 것입니다 : 당신이 모두 열로 테이블을 조회 할 것이기 때문에 당신이 그것을 필요로 할 것이다.
일련 번호 / ID 열은 자신의 자리가 있습니다. 당신은 물리적 플랫폼을 기반으로 정규화 과정 후 어떤 일을 개선하기 위해 그들을 선택할 것입니다. 하지만 링크 테이블 : 당신의 뇌사의 ORM가 주장하는 경우, 다음으로 ORMs를 변경 ...
[편집] 2012 년 10월
그것은 당신이 여전히 고유의 필요 거라고 노트 (사용자 ID, ArtistID 순) 및 (ArtistID 순, 사용자 ID) 인덱스에 중요합니다. 자동 단위를 추가하면 바로 사용할 수 없습니다 (그냥 디스크에 메모리에) 더 많은 공간을 사용
-
==============================
2.이미 대리 키 (당신은 좋은 회사에있어)의 신봉자임을 가정하면, 모든 길을 갈을 위해 할 수있는 경우가있다.
이미 대리 키 (당신은 좋은 회사에있어)의 신봉자임을 가정하면, 모든 길을 갈을 위해 할 수있는 경우가있다.
때때로 잊어되는 중요한 점은 자체 특성을 가지고 할 수있는 관계입니다. 종종 두 가지가 관련되어 있음 상태로는 충분하지 않습니다; 당신은 그 관계의 본질을 설명 할 수도 있습니다. 즉, 그것은 단지 두 개의 열을 가질 수있다라는 관계 테이블에 대해 아무것도 특별한이있다.
아무것도 특별한이 테이블에 대해이 있다면, 왜 다른 모든 테이블처럼 취급 대리 키를 사용할 수 있습니까? 당신이 테이블에 속성을 추가 할 필요 끝낼 경우, 당신은 당신이 바로 그 속성을 수정하는 복합 키를 주위를 통과하지 않아도 당신에게 행운의 프리젠 테이션 레이어를 주셔서 감사합니다.
난 더 뭔가 - 투 - 고려의, 엄지 손가락의 규칙이 전화를하지 않을 것입니다. 내 경험에 의하면, 관계의 일부 슬림 대부분은 기본적으로 대리 키의 가치 자체가 실체가되고, 주위의 추가 데이터를 운반하는 끝낸다.
문지는 사실 후 이러한 키를 추가하면 통증이있을 수 있다는 것입니다. 추가 컬럼 인덱스의 비용이 가치가 있는지 여부 두통을 선점의 값은, 그건 정말 프로젝트에 따라 달라집니다.
나는 문 밖으로 대리 키를 이동 - 저에 관해서는, 한 번 두 번 부끄러워 물린.
-
==============================
3.당신은 ID 열을 생성하더라도, 그것은 기본 키가 될 필요가 없습니다.
당신은 ID 열을 생성하더라도, 그것은 기본 키가 될 필요가 없습니다.
ArtistFans ArtistFanId ArtistId (PK) UserId (PK)
ID 열이 다른 관계로이 관계를 관계하는 것이 유용 할 수 있습니다. 작가 - 사용자 관계를 만든 사람을 지정 만든 테이블이 있다면 예를 들어, 대신 복합 ArtistID 순 + 사용자 아이디 차 키의, ArtistFanId에 외부 키를 가질 수있다.
또한, ID 열이 필요합니다 (또는 크게의 운영 개선) 특정 ORM 패키지를.
-
==============================
4.난 당신이 목록을 처음 양식을 사용하는 어떤 이유로 생각할 수 없다. 화합물 기본 키는 저장소에 계산과 공간에 더 많은 시간이 걸릴 것입니다 미세하고 (당신이 외부 키에 필요한 독특한 contraint와 함께) 별도의 인공 기본 키를 가지고있다.
난 당신이 목록을 처음 양식을 사용하는 어떤 이유로 생각할 수 없다. 화합물 기본 키는 저장소에 계산과 공간에 더 많은 시간이 걸릴 것입니다 미세하고 (당신이 외부 키에 필요한 독특한 contraint와 함께) 별도의 인공 기본 키를 가지고있다.
-
==============================
5.표준 방법은 복합 기본 키를 사용하는 것입니다. 별도의 자동 증가 키에 추가는 당신이 무엇을 사용하여 이미있는 대체를 만드는 것입니다. 적절한 데이터베이스 정규화 패턴은 자동 증가를 사용하여 아래로 보일 것이다.
표준 방법은 복합 기본 키를 사용하는 것입니다. 별도의 자동 증가 키에 추가는 당신이 무엇을 사용하여 이미있는 대체를 만드는 것입니다. 적절한 데이터베이스 정규화 패턴은 자동 증가를 사용하여 아래로 보일 것이다.
-
==============================
6.재미 어떻게 반대 의견을 가지고 변형 1에 대한 주장 있도록 모든 대답은, 변형 2 호의)
재미 어떻게 반대 의견을 가지고 변형 1에 대한 주장 있도록 모든 대답은, 변형 2 호의)
제목에 질문에 대답하지 않으려면 : 아니, 당신이 그것을 필요하지 않습니다. 그러나...
모든 테이블에 자동 증분 또는 ID 열을 갖는 것은 당신이 당신의 각 테이블은 항상 하나의 PK 컬럼을 가지고 있음을 알 수 있도록 데이터 모델을 단순화합니다.
결과적으로, 다른 한 테이블의 모든 관계 (외래 키)는 항상 각 테이블에 대해 하나의 컬럼으로 구성되어 있습니다.
당신이 등 로그인, 양식, 목록, 보고서의 일부 응용 프로그램 프레임 워크를 작성하는 일이있는 경우 또한, 당신은 단지 당신의 프레임 워크의 복잡성을 단순화 하나의 PK 컬럼이있는 테이블을 처리해야합니다.
또한, 추가 ID의 PK 컬럼 (억 기록 플러스 테이블 제외) 디스크 공간의 측면에서 매우 많은 비용을 부담하지 않습니다.
물론, 나는 하나의 단점을 언급해야합니다 조부모 - 부모 - 자식 관계에서, 아이는 조부모 정보를 잃게하고 그것을 검색하는 가입이 필요합니다.
-
==============================
7.제 생각에는, 순수한 SQL ID 열에서 필요하지 않으며 사용하지 않아야합니다. 그러나 그러한 최대 절전 모드와 같은 ORM 프레임 워크에 대해, 다 대다 관계를 관리하는 조인 테이블에 여분의 열이 특히 등 복합 키를 간단하지 않다.
제 생각에는, 순수한 SQL ID 열에서 필요하지 않으며 사용하지 않아야합니다. 그러나 그러한 최대 절전 모드와 같은 ORM 프레임 워크에 대해, 다 대다 관계를 관리하는 조인 테이블에 여분의 열이 특히 등 복합 키를 간단하지 않다.
제가 DB에 ORM 프레임 워크를 사용하기 위하여려고한다면, 나는 함께 참조하는 컬럼에 해당 테이블에 자동 증가 id 컬럼과 고유 제한 조건을 두는 것을 선호합니다. 그리고 물론,하지 null이 제약 것이 필요합니다.
그럼 난 그냥 내 프로젝트의 다른 테이블과 같은 테이블을 취급합니다.
from https://stackoverflow.com/questions/790334/sql-do-you-need-an-auto-incremental-primary-key-for-many-many-tables by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] CursorWindow를 할당 할 수 없습니다 (0) | 2020.07.05 |
---|---|
[SQL] 윈도우 함수의 FILTER 절에서 현재 행을 참조하기 (0) | 2020.07.05 |
[SQL] 기본 키가없는 경우 중복 레코드가 SqlBulkCopy의 삽입되지 않도록하는 방법 (0) | 2020.07.05 |
[SQL] C #에서 SQL을 대량 복사 / 삽입 (0) | 2020.07.05 |
[SQL] 모든 칼럼에 null 값 (들)의 모든 행을 찾기 (0) | 2020.07.05 |