Aquí hay una manera de hacerlo a nivel de base de datos.
Cuando tuve que hacer esto, rompí cada tabla de códigos en dos tablas. Uno de ellos contenía datos invariantes para el cultivo: la identificación interna del código, el código en sí, si el código era invariante para el cultivo, y posiblemente otras columnas (como categorías de clasificación/agrupación). El otro contenía datos específicos de la cultura: descripciones, códigos específicos de la cultura si correspondía, etc.
(Los códigos específicos de la cultura son un nido de avispas; no lo patees si no tienes que hacerlo. Puede ser un poco difícil entender que US
y EU
son el mismo código en diferentes idiomas. Sin embargo, hay países en los que puede ser políticamente inaceptable para hacer los usuarios de habla francesa utilizan US
como su abreviatura de États-Unis
. Bueno, un país.)
Tener una tabla de códigos de la cultura invariante permite establecer restricciones de clave externa entre éste y tablas principales que lo utilizan. La construcción de consultas específicas de la cultura es bastante sencillo:
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
Tenga en cuenta que si sus códigos son específicos de la cultura, que ni siquiera es necesario para unirse a FooCodeData
en esa consulta, seleccionando s.Code
lugar.
Tenga en cuenta también una debilidad inherente de este enfoque, como se muestra en LEFT JOIN
y ISNULL
en esa consulta: no puede crear una restricción para garantizar que exista una fila cultural específica para cada combinación de código/cultura. Para eso sirve LookupFailure
: recibe el mensaje cultural específico que indica que no se ha ingresado el registro del código específico del cultivo para un código dado.