Questa domanda riguarda un problema un po 'più complicato di quello che è già stato affrontato in queste vecchie domande, tutte duplicate l'una dell'altra:
Suggerimento per la struttura del database per multilingua (giugno 2011)
Qual è la migliore struttura di database per conservare i dati multilingue? (2010 febbraio)
Quali sono le migliori pratiche per la progettazione di database multilingue? (Maggio 2009)
Schema per un database multilingue (novembre 2008)
Lo schema di database più popolare per il supporto di interfacce utente multilingue sembra avere tutti i testi tradotti di tutte le lingue in una tabella con 3 colonne: l'id del testo, il codice della lingua e il testo stesso. L'ID testo e il codice lingua insieme costituiscono la chiave primaria.
Va tutto bene, ma ora considera una complicazione: supponi che i testi debbano essere ricercabili. Supponiamo, ad esempio, che si tratti di un negozio elettronico multilingue. Ciò significa che per ogni categoria di prodotto inserita nel database, il proprietario del negozio inserirà il nome della categoria di prodotto in ciascuna delle N lingue supportate e quindi l'acquirente sarà in grado di cercare la categoria di prodotto per nome, nella loro lingua .
C'è un problema: regole di confronto .
Lingue diverse hanno sequenze di confronto diverse e la sequenza di confronto che funziona per una lingua non funziona per un'altra. Quindi, se tutti i testi di tutte le lingue sono su una singola colonna, quale sequenza di regole avranno? Come interrogheremo il database per trovare l'id di testo di un testo specifico? Mentre in un prodotto Web la precisione e le prestazioni della ricerca potrebbero non essere terribilmente importanti, ai fini di questa discussione supponiamo che contino davvero.
La maggior parte degli amministratori di database ha familiarità con il concetto di regole di confronto nel senso di "regole di confronto del database". Fortunatamente, questa è solo la collazione predefinita, che viene utilizzata se non sono presenti altre informazioni sulla collazione, ma esistono anche altri luoghi in cui è possibile specificare la collazione:
Il comando SQL CREATE INDEX supporta una specifica di confronto. (Anche se si dice che Microsoft SQL Server non lo supporti; qualcuno lo sa?)
L'istruzione SQL SELECT supporta anche le regole di confronto, ma in questo caso la specifica delle regole di confronto funziona come una funzione, causando una scansione dell'indice anziché una ricerca dell'indice, qualcosa che potrebbe essere inammissibile se vogliamo prestazioni. (Ancora una volta, se questo è il meglio che possiamo avere, potrebbe essere meglio di niente.)
Ho anche sentito che su Microsoft SQL Server puoi avere colonne calcolate e non persistenti su cui puoi specificare regole di confronto e creare un indice filtrato, anche se non ne ho mai sentito parlare prima e se si tratta di un solo Microsoft-SQL-Server caratteristica, quindi preferirei astenermi dall'usarlo, non importa quanto sia bello e ben pensato.
Quindi, alla luce di tutto ciò, come strutturiamo il nostro database e come eseguiamo le nostre query, se l'obiettivo è un database multilingue aggiornabile e ricercabile?
Questa domanda è stata ispirata da una discussione che ha avuto luogo qui: in che modo nvarchar (max) memorizzerà i dati nel database sarà veloce se alcuni dati sono inferiori a 4000 caratteri?