Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Mostrar información en varios idiomas

Estas en el tema de Mostrar información en varios idiomas en el foro de Bases de Datos General en Foros del Web. Tengo una duda respecto a un posible planteamiento de una base de datos o aplicación web. Tengo una base de datos en la que tengo ...
  #1 (permalink)  
Antiguo 23/03/2017, 03:29
Avatar de senseeye3led  
Fecha de Ingreso: abril-2016
Ubicación: 127.0.0.1
Mensajes: 163
Antigüedad: 8 años
Puntos: 11
Pregunta Mostrar información en varios idiomas

Tengo una duda respecto a un posible planteamiento de una base de datos o aplicación web.

Tengo una base de datos en la que tengo artículos y su descripción; estos se encuentran en un único idioma y una aplicación web PHP hace uso de ellas.

¿Si quisiera añadir el día de mañana varios idiomas cual sería la mejor manera de hacerlo? ¿Añadir la información en la base de datos o en el PHP?

Supongo que es un tema bastante trillado y habrá maneras establecidas de cómo hacerlo.

Salu2
  #2 (permalink)  
Antiguo 23/03/2017, 06:41
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Mostrar información en varios idiomas

Usualmente, sería agregando registros con la misma info de cada idioma,mas una columna como discriminante para determinar el idioma del caso.
Esa columna solo requeriria unos cinco caracteres, por ejemplo, conteniendo la misma sigla del codigo de regionalizacion (EN-US, ES-ES, ES-AR, FR-fr, etc.)
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 24/03/2017, 10:32
Avatar de senseeye3led  
Fecha de Ingreso: abril-2016
Ubicación: 127.0.0.1
Mensajes: 163
Antigüedad: 8 años
Puntos: 11
Respuesta: Mostrar información en varios idiomas

He leído en internet 3 planteamientos:
Código SQL:
Ver original
  1. CREATE TABLE app_product (
  2.   Id INT IDENTITY NOT NULL,
  3.   Description_es Text,
  4.   Description_fr Text,
  5.   PRIMARY KEY (Id)
  6. );

Código SQL:
Ver original
  1. CREATE TABLE ref_language (
  2.   Code CHAR(2)NOT NULL,
  3.   Name VARCHAR(20) NOT NULL,
  4.   PRIMARY KEY (Code)
  5. );
  6.  
  7. CREATE TABLE app_translation (
  8. Id INT IDENTITY NOT NULL,
  9. PRIMARY KEY (Id)
  10. );
  11.  
  12. CREATE TABLE app_translation_entry (
  13. TranslationId INT NOT NULL,
  14. LanguageCode CHAR(2) NOT NULL,
  15. Text Text NOT NULL,
  16. FOREIGN KEY (TranslationId) REFERENCES app_translation(Id),
  17. FOREIGN KEY (LanguageCode) REFERENCES ref_language(Code)
  18. );
  19.  
  20. CREATE TABLE app_product (
  21. Id INT IDENTITY NOT NULL,
  22. Description INT NOT NULL,
  23.         PRIMARY KEY (Id),
  24. FOREIGN KEY (Description) REFERENCES app_translation(Id)
  25. );
Código SQL:
Ver original
  1. CREATE TABLE ref_language (
  2.   Code CHAR(2)NOT NULL,
  3.   Name VARCHAR(20) NOT NULL,
  4.   PRIMARY KEY (Code)
  5. );
  6.  
  7. CREATE TABLE app_product (
  8. Id INT IDENTITY NOT NULL,
  9. PRIMARY KEY (Id)
  10. );
  11.  
  12. CREATE TABLE app_product_translation (
  13. ProductId INT NOT NULL,
  14. LanguageCode CHAR(2) NOT NULL,
  15. Description Text NOT NULL,
  16. FOREIGN KEY (ProductId) REFERENCES app_product(Id),
  17. FOREIGN KEY (LanguageCode) REFERENCES ref_language(Code)
  18. );


Pero cada una tiene sus ventajas y desventajas.

Última edición por gnzsoloyo; 24/03/2017 a las 15:57
  #4 (permalink)  
Antiguo 24/03/2017, 16:02
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Mostrar información en varios idiomas

La primera es basura como diseño, perdona que lo diga directamente.
Generaría recarga en la base toda vez que puedan existir registros donde no se hayan iincliuido todos los idiomas.
Además requiere modificar la estructura física de la tabla cada vez que se incorpore o se elimne un idioma...

Los ejemplos 2 y 3 son exactamente lo mismo conceptualmente, pero la 2 no es un modelo verdaderamente relacional. La segunda tabla no tiene razones para existir en un diseño normalizado y su uso carece de utilidad práctica.
Y recuerda que los campos de tipo dato IDENTITY no existen en todos los DBMS...

Sólo la tercera forma que pones se acerca a la correcta solución a nivel diseño y normalización.

Por otro lado faltan definiciones de PK, ademas de apuntar una FK a un campo no clave, lo que es un error.

Esto estaría mas cerca:

Código SQL:
Ver original
  1. CREATE TABLE ref_language (
  2.   Code CHAR(2) NOT NULL,
  3.   Name VARCHAR(20) NOT NULL,
  4.   PRIMARY KEY (Code)
  5. );
  6.  
  7. CREATE TABLE app_translation_entry (
  8. ProductId INT NOT NULL,
  9. Code CHAR(2) NOT NULL,
  10. Text Text NOT NULL,
  11. FOREIGN KEY (TranslationId) REFERENCES app_translation(ProductId),
  12. FOREIGN KEY (Code) REFERENCES ref_language(Code)
  13. );
  14.  
  15. CREATE TABLE app_product (
  16. ProductId INT NOT NULL,
  17. Description INT NOT NULL,
  18.         PRIMARY KEY (ProductId)
  19. );
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 24/03/2017 a las 16:07

Etiquetas: php, sql, sqlite
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:42.