Váš nápad hašování dlouhých řetězců za účelem vytvoření tokenu, podle kterého lze vyhledávat v obchodě (mezipaměti nebo databázi), je dobrý. Viděl jsem to udělat pro extrémně velké struny a v prostředí s vysokou hlasitostí a funguje to skvěle.
"Jaký hash byste použili pro tuto aplikaci?"
- Nemyslím si, že na šifrovacím (hašovacím) algoritmu opravdu záleží, protože nehašujete k šifrování dat, ale hašujete, abyste vytvořili token, který lze použít jako klíč k vyhledání delších hodnot. Volba hašovacího algoritmu by tedy měla být založena na rychlosti.
"Vypočítali byste hash v kódu nebo to nechali zpracovat db?"
- Kdyby to byl můj projekt, provedl bych hašování na vrstvě aplikace a poté bych to prošel, abych vyhledával v obchodě (mezipaměť, poté databáze).
"Existuje radikálně odlišný přístup k ukládání/prohledávání dlouhých řetězců v databázi?"
- Jak jsem již zmínil, myslím, že pro váš konkrétní účel je vámi navrhované řešení dobré.
Doporučení k tabulce (pouze demonstrativní):
user
- id int(11) unsigned not null
- name_first varchar(100) není null
user_agent_history
user_id
int(11) unsigned není nullagent_hash
varchar(255) není null
agent
agent_hash
varchar(255) není nullbrowser
varchar(100) není nullagent
text není null
Několik poznámek ke schématu:
-
Z vašeho OP to zní, jako byste potřebovali M:M vztah mezi uživatelem a agentem, protože uživatel může používat Firefox z práce, ale pak může doma přejít na IE9. Z toho vyplývá potřeba kontingenční tabulky.
-
Varchar(255) použitý pro
agent_hash
je k diskusi. MySQL doporučuje pomocí varbinárního typu sloupce pro ukládání hashů, kterých je několik typů. -
Také bych navrhoval vytvořit
agent_hash
primární klíč nebo přinejmenším přidání omezení UNIQUE do sloupce.