각 테이블마다 기본 키가 있어야합니까?


340

데이터베이스 테이블을 만들고 있는데 논리 기본 키가 할당되어 있지 않습니다. 그래서 나는 기본 키없이 그것을 떠날 생각하고 있지만 그것에 대해 약간의 죄책감을 느낍니다. 내가해야합니까?

각 테이블마다 기본 키가 있어야합니까?


5
테이블에 대해 좀 더 자세히 설명해 주시겠습니까? 대답은 아마 "예"일 것입니다.
Ryan Bair

7
예, 각 테이블마다 기본 키가 있어야합니다.
Syed Tayyab Ali

답변:


313

짧은 대답 : .

긴 대답 :

  • 테이블을 무언가에 조인 할 수 있어야합니다.
  • 테이블을 클러스터링하려면 일종의 기본 키가 필요합니다.
  • 테이블 디자인에 기본 키가 필요하지 않은 경우 디자인을 다시 생각해보십시오. 왜 동일한 기록을 유지합니까?

MySQL에서 InnoDB 스토리지 엔진은 명시 적으로 지정하지 않으면 항상 기본 키를 생성하므로 액세스 할 수없는 추가 열이 생성됩니다.

기본 키는 복합 일 수 있습니다.

다 대다 링크 테이블이있는 경우 링크와 관련된 모든 필드에 기본 키를 만듭니다. 따라서 하나의 링크를 설명하는 두 개 이상의 레코드가 없는지 확인하십시오.

논리적 일관성 문제 외에도 대부분의 RDBMS 엔진은 이러한 필드를 고유 한 인덱스에 포함시키는 이점이 있습니다.

또한 기본 키에는 고유 인덱스 생성이 포함되므로이를 선언하고 논리적 일관성과 성능을 모두 확보해야합니다.

고유 데이터에 대해 항상 고유 색인을 작성해야하는 이유는 내 블로그에서이 기사를 참조하십시오.

PS는 몇 가지가있다 아주, 아주 기본 키를 필요로하지 않는 특별한 경우를.

대부분 그들은이없는 로그 테이블 등 어떤 성능상의 이유로 인덱스를.


그들은 여전히 ​​기본 키, 복합 키를 가지고 있습니다
kristof

2
@annakata : 그들은 복합 기본 키가 있어야합니다
Quassnoi

1
"그리고 PRIMARY KEY에 UNIQUE 인덱스 생성이 포함되어 있기 때문에"Oracle에는 해당되지 않습니다. 고유하지 않은 인덱스를 사용하여 기본 키를 적용 할 수 있습니다. 실제로 고유 한 PK 제약 조건에서 고유하지 않은 인덱스를 사용해야하는 경우가 있습니다.
Stephanie 페이지

3
"왜 같은 기록을 유지 하는가?" PK를 추가한다고해서 중복이없는 것은 아닙니다. 종종 PK가 사용자에게 보이지 않기 때문에 중요한 것은 가시 데이터 필드에 있으며, 이는 중복 데이터를 포함 할 수 있습니다. 디자인에 따라 이것은 바람직하거나 그렇지 않을 수 있습니다.
Rossco

1
키는 결합 성과 관련이 없습니다. 클러스터링 인수는 사용하는 DBMS에 따라 다르며 논리적 및 물리적 고려 사항을 혼합합니다.
Jon Heggland

36

항상 기본 키를 사용하는 것이 가장 좋습니다. 이런 방식으로 첫 번째 정규 양식을 충족 하고 데이터베이스 정규화 경로 를 계속 진행할 수 있습니다 .

다른 사람들이 언급했듯이 기본 키가 없어야하는 몇 가지 이유가 있지만 기본 키가 있으면 대부분 피해를받지 않습니다.


5
@PaulSuart 데이터가 항상 정상적인 형태 일 필요는 없습니다. 실제로 데이터가 커지면 일반 형식으로 유지해서는 안됩니다. 그렇지 않으면 테이블 조인 등을 수행하는 쿼리의 경우 데이터 액세스가 엄청나게 느려질 것입니다. 일반 형식은 "이상화"이며 실제로 데이터가 커지지 않을 경우에만 가능합니다 거대한.
Pacerier 2018 년

13

기본 키가없는 테이블을 만들 때마다 거의 필요하지 않다고 생각하고 다시 돌아가서 추가했습니다. 이제 기본 키로 사용하는 자동 생성 ID 필드를 사용하여 조인 테이블도 만듭니다.


13
결합 테이블은 기본 키-결합되는 두 레코드의 PK로 구성된 복합 키입니다. 예 : CREATE TABLE PersonOrder (PersonId int, OrderId int, PRIMARY KEY (PersonId, OrderId)).
Keith Williams

3
예. 그러나 링크 테이블에 세 번째 속성이있는 경우 "OrderDate"라고 말하면 어떻게됩니까? 복합 키에도 추가 하시겠습니까? IMHO 아니오-추가로 환원 가능하며 기본 키가 가져야 할 환원 불가능한 특성을 제공하지 않기 때문입니다.
stevek

