기본 키를 변경할 수 없습니까?


26

stackoverflow에 대한 최근의 질문으로 기본 키의 불변성에 대한 토론이 시작되었습니다. 기본 키를 변경할 수없는 것이 일종의 규칙이라고 생각했습니다. 언젠가 기본 키가 업데이트 될 가능성이 있다면 대리 키를 사용해야한다고 생각했습니다. 그러나 이는 SQL 표준이 아니며 일부 RDBMS의 "계단식 업데이트"기능을 통해 기본 키를 변경할 수 있습니다.

그래서 내 질문은 : 여전히 변경 될 수있는 기본 키를 갖는 것이 나쁜 습관입니까? 변경 가능한 기본 키를 갖는 단점은 무엇입니까?

답변:


25

당신은 필요 가 외래 키에 연결 않다면 불변하는 기본 키를, 또는이 (항목에 대한 페이지에 URL 가리키는 예를 들어) 데이터베이스 외부 식별자로 사용되는 경우.

반면에, 당신은 단지 필요 가 힘의 변화에 일부 정보를 전달하는 경우 변경 가능한 키를 가지고. 레코드에 키로 사용할 수있는 단순하고 불변 인 식별자가없는 경우 항상 대리 키를 사용합니다.


7
왜 "할 필요 가 외래 키에 연결 않다면 불변하는 기본 키를"? OP가 언급했듯이 대부분의 RDBMS에는 "계단식"업데이트 기능이 있습니다.
Thanatos

1
@Thanatos 대부분 (실제로 내가 만난 모든) rdbms는 변경 가능한 기본 키를 허용하지 않지만 계단식 업데이트를 수행합니다. 일반적으로 받아 들여지는 dba 지혜에서 기본 키는 정보를 포함하지 않아야하며, 고유 한 레코드 식별자 (타임 스탬프, 지연된 레코드 범위 등)도 아니어야합니다.
jwenting

5
@jwenting : 우리는 같은 것에 대해 이야기하고 있습니까? "대부분의 rdbms는 변경 가능한 기본 키를 허용하지 않습니다"에는 무엇이 포함됩니까? MySQL과 PostgreSQL은 모두 변경 가능한 기본 키를 허용하고 캐스케이드 업데이트를 존중합니다 ... 표준 SQL 이해 야한다고 생각합니다. 또한 "일반적으로 dba 지혜를 받아 들였다"? 대리 키에 대해 논쟁하는 DBA와 자연 키에 대해 논쟁하는 DBA를 많이 만났습니다.
타나토스

2
@Thanatos "모든 테이블에는 대리가 있어야한다" 는 참고 문헌이없고, "일반적으로 받아 들여진 dba 지혜"를 인용하지만 결코 책을 인용하지는 않는다. 정식 서적은 다음과 같은 경우 대리자를 사용해야한다고 말합니다. A. 자연 키가 없거나 B. 다중 열 키가 3 열을 초과하거나 C. 항상 키를 변경하게됩니다. 그래서 : 자연이 적합하면 자연이 적합하지 않을 때 대리합니다.
Tulains Córdova 2016 년

4
@ user61852 : 무엇?
Guffa

15

기본 키 고유성을 결정하는 데 필요한 튜플로 구성 되어야 합니다. 데이터가 변경 될 수 있는지 여부는 관련이 없습니다. 기록의 독창성 만 중요합니다. 이것이 데이터베이스의 개념 설계입니다.

구현 영역으로 이동할 때 가장 안전한 방법은 단순히 대리 키를 사용하는 것입니다.


15

예, 제 생각에는 기본 키를 변경할 수 없습니다.

명백한 후보 키가 있더라도 항상 대리 키를 사용합니다. 몇 가지 경우에 나는 이것을하지 않았으며 거의 ​​항상 후회했습니다. 키가 아무리 불완전하다고 생각하더라도 데이터 입력 오류로부터 보호 할 수는 없습니다. 기본 키이므로 슬프게 씻지 않기 때문에 사용자는 해당 비트 정보를 편집 할 수 없습니다.


데이터 입력 오류에 대한 좋은 점
팀 굿맨

richeym, 키를 변경할 수없는 이유를 만드는 것처럼 보입니다. 사용자가 키를 변경하고 싶을 수도 있습니다.
nvogel

4
@ dportas-내 요점은 PK가 변경 불가능한 것을 좋아하므로 테이블 데이터 (예 : 이메일, 사용자 이름)에서 파생 될 수있는 명백한 키가 있다고 생각하더라도 항상 대리 키를 사용한다는 것입니다.
richeym

2

기본 키가 변경되면 데이터베이스와 사용자 간의 캐싱 메커니즘이 효과를 잃게됩니다.


2

