데이터 유형 uuid
은 작업에 완벽하게 적합합니다. varchar
또는 text
표현을 위해 RAM에서 37 바이트가 아닌 16 바이트 만 차지합니다 . (또는 디스크의 33 바이트이지만 홀수는 40 바이트를 효과적으로 만들기 위해 패딩이 필요합니다 .) 그리고이 uuid
유형에는 몇 가지 장점이 있습니다.
예:
SELECT md5('Store hash for long string, maybe for index?')::uuid AS md5_hash
세부 사항 및 추가 설명 :
md5의 암호화 구성 요소가 필요하지 않으면 다른 (저렴한) 해싱 함수를 고려할 수 있지만 사용 사례 (대부분 읽기 전용)에 md5를 사용합니다.
경고 단어 : 귀하의 경우 ( immutable once written
) 기능에 의존하는 (의사-자연) PK 가 좋습니다. 그러나 업데이트 가 가능한 고통도 마찬가지입니다 text
. 오타 수정 : PK 및 모든 종속 인덱스, FK 열 dozens of other tables
및 기타 참조도 변경해야합니다. 테이블 및 인덱스 팽창, 잠금 문제, 느린 업데이트, 손실 된 참조 ...
경우 text
정상 작동 변경할 수 있습니다하는 대리의 PK가 더 나은 선택이 될 것입니다. 나는 bigserial
열 (범위 -9223372036854775808 to +9223372036854775807
- 구 quintillion 이백 이십 삼십 삼 삼백 삼십 삼십 삼십 육십 억 무엇인가 )에 대해 다른 값을 제안한다 billions of rows
. 에서 좋은 아이디어가 될 수 있는 경우 : 8 대신 16 ! FK 컬럼과 인덱스 수십 바이트). 아니면 랜덤 UUID 에 대한 훨씬 더 큰 카디널리티 또는 분산 시스템. 당신은 항상 상점은 MD5 (로 말했다 수 있습니다 uuid
) 추가로 신속하게 원래의 텍스트에서 기본 테이블에서 행을 찾을 수 있습니다. 관련 :
귀하의 쿼리에 관해서 :
@Daniel의 주석 을 처리하려면 : 하이픈이없는 표현을 선호하는 경우 표시 할 하이픈을 제거하십시오.
SELECT replace('90b7525e-84f6-4850-c2ef-b407fae3f271', '-', '')
그러나 나는 귀찮게하지 않을 것입니다. 기본 표현은 괜찮습니다. 그리고 문제는 실제로 여기에 대한 표현이 아닙니다.
다른 당사자가 다른 접근 방식을 사용해야하고 하이픈이없는 문자열을 믹스에 넣으면 문제가되지 않습니다. Postgres는에 대한 입력으로 몇 가지 합리적인 텍스트 표현을 허용합니다 uuid
. 설명서 :
PostgreSQL은 다음과 같은 대체 입력 형식도 허용합니다. 대문자 숫자 사용, 중괄호로 묶은 표준 형식, 일부 또는 모든 하이픈을 생략하고 4 자리 그룹 뒤에 하이픈을 추가합니다. 예를 들면 다음과 같습니다.
A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11
{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}
a0eebc999c0b4ef8bb6d6bb9bd380a11
a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11
{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}
게다가는 md5()
함수가 반환은 text
, 당신이 사용하는 것이 decode()
로 변환 할 bytea
및 기본 표현 즉 이다 :
SELECT decode(md5('Store hash for long string, maybe for index?'), 'hex')
\220\267R^\204\366HP\302\357\264\007\372\343\362q
encode()
원래 텍스트 표현 을 다시 가져와야합니다.
SELECT encode(my_md5_as_bytea, 'hex');
또한 내부 오버 헤드 로 인해 bytea
RAM에 20 바이트 (및 디스크에 17 바이트, 패딩이있는 24 바이트)를 차지하는 것처럼 저장된 값 은 특히 간단한 인덱스의 크기와 성능에 바람직하지 않습니다.varlena
모든 것이uuid
여기 에 유리 합니다.