13

매우 드문 경우 (다 대다 관계 테이블 또는 대량의 데이터를 대량로드하는 데 임시로 사용하는 테이블)를 제외하고는 다음과 같이 말합니다.

기본 키가 없으면 테이블이 아닙니다!

마크


10
엄밀히 말하면 문장이 잘못되었습니다. 테이블은 쿼리 언어로 작성된 "테이블보기"일 수 있습니다. RDBMS는 테이블이 아닌 관계로 구성됩니다. 그 문장은 "기본 키가 없으면 관계가 아닙니다!"라고 말해야합니다.
stevek

또는 "후보 키가 없으면 관계형 테이블이 아닙니다". 그러나 관계를 나타내지 않는 테이블을 갖는 것이 매우 드문 경우를보십시오.
Walter Mitty

다 대다 테이블에 기본 키가없는 이유는 무엇입니까? 별도의 기본 키를 만든 다음 외래 키 대리에 대한 고유 인덱스를 만들 수 있습니다. 모든 테이블에 기본 키를 두는 것이 좋습니다. 대량로드 테이블에서도 ETL 프로세스에서 중복 레코드를 식별하는 데 도움이 될 수 있으므로 가져 오는 데이터를 포함하지 않는 기본 키를 별도로 식별 할 수 있습니다. 스토리지가 조금이라도 모든 테이블에 여전히 기본 키가 있어야한다고 생각합니다. 뷰로 작성된 테이블은 테이블 자체가 아닌 테이블의 서브 세트입니다.
John Ernest

1
다 대다 관계 테이블에서 관계에 대한 두 ID로 구성된 복합 기본 키를 작성할 수 있습니다.
Jaap

8

그냥 추가하면 나중에 선택하지 않았을 때 죄송합니다 (선택, 삭제, 연결 등).


8

이 테이블을 다른 테이블에 조인해야합니까? 레코드를 고유하게 식별 할 수있는 방법이 필요합니까? 대답이 예이면 기본 키가 필요합니다. 데이터가 고객 인 사람의 이름을 가진 고객 테이블과 같은 것으로 가정하십시오. 이 Sally Smith가 Sally Smith와 다른지 여부를 판별하기 위해 주소, 이메일, 전화 번호 등이 필요하기 때문에 자연 키가 없을 수 있습니다. 사람이 여러 전화를 가질 수 있으므로 주소를 관련 테이블에 저장합니다. , 이메일 등 Sally Smith가 John Jones와 결혼하여 Sally Jones가된다고 가정합니다. 테이블에 인공 키가 없으면 이름을 업데이트 할 때 7 명의 Sally Smiths가 Sally Jones로 변경되었지만 그 중 하나만 결혼하여 이름을 변경 한 경우에도 마찬가지입니다.

당신은 당신이 자연적인 열쇠가 없다고 말하고, 따라서 당신은 독창성을 만들기 위해 어떤 분야의 조합도 가지고 있지 않습니다, 이것은 인공적인 열쇠를 중요하게 만듭니다.

자연 키가없는 경우 언제든지 데이터 무결성을 유지하기위한 필수 키가 필요합니다. 자연 키가 있으면 키 필드로 대신 사용할 수 있습니다. 그러나 개인적으로 자연 키가 한 분야가 아니라면 나는 여전히 자연 키에 대한 인공 키와 고유 인덱스를 선호합니다. 나중에 넣지 않으면 후회하게됩니다.


6

모든 테이블에 PK를 사용하는 것이 좋지만 반드시 그런 것은 아닙니다. 대부분의 경우 필요에 따라 고유 인덱스 및 / 또는 클러스터형 인덱스 (PK인지 여부)가 필요할 것입니다.

온라인 설명서 (SQL Server 용)의 기본 키 및 클러스터형 인덱스 섹션을 확인하십시오.

" PRIMARY KEY 제약 조건은 테이블의 행을 고유하게 식별하는 값이있는 열 또는 열 집합을 식별합니다. 테이블의 두 행은 동일한 기본 키 값을 가질 수 없습니다. 기본 키의 열에는 NULL을 입력 할 수 없습니다. 작은 정수 열을 기본 키로 사용하는 것이 좋습니다. 각 테이블에는 기본 키가 있어야합니다. 기본 키 값으로 적합한 열 또는 열의 조합을 후보 키라고합니다. "

그러나 다음도 확인하십시오 : http://www.aisintl.com/case/primary_and_foreign_key.html



4
그 페이지는 꽤 바보입니다. 먼저 성능상의 이유로 기본 키가 필요합니다. 그의 페이지를 읽음으로써 나는 책의 텍스트가 독특하기 때문에 책 테이블에 ID를 추가하는 것은 쓸모가 없다는 것을 알게됩니다. 분명히 그 사람은 데이터베이스를 다루지 않았지만 비판하는 것을 이해하는 데 문제가 있습니다. 1) PK 값이 행을 참조한다고 쓴 페이지 2) 모든 열 집합으로 2 개의 테이블을 조인 할 수 있습니다. contraddiction이 없습니다. 학술 논문 작성자가 관계 이론의 기본을 이해하지 못한다는 것은 놀라운 일입니다.
Federico Razzoli