왜 안돼? 열을 제거하고 싶습니까?

요구 사항에 3 개의 열이 고유해야한다고해서 기본 키 여야한다는 의미는 아닙니다. 당신은 그 규칙이 영원히 지속될 것이라고 생각할 수도 있습니다.

내가 구현 한 모든 캐스케이드 업데이트에 대해 비용을 지불하지 않고 직접 코딩하면 보너스를받지 않습니다.

컴퓨터는 키에 대한 의미가 필요하지 않습니다. IMHO, 열쇠는 컴퓨터 용이며 사람들이 나머지 데이터를 망칠 수있게합니다.


1
"키는 컴퓨터 용이며 사람들이 나머지 데이터를 망칠 수있게 해줍니다." +1, 좋습니다.

2

값이 변경 될 수있는 키를 갖는 것은 좋지 않습니다.

좋은 열쇠의 특성에는 안정성이 포함됩니다. 불변성은 이상적이지만 전제 조건은 아닙니다. 불변성을 위해 인공 키를 도입하는 것은 나쁜 습관입니다.

국제 표준 도서 번호 (ISBN) 의 예를 보자 . 그것은 매우 안정적이지만 불변의 것은 아닙니다 : 언젠가 서적 출판사들이 실수를하고 공포를 느끼게합니다! -중복 ISBN 번호가 발생할 수 있습니다. 이것은 컴퓨터 화 된 데이터베이스에서 ISBN을 후보 키로 받아 들여서는 안된다는 의미입니까? 당연히 아니지. ISBN의 장점 중 하나는 전 세계 모든 사용자의 문제를 해결할 수있는 신뢰할 수있는 출처가 있다는 것입니다.

좋은 키 ISBN의 다른 특성으로는 의미없는 자동 증가 정수 키가 부족하다는 점이 있습니다. DBMS (ISBN은 고정 너비이며 체크섬 포함) 등을 참조하여 검증해야합니다.


3
ISBN은 그렇지 않은 경우를 제외하고 고정 너비입니다 (ISBN-10 대 ISBN-13 참조).
CVn

그렇다면 중복 ISBN을 처리하는 것이 좋습니다. 내가 알고있는 모든 RDBMS에서 기본 키로 사용하려면 필드에 UNIQUE 제약 조건이 있어야합니다.
와일드 카드

1

변경할 수없는 모든 것이 있어야합니다. 정확성을 보장하고 응용 프로그램을 다중 스레드로 만들 때 도움이됩니다.


1

예, 기본 키는 null이 아니고 고유해야하며 변경 불가능해야합니다. 그러나 기본 키의 불변성을 강제하는 데이터베이스를 아직 찾지 못했기 때문에 원하는 경우 값을 변경할 수 있습니다.


0

일부 의견에서 이미 언급했듯이 한 가지 해결책은 새로운 기본 키를 사용하는 것입니다

예를 들어 (@onedaywhen의 예에 따라), 책 목록을 저장하는 Books 테이블이 있고 ISBN을 기본 키로 결정하는 데 사용 했다고 가정 해 봅시다 . 그러나 일부 저자는 잘못된 ISBN을 입력했다는 실수를 저질렀으므로 ISBN을 변경하도록 요청했으며 다음 작업이 포함되었습니다.

  • Books 테이블에 새 레지스트리를 만듭니다.
  • 이전 ISBN에서 새 ISBN으로의 모든 참조를 가리 킵니다. (*)
  • 마지막으로, Books 테이블에서 이전 레지스트리를 삭제하십시오.

(*) 외래 키를 사용하는 데이터베이스 모델에 대한 모든 참조를 찾는 것은 쉽지 않지만 일부 모델에는 부족합니다.

Table Books
ISBN  is the primary key
NAME is a simple field.
etc.

우리는 그것을 다음과 같이 변경합니다

Table Books
InternalBookId as the primary key
ISBN as a simple field or an indexed field.
NAME is a simple field.
etc.

InternalBookId 가 자동 숫자 값이 될 수있는 곳.

그것에 대한 단점 :

  • 더 많은 공간 / 자원을 사용하는 새로운 필드를 추가합니다.

  • 전체 모델을 다시 작성해야 할 수도 있습니다.

  • 새로운 모델은 덜 자기 설명이 될 수 있습니다.

프로

  • "기본 키"를 음소거 할 수 있습니다.
  • "기본 키"를 삭제하거나 리팩토링 할 수 있습니다. 예를 들어, 도서를 ISBN-13으로 변경하는 것은 이전 열을 삭제하고 새 열을 만드는 것만 큼 간단합니다.

새 테이블 :

Table Books
InternalBookId as the primary key
ISBN13 is a new field.
NAME is a simple field.
etc.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.