Vor-und Nachteile der Verwendung von MD5-Hash der primäre Schlüssel ist gegen die Verwendung eines int-identity, die als Primärschlüssel in der SQL Server -
Ich habe eine Anwendung, um mit einer Datei und fragment auf mehrere Segmente, speichern Sie das Ergebnis in der sql server-Datenbank. Es gibt viele duplizierte Datei (vielleicht mit verschiedenen Datei-Pfad), damit ich zuerst gehen Sie durch alle Dateien und berechnen Sie den Md5-hash für jede Datei, und markieren Sie duplizierte Datei mit dem [Dupliziert] - Spalte.
Dann den Alltag, werde ich diese Anwendung ausführen und die Ergebnisse speichern in der [Ergebnis] - Tabelle.
Das db-schema ist wie folgt:
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])
)
Und ich haben eine Anforderung zum beitreten dieser 2-Tabelle auf FileMd5Hash.
Da die Anzahl der Zeilen von [Ergebnis] ist sehr groß, ich möchte noch hinzufügen, dass ein int-Identity-Spalte beitreten, um diese Tabellen wie folgt:
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])
)
Also, Was ist der vor-und Nachteile von diesen 2 Möglichkeiten?
- Bitte beachten Sie, dass die MD5-Algorithmus produzieren kann doppelte Werte für völlig unterschiedliche Daten. Überprüfen Sie wikipedia, es hat mehr details. Ich denke, mit
int
id ist besser, als es indiziert wird effizienter - Nicht genug Informationen, um zu verstehen, was Sie versuchen zu tun und warum müssen Sie möglicherweise eine identity-Spalte.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen int-Schlüssel ist einfacher zu implementieren und leichter zu benutzen und zu verstehen. Es ist auch kleiner (4 bytes vs 16 bytes), so werden die Indizes passen ungefähr das doppelte der Anzahl der Einträge pro IO-Seite, was bedeutet bessere Leistung. Die Zeilen der Tabelle werden auch kleiner (OK, nicht viel kleiner), also wieder Sie passen mehr Zeilen pro Seite = weniger IO.
Hash kann immer zu Kollisionen. Obwohl äußerst selten, dennoch, als die Geburtstag problem zeigt, Kollisionen werden mehr und mehr wahrscheinlich, da die Anzahl der Datensätze erhöht. Die Anzahl der Elemente benötigt, die für eine 50% chance einer Kollision mit verschiedenen bit-Länge der hashes ist wie folgt:
Gibt es noch das Problem des habens zu übergeben, um nicht-ascii-bytes - schwieriger zu Debuggen, senden Sie über Draht, etc.
Verwenden
int
sequenzielle Primärschlüssel für Ihre Tabellen. Jeder andere tut.int
sequentiell (Surrogat -) Taste und die nicht zu verwenden, hashes, die als Schlüssel. Dies ist eine praktische Angelegenheit nichts mit der Kryptographie oder der Sicherheit.Verwendung mit int-Werten für Primärschlüssel, keine hashes. Jeder warnt vor hash-Kollisionen, aber in der Praxis ist das kein großes problem; es ist einfach zu prüfen, Kollisionen und re-hash. Sequenzielle IDs kollidieren können, wenn Sie Zusammenführen von Datenbanken.
Das große problem mit hashes, die als Schlüssel ist, dass Sie können nicht Ihre Daten ändern. Wenn Sie versuchen, Ihren hash ändern und alle foreign keys ungültig werden. Erstellen Sie ein "Nein, das ist der eigentliche hash" - Spalte in der Datenbank und Ihre alten hash wird eine große nicht sequenziellen integer.
Ich Wette, Ihre business-analyst sagt: "wir setzen den WURM, so dass unsere Aufzeichnungen wird sich nie ändern". Sie werden sich als falsch erwiesen.
Hier ist ein sehr schöner Artikel zu erklären, vor-und Nachteile der Verwendung von beiden:
https://web.archive.org/web/20140618031501/http://databases.aspfaq.com/database/what-should-i-choose-for-my-primary-key.html
MD5-hash wird wie mit einem GUID für Ihr Primärschlüssel. Hash-Kollisionen sind selten aber passieren, können Sie damit umgehen wollen.
Ich persönlich gehe mit INT IDENTITY, aber es kann unterschiedlich sein, je auf Ihre Umsetzung.