1
"먼저, 성능상의 이유로 기본 키가 필요합니다."이것은 올바르지 않습니다. PK는 성능에 직접적인 영향을 미치지 않습니다. PK가 없으면 많은 문제 (행 식별, 조인 등)가 발생할 수 있지만 성능은 그 중 하나가 아닙니다. 테이블에서 PK를 만들면 SQL Server가 고유 한 클러스터형 인덱스를 만들면 해당 인덱스는 PK 자체가 아닌 성능에 영향을줍니다. 실제 예를 들어, 모든 쿼리에는 날짜 범위 (제 경우)가 있으므로 테이블의 날짜 열에 대해 물리적으로 행을 정렬해야하기 때문에 내 테이블에는 날짜 열에 클러스터 된 인덱스와 GUID 필드에 PK가 있습니다.
endo64

이 클러스터형 인덱스는 SQL Server와 다른 여러 DBMS에서 만든 기본 키의 특징입니다. 그것을 사용하는 것이 좋은 생각입니까? 예를 들어, MySQL에서는 문서화되지 않은 몇 가지 이유가 없습니다.
Federico Razzoli

1
InnoDB에서 GUID는 PK에 대한 최적의 유형이 아닙니다. 모든 인덱스는 PK에 대한 참조를 포함하므로 PK가 클수록 다른 모든 인덱스가 커집니다.
Federico Razzoli

6

제안 된 답변에 동의하지 않습니다. 짧은 대답은 NO 입니다.

기본 키의 목적은 다른 테이블과의 관계를 형성하기 위해 테이블에서 행을 고유하게 식별하는 것입니다. 일반적으로 자동 증분 정수 값이이 목적으로 사용되지만 이에 대한 변형이 있습니다.

예를 들어 시계열 데이터 로깅과 같은 경우가 있습니다. 이러한 키의 존재가 단순히 필요하지 않고 메모리를 차지하는 경우도 있습니다. 행을 고유하게 만드는 것은 단순히 ... 필요하지 않습니다!

작은 예 : 표 A : LogData

Columns:  DateAndTime, UserId, AttribA, AttribB, AttribC etc...

기본 키가 필요하지 않습니다.

표 B : 사용자

Columns: Id, FirstName, LastName etc. 

LogData 테이블에 대한 "외부 키"로 사용 되려면 기본 키 (Id)가 필요합니다.


3

.NET에서 gridview의 특정 기능을 사용하려면 gridview가 어떤 행을 업데이트 / 삭제 해야하는지 알기 위해서는 기본 키가 필요하다는 것을 알고 있습니다. 일반적으로 기본 키 또는 기본 키 클러스터가 있어야합니다. 나는 개인적으로 전자를 선호합니다.


3

미래의 증거가되기 위해서는 정말로해야합니다. 복제하려면 하나가 필요합니다. 다른 테이블에 합류하고 싶다면 내 인생과 내년에 그것을 유지 해야하는 가난한 바보의 삶이 훨씬 쉬워 질 것입니다.


나는 그것이 아직 필요하다는 것을 확신하지는 못하지만 "그렇지 않으면 누군가가 나중에 그 결과를 다루어야하기 때문에 그것을해야한다"는 것만으로는 충분하지 않습니다. 그것을 아래로 축소 시도하는 가치있는 것 같으면 난 항상 그냥 ... 열 나중에 삭제할 수 있습니다
ArtOfWarfare

3

저는 해외 개발 팀이 만든 응용 프로그램을 유지 관리하는 역할을 수행하고 있습니다. 원래 데이터베이스 스키마에 일부 테이블의 PRIMARY KEYS가 포함되어 있지 않으므로 응용 프로그램에서 모든 종류의 문제가 발생합니다. 따라서 디자인이 좋지 않아 다른 사람들이 고통을 겪지 않도록하십시오. 항상 테이블에 기본 키를 두는 것이 좋습니다.


2

처음에는 아직 목표가없는 경우에도 항상 기본 키가 있습니다. PK가없는 테이블에 결국 PK가 필요할 때가 몇 번 있었으며 나중에 PK를 넣는 것이 항상 더 문제가됩니다. 나는 항상 하나를 포함시키는 것에 대한 더 큰 단점이 있다고 생각합니다.


1

요컨대 그러나 특정 클라이언트 액세스 CRUD 조작에 필요하다는 점을 명심해야합니다. 향후 교정을 위해 항상 기본 키를 사용하는 경향이 있습니다.


1

최대 절전 모드를 사용하는 경우 기본 키없이 엔티티를 작성할 수 없습니다. 일반 sql / ddl 스크립트로 작성된 기존 데이터베이스로 작업 중이고 기본 키가 추가되지 않은 경우이 문제로 인해 문제점이 발생할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.