2014-05-20 4 views
8

파일을 처리하고 여러 세그먼트로 분할 한 다음 결과를 SQL 서버에 저장하는 응용 프로그램이 있습니다. 데이터 베이스. (아마도 다른 파일 경로를 가진) 많은 중복 파일이 있습니다. 그래서 먼저 모든 파일을 검토하고 각 파일에 대한 Md5 해시를 계산하고 [Duplicated] 열을 사용하여 중복 파일을 표시하십시오.MD5 해시를 기본 키로 사용하고 SQL ID를 기본 키로 사용하기

그런 다음 매일이 응용 프로그램을 실행하고 결과를 [결과] 테이블에 저장합니다. DB를 스키마는 다음과 같습니다 :

CREATE TABLE [dbo].[FilePath] 
    (
     [FilePath] NVARCHAR(256) NOT NULL PRIMARY KEY, 
     [FileMd5Hash] binay(16) NOT NULL, 
     [Duplicated] BIT NOT NULL DEFAULT 0, 
     [LastRunBuild] NVARCHAR(30) NOT NULL DEFAULT 0 
    ) 

    CREATE TABLE [dbo].[Result] 
    (
     [Build] NVARCHAR(30) NOT NULL, 
     [FileMd5Hash] binay(16) NOT NULL , 
     [SegmentId] INT NOT NULL, 
     [SegmentContent] text NOT NULL 
     PRIMARY KEY ([FileMd5Hash], [Build], [SegmentId]) 
    ) 

그리고 FileMd5Hash에이 두 테이블을 조인 할 필요가있다.

CREATE TABLE [dbo].[FilePath] 
    (
     [FilePath] NVARCHAR(256) NOT NULL PRIMARY KEY, 
     [FileMd5Hash] binay(16) NOT NULL, 
     **[Id] INT NOT NULL IDENTITY,** 
     [Duplicated] BIT NOT NULL DEFAULT 0, 
     [LastRunBuild] NVARCHAR(30) NOT NULL DEFAULT 0 
    ) 

    CREATE TABLE [dbo].[Result] 
    (
     [Build] NVARCHAR(30) NOT NULL, 
     **[Id] INT NOT NULL,** 
     [SegmentId] INT NOT NULL, 
     [SegmentContent] text NOT NULL 
     PRIMARY KEY ([FileMd5Hash], [Build], [SegmentId]) 
    ) 

그래서 찬반의 양론 무엇을 :

[결과]가 매우 큰 행 수, 나는 다음과 같이 테이블이 가입되어있는 int ID 열을 추가 할 때문에

이 두 가지 방법? 기본 키에 대한 GUID를 사용하여 같은 것입니다 MD5 해시를 사용

http://databases.aspfaq.com/database/what-should-i-choose-for-my-primary-key.html

:

+2

MD5 알고리즘은 완전히 다른 데이터에 대해 중복 값을 생성 할 수 있습니다.위키 백과를 확인하십시오. 자세한 내용이 있습니다. 나는 더 효율적으로 색인 될 것이므로'int' ID를 사용하는 것이 더 낫다고 생각한다. – cha

+0

당신이하려는 것을 이해하고 왜 ID 열이 필요한지에 대한 정보가 충분하지 않다. – usr

답변

8

int 키는 구현하기가 쉽고 사용하기 쉽고 이해하기 쉽습니다. 또한 더 작기 때문에 (4 바이트 대 16 바이트), 색인은 IO 페이지 당 항목 수의 두 배에 적합하므로 성능이 향상됩니다. 테이블 행도 작아 지므로 (OK, 작게는 안됨) 페이지 당 더 많은 행 = IO를 더 많이 맞출 것입니다.

해시는 항상 충돌을 일으킬 수 있습니다. 그럼에도 불구하고 매우 드물 긴하지만 이 보여 주듯이 레코드 수가 증가하면 충돌이 발생할 가능성이 커집니다. 다음과 같이 다양한 비트 길이 해시와의 충돌의 50 %의 확률에 필요한 항목 수는 다음과 같습니다

Hash length (bits) Item count for 50% chance of collision 
       32 77000 
       64 5.1 billion 
       128 22 billion billion 
       256 400 billion billion billion billion 

는 비 ASCII 바이트 주위에 통과해야하는 문제가있다 - 디버깅하기 어려워, 보내 와이어 등

int 테이블의 순차 기본 키를 사용하십시오. 다른 사람들은 그렇지 않습니다.

+0

+1 마지막 구문에 대해서만 -) – trailmax

+0

[계산 확인] (http://www.wolframalpha.com/input/?i=1+-++%28+1+%2F+%282%5E32%29+ % 29 % 5E70000 * + % 28 + % 28 + % 282 % 5E32 % 29 % 21 + % 29 + % 2F + % 28 + % 28 % 282 % 5E32 % 29 + - + 70000 % 29 + % 21 + % 29 + % 29). 확률 ~ 32 비트 및 70,000 항목으로 0.44. 140,000으로 거의 90 %입니다. 유일성이 중요하다면 그 아이템 주문에는 실질적으로 쓸모가 없습니다. – Medorator

+0

@usr 너 무슨 소리하는거야? 나는'int' 순차 (surrogate) 키를 사용하고 * not *는 해시를 키로 사용한다고 말하고있다. 이는 암호화 또는 보안과 관련이없는 실용적인 문제입니다. – Bohemian

1

여기에 아주 좋은 모두 사용의 장점과 단점을 설명하는 글이다. 해시 충돌은 드물지만 발생하지만 처리해야 할 수 있습니다.

개인적으로 INT ID로 이동하지만 구현에 따라 다를 수 있습니다.

0

해시가 아닌 기본 키에 ints를 사용하십시오. 모든 사람들은 해시 충돌에 대해 경고하지만 실제로는 큰 문제는 아닙니다. 충돌을 확인하고 다시 해쉬하는 것이 쉽습니다. 순차적 ID는 데이터베이스를 병합하는 경우에도 충돌 할 수 있습니다.

해시 키의 큰 문제는 데이터를 변경할 수 없다는 것입니다. 시도하면 해시가 변경되고 모든 외래 키가 무효화됩니다. 데이터베이스에 "아니요, 실제 해시입니다."열을 만들어야하며 이전 해시는 큰 비 순차적 정수가됩니다.

비즈니스 분석가는 "우리의 기록이 변경되지 않도록 WORM을 구현합니다"라고 말할 것입니다. 그들은 틀린 것으로 입증 될 것입니다.

관련 문제