Ich habe eine Anwendung, um mit einer Datei umzugehen und sie in mehrere Segmente zu fragmentieren, dann speichere das Ergebnis in der sql Server Datenbank. Es gibt viele duplizierte Dateien (vielleicht mit anderem Dateipfad), also gehe ich zuerst alle diese Dateien durch und berechne den Md5-Hash für jede Datei und markiere die duplizierte Datei mit der Spalte [Dupliziert].
Dann werde ich jeden Tag diese Anwendung ausführen und die Ergebnisse in der Tabelle [Result] speichern. Das Datenbankschema ist wie folgt:
%Vor%Und ich habe eine Anforderung, diese 2 Tabelle auf FileMd5Hash beizutreten.
Da die Anzahl der Zeilen von [Result] sehr groß ist, möchte ich eine int Identity-Spalte hinzufügen, um diese mit den folgenden Tabellen zu verbinden:
%Vor%Was sind die Vor- und Nachteile dieser beiden Möglichkeiten?
Ein int-Schlüssel ist einfacher zu implementieren und einfacher zu verwenden und zu verstehen. Es ist auch kleiner (4 Byte im Vergleich zu 16 Byte), sodass die Indizes etwa doppelt so viele Einträge pro IO-Seite haben, was eine bessere Leistung bedeutet. Die Tabellenzeilen sind auch kleiner (OK, nicht viel kleiner), also passen Sie wieder mehr Zeilen pro Seite = weniger IO.
Hash kann immer Kollisionen erzeugen. Obwohl es, wie das Geburtstagsproblem zeigt, sehr selten ist, werden Kollisionen immer wahrscheinlicher, wenn die Anzahl der Datensätze steigt. Die Anzahl der Elemente, die für eine 50% ige Chance auf eine Kollision mit verschiedenen Bitlängen-Hashes benötigt wird, ist wie folgt:
%Vor%Es gibt auch das Problem, Nicht-ASCII-Bytes umzuleiten - schwieriger zu debuggen, über Kabel zu senden, usw.
Verwenden Sie int
sequentielle Primärschlüssel für Ihre Tabellen. Jeder andere tut das.
Hier ist ein sehr netter Artikel, in dem Pro und Contra erklärt wird, beide zu verwenden:
Die Verwendung von MD5-Hash entspricht der Verwendung einer GUID für Ihren Primärschlüssel. Hash-Kollisionen sind selten, aber passieren, vielleicht möchten Sie damit umgehen.
Ich werde persönlich mit INT IDENTITY gehen, aber das kann sich je nach Ihrer Implementierung unterscheiden.
Verwenden Sie Ints für Primärschlüssel, keine Hashes. Jeder warnt vor Hash-Kollisionen, aber in der Praxis sind sie kein großes Problem; es ist einfach, nach Kollisionen zu suchen und erneut zu hacken. Sequenzielle IDs können auch kollidieren, wenn Sie Datenbanken zusammenführen.
Das große Problem mit Hashes als Schlüssel ist, dass Sie Ihre Daten nicht ändern können. Wenn Sie es versuchen, ändert sich Ihr Hash und alle Fremdschlüssel werden ungültig. Sie müssen eine "Nein, das ist der echte Hash" -Spalte in Ihrer Datenbank erstellen und Ihr alter Hash wird nur eine große, nicht sequentielle Ganzzahl.
Ich wette, Ihr Business-Analyst wird sagen: "Wir implementieren WORM, damit sich unsere Aufzeichnungen niemals ändern werden". Sie werden sich als falsch erweisen.
Tags und Links sql sql-server database hash