음수 키는 무엇입니까?


12

표준 SQL 데이터베이스를 사용하는 것에 다소 새로운 (현재는 주로 MySQL로 작업) 나는 아직 까지이 사용법을 많이 사용하지 않았습니다.

테이블을 색인화하는 음수 (또는 서명 된) 키를 갖는 것이 언제, 왜 유용한가요?


5
첫째로, 피드백을 남기지 않고 downvoting하는 사람은 당신을 실망시킵니다. 다음으로이 훌륭한 질문에 대한 답변입니다.
jcolebrand

1
이 주제는 흥미 롭습니다. 나는 개인적으로이 개념에 대해 들어 본 적이 없다. 이 질문은 절대로 억압되어서는 안됩니다. 이 개념을 소개해 주신 +1 님.
RolandoMySQLDBA

답변:


13

모든 기본 키는 우리가 결정한 값은 레코드에서 가장 중요한 값입니다. 해당 키가 부호있는 정수, 부호없는 정수, 문자열, 얼룩 (실제로 한계가 있음) 또는 UUID (또는 오늘날 사용되는 이름)이든, 사실은 여전히 ​​열쇠이며 열쇠라는 것을 의미합니다. 가장 중요한 것.

우리는 키에 양의 방향 숫자 만 사용하도록 제한되어 있지 않기 때문에 부호가있는 int는 ~ 20 억에 불과하고 unsigned int는 ~ 40 억에 이르는 것을 고려하는 것이 합리적입니다. 그러나 signed int를 사용하여 초기 값을 ~-20 억으로 설정하고 1 씩 증가시키는 것은 아무런 문제가 없습니다. ~ 20 억 개의 레코드를 기록하면 "0"에 도달 한 다음 ~ 20 억까지 계속됩니다.

테이블에 "음수 키"를 갖는 것이 왜 유용한 지에 대해서는 "테이블에 키를 갖는 것이 왜 도움이 되는가"와 같은 질문입니다. 키의 "값"은 키 상태에 영향을 미치지 않습니다. 키는 키입니다.

중요한 것은 키가 유효한지입니다.

음수 키를 허용하는 것이 유용한 이유에 대해서는 몇 가지 이유를 제안 할 수 있습니다.

판매 시스템에서 반품을 음수 판매 주문 번호로 표시하고 양수 판매 주문 번호와 일치하여 상관 관계를 쉽게 만들 수있는 경우 (이것은 순진하고 제대로 설계되지 않았지만 "스프레드 시트"의미로 작동합니다).

users 테이블을 원하고 음수가있는 테이블이 시스템 제어됨을 표시하는 경우 (SO는 채팅 피드 사용자의 경우이 작업을 수행함)

나는 계속할 수 있지만 실제로 숫자가 음수 인 것이 중요한 유일한 이유는 당신이나 내가 그것에 중요성을 부여하는 것입니다. 그 외에도, 키의 가치가 키 자체에 영향을 미치는 큰 이유는 없습니다.


'틈새 발생'비트를 편집했습니다. 경험 부족으로 인한 오해 일 가능성이 높습니다. 재미있는 글입니다. 나는 키의 음수 값이 코딩에 어떤 식 으로든 유용하다고 생각합니다 (즉, 특정 것을 의미하지 않음). 두 그룹으로 나뉘어 있고 돈 여분의 bool을 사용하고 싶지 않습니다 : p
Garet Claborn

1
@Garet ~ 당신이 좋은 점을 그래서 "키 값 코딩에 어떻게 든 유용했다"난 그냥 그 방법으로 수시로 내 키의 메이크업 사용을 할 수 있지만,이없는 것도 데이터베이스 측면과 함께 할 수 있습니다. 데이터베이스는 창고입니다. 반면에 데이터를 소비하는 응용 프로그램은 값을 관리합니다 . 그러나 예, +/- boolean은 깔끔한 트릭입니다. 그런 효과에 많은 시간이 걸린다는 것을 알았습니다.
jcolebrand

2
이와 같은 이중 목적 값이 나쁜 생각 이외의 것임을 암시합니다. int와 bool이 필요하십니까? int와 bool을 사용하십시오.
잭 topanswers.xyz 시도라고

1
@JackPDouglas 나는 사람들에게 그렇게하도록 격려하는 것을 기억하지 못한다. 나는 필드와 데이터가 서로 다른 두 가지라는 것을 암시하는 것을 엄밀히 기억한다. 최소한 downvote에 대한 건설적인 피드백을 제공 해주셔서 감사합니다. 그러나 관찰 결과는 데이터베이스 레이어 문제가 아니라 응용 프로그램 논리 문제이기 때문에 "음수 키란 무엇인가"라는 개념에 비추어 볼 때 의미가 있다고 말할 수는 없습니다. . 이러한 것들이 응용 프로그램 계층에서 어떻게 사용되는지 강조하고 싶었지만 데이터베이스 계층에서는 아무런 의미가 없습니다.
jcolebrand

