Oto sposób wykonania tej czynności na poziomie bazy danych.
Kiedy musiałem to zrobić, zepsułem każdą tablicę kodów na dwie tabele. Jedna zawierała niezmienne dane kulturowe: wewnętrzny identyfikator kodu na pewno, sam kod, jeśli kod był niezmiennikiem kultury i ewentualnie inne kolumny (jak kategorie sortowania/grupowania). Pozostałe zawierały dane specyficzne dla kultury: opisy, kody specyficzne dla kultury, jeśli to właściwe, i tak dalej.
(Kultura specyficzne kody gniazdo szerszeni, nie kopać go, jeśli nie trzeba To może być trochę trudno dostać głowę wokół idei, że US
i EU
są tego samego kodu w inny. Ale są kraje, w których może być politycznie niesmaczne, aby francuskojęzyczni użytkownicy używali US
jako swojego skrótu do États-Unis
. Cóż, kraj.)
Posiadanie tabeli kodów niezmienników kultury umożliwia ustanowienie ograniczeń klucza obcego między nią a głównymi tabelami, które jej używają. Konstruowanie zapytań specyficzne kulturowo jest dość prosta:
SELECT m.*, c.Code, ISNULL(s.Description, lf.Message)
FROM MainTable m
JOIN FooCodeData c ON m.CodeID = c.ID
LEFT JOIN CultureSpecificFooCodeData s ON s.CodeID = c.ID AND s.Culture = @Culture
JOIN LookupFailure lf ON lf.Culture = @Culture
Zauważ, że jeśli kody są specyficzne kulturowo, nawet nie trzeba dołączyć FooCodeData
w tym zapytaniu, wybierając s.Code
zamiast.
Uwaga również jeden nieodłączny słabością tego podejścia, jak pokazano przez LEFT JOIN
i ISNULL
w tym zapytaniu: nie można utworzyć ograniczenie w celu zagwarantowania, że istnieje rząd kultura specyficzne dla każdej kombinacji kodu/hodowlanej. To jest właśnie dla: pobiera komunikat specyficzny dla kultury, który wskazuje, że rekord kodowy specyficzny dla kultury nie został wprowadzony dla danego kodu.