Ihre Idee, lange Zeichenfolgen zu hashen, um ein Token zu erstellen, nach dem in einem Speicher (Cache oder Datenbank) gesucht werden kann, ist gut. Ich habe gesehen, wie dies für extrem große Zeichenfolgen und in Umgebungen mit hohem Volumen durchgeführt wurde, und es funktioniert hervorragend.
"Welchen Hash würden Sie für diese Anwendung verwenden?"
- Ich glaube nicht, dass der Verschlüsselungsalgorithmus (Hashing-Algorithmus) wirklich wichtig ist, da Sie nicht hashen, um Daten zu verschlüsseln, Sie hashen, um ein Token zu erstellen, das als Schlüssel zum Nachschlagen längerer Werte verwendet werden kann. Daher sollte die Wahl des Hashing-Algorithmus auf der Geschwindigkeit basieren.
"Würden Sie den Hash im Code berechnen oder die DB damit umgehen lassen?"
- Wenn es mein Projekt wäre, würde ich das Hashing auf der App-Ebene durchführen und es dann weiterleiten, um im Store nachzuschlagen (Cache, dann Datenbank).
"Gibt es einen radikal anderen Ansatz zum Speichern/Suchen langer Zeichenfolgen in einer Datenbank?"
- Wie ich bereits erwähnt habe, denke ich, dass Ihre vorgeschlagene Lösung für Ihren speziellen Zweck gut ist.
Tabellenempfehlungen (nur demonstrativ):
user
- id int(11) unsigned not null
- name_first varchar(100) nicht null
user_agent_history
user_id
int(11) unsigned not nullagent_hash
varchar(255) nicht null
agent
agent_hash
varchar(255) nicht nullbrowser
varchar(100) nicht nullagent
Text nicht null
Einige Anmerkungen zum Schema:
-
Aus Ihrem OP geht hervor, dass Sie eine M:M-Beziehung zwischen Benutzer und Agent benötigen, da ein Benutzer möglicherweise Firefox von der Arbeit aus verwendet, dann aber zu Hause zu IE9 wechselt. Daher die Notwendigkeit für die Pivot-Tabelle.
-
Der für
agent_hash
verwendete varchar(255). steht zur Debatte. MySQL schlägt vor Verwenden eines varbinary-Spaltentyps zum Speichern von Hashes, von denen es mehrere Typen gibt. -
Ich würde auch vorschlagen, entweder
agent_hash
zu erstellen einen Primärschlüssel oder zumindest das Hinzufügen einer UNIQUE-Einschränkung zur Spalte.