특히 웹 앱에서 UUID를 데이터베이스 행 식별자로 사용하는 것에 대해 어떻게 생각하시나요?

StackOverflow https://stackoverflow.com/questions/5949

  •  08-06-2019
  •  | 
  •  

문제

저는 항상 단순성과 (가정된) 속도를 위해 긴 정수를 데이터베이스의 기본 키로 사용하는 것을 선호했습니다.하지만 나머지 또는 객체 인스턴스에 대한 Rails와 유사한 URL 구성표를 사용하면 다음과 같은 URL이 됩니다.

http://example.com/user/783

그리고 ID가 782, 781, ..., 2, 1인 사용자도 있다고 가정합니다.문제의 웹 앱이 승인 없이 다른 사용자를 보기 위해 다른 번호를 입력하는 것을 방지할 만큼 충분히 안전하다고 가정하면, 순차적으로 할당된 간단한 대리 키도 총 인스턴스 수(이 경우보다 오래된)를 "누출"합니다. , 이는 특권 정보일 수 있습니다.(예를 들어, 나는 stackoverflow에서 사용자 #726입니다.)

혹시 UUID/GUID가 더 나은 솔루션일까요?그러면 다음과 같은 URL을 설정할 수 있습니다.

http://example.com/user/035a46e0-6550-11dd-ad8b-0800200c9a66

정확하게 간결하지는 않지만 표시되는 사용자에 대한 암시적인 정보가 적습니다.물론, 적절한 보안을 대체할 수 없는 "모호함을 통한 보안"의 냄새가 나지만 적어도 조금 더 안전한 것 같습니다.

웹 주소 지정이 가능한 개체 인스턴스에 대해 UUID를 구현하는 비용과 복잡성을 감당할 가치가 있는 이점이 있습니까?조인 속도를 높이기 위해 여전히 정수 열을 데이터베이스 PK로 사용하고 싶다고 생각합니다.

UUID의 데이터베이스 내 표현 문제도 있습니다.MySQL은 이를 36자 문자열로 저장한다는 것을 알고 있습니다.Postgres는 더 효율적인 내부 표현(128비트?)을 갖고 있는 것 같지만 직접 시도해 본 적은 없습니다.누구든지 이것에 대한 경험이 있습니까?


업데이트:URL에 사용자 이름만 사용하는 것에 대해 문의한 경우(예: http://example.com/user/yukondude), 고유한 이름을 가진 개체 인스턴스에는 잘 작동하지만 실제로 숫자로만 식별할 수 있는 수많은 웹 앱 개체는 어떻습니까?주문, 거래, 송장, 중복된 이미지 이름, stackoverflow 질문, ...

도움이 되었습니까?

해결책

귀하의 질문의 웹 측면에 대해서는 말할 수 없습니다.그러나 uuid는 n 계층 애플리케이션에 적합합니다.PK 생성은 분산화될 수 있습니다.각 클라이언트는 충돌 위험 없이 자체 pk를 생성합니다.그리고 속도 차이는 일반적으로 작습니다.

데이터베이스가 효율적인 저장소 데이터 유형(16바이트, 128비트)을 지원하는지 확인하세요.최소한 base64로 uuid 문자열을 인코딩하고 char(22)를 사용할 수 있습니다.

나는 Firebird와 함께 광범위하게 사용했으며 추천합니다.

다른 팁

그만한 가치가 있기 때문에 GUID 기본 키를 정수로 전환하기만 하면 오랫동안 실행되는 저장 프로시저(9초 이상)의 실행 시간이 수백 밀리초로 떨어지는 것을 보았습니다.그런 말은 아니지 표시 GUID는 나쁜 생각이지만 다른 사람들이 지적했듯이 GUID를 결합하고 정의에 따라 인덱싱하는 것은 정수만큼 빠르지 않습니다.

SQL Server에서 고유 식별자(GUID) 데이터 유형을 사용하고 NEWID() 함수를 사용하여 값을 생성하면 페이지 분할로 인해 끔찍한 조각화가 발생한다고 대답할 수 있습니다.그 이유는 NEWID()를 사용할 때 생성된 값이 순차적이지 않기 때문입니다.SQL 2005에서는 이를 해결하기 위해 NEWSEQUANTIAL() 함수를 추가했습니다.

GUID와 int를 계속 사용하는 한 가지 방법은 guid가 int에 매핑되도록 테이블에 guid와 int를 두는 것입니다.guid는 외부에서 사용되지만 int는 DB에서 내부적으로 사용됩니다.

예를 들어

457180FB-C2EA-48DF-8BEF-458573DA1C10    1
9A70FF3C-B7DA-4593-93AE-4A8945943C8A    2

1과 2는 웹 앱의 조인 및 가이드에 사용됩니다.이 테이블은 매우 좁으므로 쿼리 속도가 매우 빠릅니다.

기본 키를 URI와 결합하는 이유는 무엇입니까?

URI 키를 사람이 읽을 수 있도록(또는 필요에 따라 추측할 수 없도록) 기본 인덱스 정수 기반으로 설정하여 두 가지 장점을 최대한 활용하는 것은 어떨까요?많은 블로그 소프트웨어에서는 항목의 노출된 ID가 '슬러그'로 식별되고 숫자 ID가 시스템 내부에 숨겨져 있습니다.

여기에 추가된 이점은 이제 SEO에 좋은 정말 멋진 URL 구조를 갖게 되었다는 것입니다.분명히 트랜잭션의 경우 이는 좋은 일이 아니지만 stackoverflow와 같은 경우에는 중요합니다(URL 위쪽... 참조).독특함을 얻는 것은 그리 어렵지 않습니다.정말 걱정된다면 테이블 어딘가에 슬러그 해시를 저장하고 삽입하기 전에 조회를 수행하세요.

편집하다: Stackoverflow는 내가 설명하는 시스템을 제대로 사용하지 않습니다. 아래 Guy의 의견을 참조하세요.

다음과 같은 URL 대신:

http://example.com/user/783

가지고 있지 않은 이유:

http://example.com/user/yukondude

어느 것이 인간에게 더 우호적이고 그 작은 정보도 유출하지 않습니까?

행 번호와 관련되어 있지만 순차적이지 않은 정수를 사용할 수 있습니다.예를 들어 순차 ID의 32비트를 가져와 고정된 방식으로 다시 정렬할 수 있습니다(예: 비트 1은 비트 6이 되고, 비트 2는 비트 15가 됩니다).
이는 양방향 암호화이므로 ​​서로 다른 두 ID는 항상 서로 다른 암호화를 갖게 됩니다.
충분한 ID를 생성하고 스키마를 얻는 데 시간이 걸리면 분명히 해독하기 쉬울 것입니다. 그러나 문제를 올바르게 이해한다면 정보를 너무 쉽게 제공하지 않기를 원할 것입니다.

GUID는 MS SQL Server 복제용 RowGUID의 두 배가 되므로 모든 테이블의 기본 키로 GUID를 사용합니다.고객이 갑자기 세계의 다른 지역에 사무실을 열었을 때 매우 쉽습니다...

GUID가 많은 이점을 제공한다고 생각하지 않습니다.사용자는 길고 이해하기 어려운 URL을 싫어합니다.

URL에 매핑할 수 있는 더 짧은 ID를 생성하거나 고유한 사용자 이름 규칙(http://example.com/user/brianly).에있는 사람들 37신호 아마도 웹 앱에 관해서 이런 걱정을 한다고 조롱할 것입니다.

또한 데이터베이스가 기본 값에서 정수 ID 생성을 시작하도록 강제할 수 있습니다.

이는 또한 귀하가 지원서에 대해 관심을 갖는 사항에 따라 달라집니다.n 계층 앱의 경우 GUID/UUID는 구현이 더 간단하고 서로 다른 데이터베이스 간에 이식하기가 더 쉽습니다.정수 키를 생성하기 위해 일부 데이터베이스는 기본적으로 시퀀스 개체를 지원하고 일부 데이터베이스는 시퀀스 테이블의 사용자 정의 구성이 필요합니다.

정수 키는 아마도(숫자가 없음) 쿼리 및 인덱싱 성능은 물론 공간 활용에도 이점을 제공할 것입니다.숫자 키를 사용하면 직접 DB 쿼리가 훨씬 쉬워지고 기억하기 쉽기 때문에 복사/붙여넣기가 줄어듭니다.

저는 정수 형태의 UUID를 사용하는 학생 관리 시스템을 사용하고 있습니다.다음 고유 ID를 보유하는 테이블이 있습니다.

이는 건축학적 관점에서는 좋은 아이디어일 수 있지만 일상적인 작업을 어렵게 만듭니다.때로는 대량 삽입을 수행해야 하는 경우가 있는데 UUID가 있으면 이를 매우 어렵게 만들고 일반적으로 간단한 SELECT INTO 문 대신 커서를 작성해야 합니다.

나는 실제 웹 앱에서 두 가지를 모두 시도했습니다.

내 의견은 정수를 사용하고 짧고 이해하기 쉬운 URL을 갖는 것이 바람직하다는 것입니다.

개발자로서 순차 정수를 보고 총 레코드 수에 대한 일부 정보가 누출된다는 사실을 아는 것은 약간 끔찍한 느낌이지만 솔직히 대부분의 사람들은 아마도 신경 쓰지 않을 것이며 그 정보는 내 비즈니스에 실제로 중요한 적이 없었습니다.

길고 보기 흉한 UUID URL을 갖는 것은 일반 사용자에게 훨씬 더 꺼려지는 것처럼 보입니다.

나는 이것이 준종교적 논쟁을 불러일으키는 문제 중 하나이며, 이야기하는 것은 거의 무의미하다고 생각합니다.나는 당신이 선호하는 것을 사용한다고 말하고 싶습니다.99%의 시스템에서는 어떤 유형의 키를 사용하든 관계가 없으므로 한 종류를 사용하는 것의 이점(다른 게시물에 언급됨)은 결코 문제가 되지 않습니다.

귀하의 상황에서는 GUID를 사용하는 것이 더 나은 선택이라고 생각합니다.더 많은 공간을 차지하지만 더 안전합니다.

Youtube는 11^64 가능성을 제공하는 base64 인코딩으로 11자를 사용하며 일반적으로 작성하기가 매우 쉽습니다.UUID 전체보다 더 나은 성능을 제공할 수 있을지 궁금합니다.기본 64로 변환된 UUID는 제가 생각하는 크기의 두 배가 될 것입니다.

자세한 내용은 여기에서 확인할 수 있습니다. https://www.youtube.com/watch?v=gocwRvLhDf8

저장공간이 효율적인 DB 시스템을 사용한다면 어차피 요즘 HDD는 싸니까요...

나는 GUID가 때때로 작업하기 힘들 수 있고 쿼리 오버헤드가 발생할 수 있다는 것을 알고 있지만 보안 관점에서 볼 때 GUID는 구세주입니다.

보안을 모호하게 생각하면 모호한 URI를 형성하고 테이블, 레코드 및 열 정의 보안을 사용하여 정규화된 DB를 구축할 때 GUID가 잘못될 수 없으므로 정수 기반 ID를 사용하여 수행해 보십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top