1
@JackPDouglas ~ 나는 당신이 들었을 수도있는 잘 알려진 사이트 (사이트 네트워크)가 있기 때문에 그 특정 예를 사용했습니다. 그래서 나는 그것을 무시하고 싶지 않습니다. 유효합니다. "장난". 이 사용자 dba.stackexchange.com/users/-1/community를 확인하고 자신의 ID가 무엇인지 알려주십시오. 나는 사용자 ID가 기본 (및 다른 많은 테이블에서 외래) 키임을 거의 확신 할 수 있습니다. 응용 프로그램 디자인이 잘못되었다고해서 이것이 유효하지 않다는 의미는 아닙니다. 그러나 다시 한 번, 그것은 db 디자인이 아니라 도메인 디자인입니다. 물론, db 로직이이를 지원합니다
jcolebrand

10

ID 또는 자동 번호 열을 사용하는 경우 값 자체에는 의미가 없습니다. (때때로, 내가 전에 한 drachenstern에 의해 승인 된 SO의 채팅 사용자에 따라)

그러나 부호있는 정수를 사용하면 일반적으로 범위의 절반이 손실됩니다.
참조 : 테이블의 필드가 최대 부호있는 또는 부호없는 32 비트 정수에 접근하면 어떻게해야합니까?

다른 예 : 소규모 복제 시나리오에서 한 사이트에 음수 값을 사용하고 다른 사이트에 양수 값을 사용하면 주어진 행의 소스에 대한 암시 적 지식이 제공됩니다.


각 사이트에서 입력 된 값을 어떻게 든 제한하는지 확인하십시오. 그렇지 않으면 "암시 적 지식"이 잘못 될 때 끔찍한 혼란에 빠지게됩니다.
잭 topanswers.xyz 시도라고

@JackPDouglas : 잘못된 사이트에서 값을 생성하지 않기 위해 NOT FOR REPLICATION을 사용합니다
gbn

점검 제한 조건과 함께 ? 또한 NOT FOR REPLICATION당신이 알고 있는 MySQL (또는 다른) 아날로그가 있습니까?
잭 topanswers.xyz 시도라고

@JackPDouglas : 죄송합니다, 비 SQL Server에 대해 잘 모르겠습니다
gbn

8

모든 데이터베이스 시스템이 부호없는 정수 유형을 지원하는 것은 아니며 MSSQL은 그렇지 않은 유형 중 하나입니다. 이러한 경우 정수 키 필드에서 음수 값은 유형에서만 가능하기 때문에 가능합니다 ( 이 예에 표시된대로 규칙 또는 트리거를 사용하여 차단할 수 는 있지만 이러한 규칙을 적용하기위한 오버 헤드를 추가 할 필요는 없습니다). 모든 인터 / 업데이트).

데이터베이스와 관련하여 기본 키의 실제 값은 테이블 내에서 고유 한 한 중요하지 않습니다. 그것에 -42와 42는 42와 69와 같은 방식으로 두 개의 다른 숫자입니다-의미는 코드에 의해 음의 값에만 부여되거나 가치에 의해 부여되지 않습니다.

부호없는 정수 유형을 지원하지 않는 것은 아마도 복잡성을 줄이는 것에 기반한 디자인 결정 일 것입니다. 즉, 두 개의 다른 32 비트 정수 유형이 값을 할당 할 때 범위를 확인하는 것을 걱정하지 않기를 바랍니다. 서명이없는 유형 (~ 4e9가 아닌 ~ 2e9)에서 가능한 것의 0 또는 1에서 절반으로 시작하는 자동 증분 필드에서 가능한 색인 수를 제한하지는 않지만 중요한 문제는 거의 없습니다 (필요한 경우) 전체 범위를 원하고 필요로 할 경우 32 비트 아키텍처보다 효율적으로 처리되지 않는 64 비트 아키텍처를 사용하는 경우 특히 64 비트 유형에 대해 그 규모의 많은 주요 값을 사용했을 것입니다. 공간상의 이유로 32 비트를 고수하려면 -2,147,483,647에서 증가를 시작할 수 있습니다.


그래, 나는 우리가 전에 지상에 덮여 것 같아요;) tehehe dba.stackexchange.com/questions/983/...
jcolebrand

tinyint는 부호가 없습니다 (0 .. 255). 필자는 필연적으로 코드를 작성하여 암시 적으로 가정하고 음수 값이 들어 오면 이상한 버그가 발생하기 때문에 정수 열에 대해 검사 제한 조건을 작성하는 것이 필연적입니다.
Ed Avis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.