기본 키에 자체 이름이있는 이유는 무엇입니까?


19

수학적 관점에서 볼 때, 테이블에 기본 키가 하나 이상 있다고 가정하면 간단한 테이블 속성 대신 임의의 이름으로 기본 키를 참조하는 근시안적인 디자인 결정 인 것 같습니다.

결과적으로 기본 키를 비 클러스터형에서 클러스터형으로 또는 그 반대로 변경하면 먼저 키를 삭제 한 다음 읽기보다는 이름을 검색해야합니다.

내가 보지 않은 임의의 이름을 사용하는 데 어떤 이점이 있습니까, 아니면 기본 키에 임의의 이름을 사용하지 않는 DBMS가 있습니까?

2011-02-22 (2011/02/22 날짜를 정렬하지 않으려는 경우 편집 ) :

필자는 테이블 이름에서 기본 키 이름을 파생시킬 수있는 기능을 보여 드리겠습니다 (일명 sql-sever 일명 sybase 시스템 테이블 사용).

create function dbo.get_pk (@tablename sysname)
returns sysname
as
begin
    return (select k.name
    from sysobjects o 
        join sysobjects k   on k.parent_obj = o.id 
    where o.name = @tablename
    and o.type = 'U'
    and k.type = 'k')
end
go

gbn은 명시 적 이름을 제공하지 않으면 생성 된 이름을 좋아하는 사람이 없다고 말합니다.

create table example_table (
    id int primary key
)

select dbo.get_pk('example_table')  

방금 받았어

PK__example___3213E83F527E2E1D

그러나 sysobjects의 이름이 고유해야하는 이유는 무엇입니까? 테이블과 기본 키에 정확히 동일한 이름을 사용하는 것이 좋습니다.

그렇게하면 우연히 위반 될 수있는 명명 규칙을 설정할 필요가 없습니다.

이제 마리안에게 대답하십시오.

  1. 클러스터를 클러스터되지 않은 기본 키로 변경하는 작업을 pk를 삭제할 수 있도록 pk의 실제 이름을 알아야하는 예로 사용했습니다.
  2. 사물에는 적절한 이름이 필요하지 않으며, 쉽게 고유하게 표시 할 수 있으면 충분합니다. 이것이 추상화의 기초입니다. 객체 지향 프로그래밍은 이런 식으로 진행됩니다. 다른 클래스의 유사한 속성 에 다른 이름을 사용할 필요는 없습니다 .
  3. 테이블의 속성이므로 임의적입니다. 테이블 이름은 사용하려는 경우 알아야 할 모든 것입니다.

답변:


17

기본 키 (및 기타 고유 제약 조건)는 인덱스로 구현되며 정확히 같은 방식으로 처리됩니다. 프로그래머의 관점에서 PK와 인덱스에 대해 별도의 코드 경로를 갖는 것은 이치에 맞지 않습니다. 버그 가능성).

외래 키로 참조되는 것 외에도 PK는 인덱스로 구현되는 고유 제한 조건이므로 PK의 속성을 변경하는 것은 다른 인덱스의 속성을 변경하는 것과 같습니다. 또한 명시적인 이름을 갖는 것은 다른 인덱스와 같이 쿼리 힌트에서 참조 될 수 있음을 의미합니다.


1
또한 PK를 변경할 수 있으므로 사용되는 열을 의미합니다. 따라서 책의 경우 ISBN을 PK로 사용하여 (명확하게하기 위해 ISBN을 호출하고 싶음) 개발 과정의 중간 단계에서 중고 책도 구입할 수 있음을 결정할 수 있습니다. 별도의 기록 (예를 들어 머리 꼭대기에서 벗어남). 따라서 PK 필드를 고유 한 ID로 변경해야합니다.
Nathan MacInnes

1
"PK는 인덱스 를 사용 하는 제약 조건"이라는 문구를 선호합니다 . 때로는 두 제약 조건 (PK 및 FK 또는 2 FK)이 동일한 인덱스를 사용할 수 있습니다.
ypercubeᵀᴹ

@ypercube "PK는 실제 데이터베이스의 99.99 %에서 인덱스를 사용하는 제약 조건"을 선호합니다. 물론 인덱스없이 PK 제약 조건을 가질 수는 있지만 아무도 그 데이터베이스를 사용할 계획은 없습니다. 실제 세계는 성능상의 이유로이를 구현할 것입니다.
Pacerier

6

질문을 완전히 이해하지 못했습니다.

테이블에 인덱스가 있고 인덱스를 변경해야하는 경우 이름에 따라 인덱스를 변경할 필요가 없습니까? 인덱스의 objectID를 검색하고 업데이트를 수행 할 수 있다고 생각하지만 이름은 사람들이 작업중 인 객체를 논리적으로 이해하는 데 도움이되는 경향이 있습니다.

따라서 아마도 강력한 이름 지정 규칙을 사용하는 경우 (예 : 기본 키의 name_PK) 테이블의 기본 키로 작업하고 있음을 쉽게 식별 할 수있을 것입니다.

FK 관계를 정의 할 때도 마찬가지라고 생각합니다. 객체 자체에는 모두 고유 한 objectID가 있기 때문에 논리적 해석을 위해 이름을 사용한다고 생각합니다.


5

인간의 가독성을위한 구현 세부 사항이라고 말하고 싶습니다.

제약 조건 이름은 (적어도 SQL Server의) 선택 사항이지만 내가 갖고 싶은 PK_MyTable위한 MyTable것이 아니라PK_MyTabl___16feb6d8a


3

역사적으로 기본 키와 고유 키는 모두 Christopher J. Date가 가르치는 후보 키라고합니다.

후보 키는 고유 한 인덱스이며 기본 키 롤을 재생할 수 있습니다. 따라서 모든 후보 키는 고유 키입니다. 기본 키는 단순히 테이블 데이터에 액세스하기 위해 선호되는 방법으로 후보 키 중 하나를 지정하는 것입니다.

이를 고려하여 이름 PRIMARY KEY는 테이블 특성으로 첨부 된 선호 후보 키의 임의의 이름입니다. 기본 키는 하나만있을 수 있습니다.

실제로, 명명 된 후보 키를 작성하면 충분합니다.

클러스터 된 인덱스에서 클러스터되지 않은 인덱스로 인덱스를 변경하는 것은 정의에 따라 최대 1 인 PRIMARY KEY를 찾는 연습입니다. PRIMARY KEY 정의를 갖는 것은 본질적으로 데이터베이스 순수 주의자들에게 향수를 불러 일으킬 수 있다고 말할 수 있습니다. 데이터베이스 순도라는 의미는 실제 단어 UNIQUE KEY 대신 CANDIDATE KEY 키워드로 고유 키를 호출해야합니다.

후보 키의 정의와 이에 대한 CJDate의 의견을 보려면 여기를 클릭하십시오.


1

기본 키가 테이블 객체를 나타낼 것이라는 말은 없습니다. 테이블 개체는 기본 키가 아닌 클러스터 된 인덱스입니다. 기본 키가 클러스터형 인덱스와 같아야한다는 것은 없습니다. 종종 그렇지 않지만 반드시 그런 것은 아닙니다. 기본 키는 비 클러스터형 인덱스로 쉽게 적용 할 수 있습니다.

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