특히 웹 앱에서 UUID를 사용하는 데이터베이스 행 식별자는 어떻게 생각하십니까?
저는 단순성과 단순 (추정 된) 속도를 위해 데이터베이스의 기본 키로 긴 정수를 항상 사용하는 것을 선호했습니다. 그러나 인스턴스에 REST 또는 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 ) 에서 사용자 이름을 사용하는 것에 대해 질문에 대해 한 사람들의 경우 한 이름을 가진 개체 인스턴스에서는 잘 작동하지만 웹의 수백만 개는 어떻습니까? 실제로 숫자로만 생성 할 수있는 앱 개체? 주문, 거래, 송장, 두더지 이미지 이름, 스택 오버플로 질문, ...
질문의 웹에 대해 말할 수 없습니다. 그러나 uuid는 n 계층 응용 프로그램에 적합합니다. PK 생성은 분산화 될 수 있습니다. 각 클라이언트는 충돌 위험없이 자체 pk를 생성합니다. 그리고 속도 차이는 일반적으로 작습니다.
데이터베이스가 스토리지 스토리지 데이터 유형 (16 바이트, 128 비트)을 지원하는지 확인하십시오. 최소한 base64로 uuid 인코딩을 인코딩하고 char (22)를 사용할 수 있습니다.
나는 Firebird와 함께 사용하게됩니다.
그만한 가치는 GUID 기본 키에서 정수로 전환하는 것만으로도 정수 실행되는 저장 프로 시저 (9 초 이상)의 가동이 수백 밀리 초로 감소하는 것을 보았습니다. 그 것은 잘못된 생각 이라고 표시 되지만, 다른 사람들이 지적으로, 정의에 의해, 어디서나 가까운 빠른 정수와 같이 될 수 없어, 거기에없는 것과 색인.
SQL Server에서 고유 식별자 (GUID) 데이터 유형을 사용하고 NEWID () 함수를 사용하여 값을 생성하면 페이지 분할로 인해 끔찍한 조각화가 발생 답변 할 수 있습니다. 그 이유는 NEWID ()를 사용할 때 사용할 때 사용하지 않기 때문에 값이 생성됩니다. SQL 2005는 다음과 같은 문제를 해결하기 위해 NEWSEQUANTIAL () 함수를 추가했습니다.
GUID와 int를 계속 사용하는 한 가지 방법은 guid가 int에 매핑 테이블에 guid와 int를 포함하는 것입니다. guid는 외부에서 사용되는 DB에서 내부적으로 사용됩니다.
예를 들면
457180FB-C2EA-48DF-8BEF-458573DA1C10 1
9A70FF3C-B7DA-4593-93AE-4A8945943C8A 2
1과 2는 웹 앱의 조인 및 GUID에 사용됩니다. 이 테이블은 매우 좁고 쿼리가 매우 빠입니다.
기본 키를 URI와 연결하는 이유는 무엇입니까?
URI 키가 사람이 읽을 수있는 것 (또는 필요에 따라 추측 할 수없는) 기본 설계 정수 기반으로 두 가지 장점을 모두 얻을 수있는 이유는 무엇입니까? 많은 블로그 소프트웨어에서 항목의 노출 된 ID가 '슬러그'로 포토에 숫자 ID는 시스템 내부에 숨겨져 있습니다.
여기에 추가 된 이점은 이제 SEO에 좋은 정말 멋진 URL 구조가 될 것입니다. 분명히 트랜잭션의 경우에는 좋지 않지만 stackoverflow와 같은 경우에는 중요합니다 (URL up top ... 참조). 독특함을 얻는 것은 어렵지 않습니다. 정말 걱정할 필요가있는 해시를 테이블 어딘가에 저장하고 삽입하기 전에 수행하십시오.
편집 : Stackoverflow는 내가 설명하는 시스템을 사용하지 않습니다. 아래 Guy의 의견을 참조하십시오.
다음과 같은 URL 대신 :
http://example.com/user/783
없는 이유 :
http://example.com/user/yukondude
어느 것이 인간에게 더 접근하고 작은 정보를 유출하지 않습니까?
행 번호와 관련된 번호는 사용할 수 있습니다. 예를 들어, 32 비트의 순차 ID를 가져오고 고정 된 체계로 재정렬 할 수 있습니다 (예 : 비트 1이 비트 6이되고 비트 2가 비트 15가 등되는).
이것은 양방향 암호화이며 두 개의 서로 다른 ID가 항상 서로 다른 암호화를 사용합니다.
충분한 ID를 생성하고 스키마를 사용하는 데 시간이 걸리면 충분하기 만하면 쉽게 이해하면 정보를 쉽게 제공하지 않습니다.
GUID는 MS SQL Server 복제를위한 RowGUID를 사용하여 모든 테이블의 기본 키를 사용합니다. 클라이언트가 갑자기 세계의 다른 지역에 사무실을 열 때 매우 쉽게 만듭니다 ...
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에서 전체보다 더 나은 성능을 제공하는지 궁금합니다. Base 64로 변환 된 UUID는 내가 생각하는 크기의 두 배가 될 것입니다.
자세한 정보는 여기에서 찾을 수 있습니다 : https://www.youtube.com/watch?v=gocwRvLhDf8
저장 용량이 효율적인 DB 시스템을 사용하는 한, 요즘 HDD는 어쨌든 싸다 ...
나는 GUID가 때때로 작업하기가 어려울 수 있으며 약간의 쿼리 오버 헤드가있을 수 있지만 보안 관점에서 구세주입니다.
모호한 URI를 형성하고 테이블, 레코드 및 열 정의 보안을 사용하여 정규화 된 DB를 구축 할 때 모호함으로 보안을 생각하고 GUID로 잘못 될 수없는 경우 정수 기반 ID로 시도해보십시오.
'ProgramingTip' 카테고리의 다른 글
Firebase 데이터 수정을 제한하는 방법은 무엇입니까? (0) | 2020.10.24 |
---|---|
상속 및 준비 (0) | 2020.10.24 |
열거를위한 단수 또는 복수? (0) | 2020.10.24 |
복수의 염색체 생성? (0) | 2020.10.24 |
org.hibernate.PersistentObjectException : 분리 된 지속가 지속 전달. (0) | 2020.10.24 |