Ich habe viele Tabellen in der Datenbank, die mindestens eine Spalte enthalten, die eine URL enthält. Und diese werden häufig in der gesamten Datenbank wiederholt. Deshalb normalisiere ich sie in eine dedizierte Tabelle und verwende nur numerische IDs, wo ich sie brauche. Ich muss sie oft verknüpfen, daher sind numerische IDs viel besser als vollständige Zeichenfolgen.
In MySql + C++
habe ich früher zum Einfügen vieler URLs in einem Schlag Multi-Row INSERT IGNOREs
oder mysql_set_local_infile_handler()
verwendet. Dann habe ich mit IN ()
die IDs im Batch zurück aus der Datenbank gezogen.
In C# + SQLServer
habe ich festgestellt, dass es eine SqlBulkCopy
-Klasse gibt, die sehr nützlich und schnell beim Masseneinfügen ist. Aber ich brauche auch eine Massenauswahl, um die URL-IDs nach dem Einfügen zu lösen. Gibt es eine solche Hilfsklasse, die genauso funktioniert wie SELECT WHERE IN (viele, urls, hier)
?
Oder haben Sie eine bessere Idee, um URLs in C# auf konsistente Weise in Zahlen umzuwandeln? Ich dachte daran, die URLs mit crc32
oder crc64
zu hashen, aber ich mache mir Sorgen über Kollisionen. Es würde mich nicht stören, wenn Kollisionen selten sind, aber wenn nicht... wäre es ein Problem.
PS: Es geht um zig Millionen URLs, um eine Vorstellung von der Größenordnung zu erhalten.
PS: Für grundlegende Großeinfügung ist SQLBulkCopy
schneller als SqlDbType.Structured
. Außerdem verfügt es über das SqlRowsCopied
-Ereignis für eine Statusverfolgungsrückruf.