2010-01-12 13 views
12

Duplicar posible:
Schema for a multilanguage databaseEl diseño de un esquema de base de datos localizada

Estoy trabajando en una aplicación web que tengo la intención de hacer disponible en varios idiomas. A medida que diseño la base de datos, voy y vienen entre dos formas diferentes de almacenar descripciones localizadas y otras cosas en la base de datos.

La primera opción es la nombre_tabla conocido, opción de tipo de table_name_ml:

TABLE Category (
    ID int, 
    ParentID int, 
    Name varchar(50), 
    Description varchar(255) 
) 

TABLE Category_ML (
    ID int, 
    CategoryID int, 
    LocaleID int, 
    Name varchar(50), 
    Description varchar(255) 
) 

La segunda opción sería la de no almacenar el texto en las tablas de base en todo, pero en lugar guardar un testigo que podría ser utilizado para buscar el texto localizado real en otro lugar, como este:

TABLE Category (
    ID int, 
    ParentID int, 
    NameToken varchar(50), 
    DescriptionToken varchar(50), 
) 

// Tables in a separate content management type system 
TABLE Content (
    ID int, 
    Token varchar(50) 
) 

TABLE Translation (
    ID int 
    ContentID int, 
    LocaleID int, 
    Value text 
) 

la idea aquí es que las tablas de contenido y la traducción se mantenga el texto localizado para muchas entidades diferentes en la base de datos. La capa de servicio devolvería los objetos base solo con los tokens y la capa de vista buscaría los valores de texto reales usando las tablas Contenido/Traducción, que se almacenarían en caché. Las tablas de Contenido/Traducción también se usarían para almacenar otro tipo de contenido CMS (texto estático en páginas web, etc.)

Me gusta la primera opción porque es verdadera y comprobada, pero la segunda opción parece tener tantas otras ventajas:

  1. Todo mi texto/contenido localizado está en un solo lugar (hace la traducción más fácil).
  2. La capa de servicio realmente no necesita preocuparse por las configuraciones regionales.
  3. Simplifica las consultas al no tener que unirse a un grupo de tablas de tipos ML.

Como nunca antes había visto un diseño como este, supongo que me falta algo. ¿Alguna buena razón para no diseñarlo de esta manera? ¿O tal vez hay una opción mejor en la que no he pensado?

+1

¿Por qué tienes una tabla de contenido? ¿No podría usar su token para buscar directamente la traducción en la tabla de traducción? –

+0

No, eso lo pienso, si los tokens solo contienen información como . . ¿por qué la categoría de la tabla necesitaría token-properties de todos modos? –

+0

@paskster - La tabla de contenido está allí para evitar la duplicación de la columna del token en la tabla de traducción. Habría muchas traducciones para un token dado. También le permite tener RI entre la tabla de Categoría y la tabla de Contenido si lo desea. –

Respuesta

3

Primero diré que no he tratado la localización antes, así que esta es solo mi opinión y no basada en la experiencia.

Me gusta su segunda opción. En lo que respecta al DB, sus datos y una forma de acceder/manipular los datos. En este caso, todos los datos están allí y, en su mayoría, lo leerán y tendrán una buena forma de llegar a ellos. Puede responder el mismo problema en ambos escenarios. Preferiría la segunda opción yo mismo porque reduce las tablas locas en todas partes. Está manteniendo una mesa para el propósito específico de la traducción. Puede reutilizarlo (sin crear más tablas solo para actualizaciones posteriores) y mantiene la integridad. Incluso podría reutilizar nombres si tiene sentido en alguna parte. Como si tuvieras 'Mantequilla' como Categoría y como Favorito en otro lugar.

Me gusta poner datos relacionados en una tabla cuando sea posible y no tener datos relacionados con 'traducir' en varios lugares.

El único lugar donde puede fallar es si tiene algo más que Nombre y Descripción para algo que necesita traducción. Tal vez tenga Nombre, Descripción, Código, Palabra mágica, Alias ​​tonto, etc. para un artículo. Aunque puedes evitar esto agregando más NameTokens en esa tabla relevante y reutilizando Name, pero esto es un poco hackeo.

Solo asegúrese de que el modelo cumpla con sus necesidades a todos y debería funcionar bien. Siempre puede agregar una tabla de traducción especial si fuera necesario para una tabla específica. Esto no sería diferente de crear muchas tablas, aunque una solución híbrida podría ser confusa. Lo mejor es encontrar una forma y tratar de mantenerla.

+0

Tener más que solo nombre y descripción no debería ser un problema . El campo de token es solo una pieza de texto de forma libre. Por ejemplo, el "NameToken" para una categoría con ID de 1 podría ser 'DB.Category.1.Name'. Si tuviera un campo llamado "MagicWord" en esa tabla, el token para eso podría ser 'DB.Category.1.MagicWord'. Entonces, en general, los tokens serían nombrados como 'DB. . . '. Espero que eso tenga más sentido. –

+0

bien, entonces parece que tienes todos los casos que se me ocurren planeados :) Parece un buen modelo para mí. –

-1

¡Hay una opción extra y creo que apostaré por esto!

  • ¡Separar base de datos totalmente!

razones (PROS):

  • Pyhsically separados localizada base de datos
  • Andamios (generados Presentación Capas)
  • Fácil Orm

CONS:

  • Usted tiene que resolver el problema de ID Única (replicación)
  • Es necesario sincronizar esquema y los datos de localización no
+0

Sus "pros" son hechos, no ventajas. Los "contras" son bastante pesados ​​contra los pequeños "profesionales". – SandRock

+0

Serhat no mencionó el asesinato Pro: para un archivo db grande, está optimizado para las pesadas búsquedas de información de idiomas requeridas; ya está separado por idiomas. Pero esto es bueno solo para grandes dbs. – aiho

Cuestiones relacionadas