Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Modelagem de banco de dados para fins internacionais e multilíngues


Aqui está a maneira como eu projetaria o banco de dados:



Visualização por DB Designer Fork

O i18n table contém apenas um PK, de modo que qualquer tabela só precisa referenciar este PK para internacionalizar um campo. A tabela translation é então responsável por vincular esse ID genérico com a lista correta de traduções.

locale.id_locale é um VARCHAR(5) para gerenciar ambos en e en_US Sintaxes ISO .

currency.id_currency é um CHAR(3) para gerenciar a sintaxe ISO 4217 .

Você pode encontrar dois exemplos:page e newsletter . Ambos gerenciados pelo administrador as entidades precisam internacionalizar seus campos, respectivamente title/description e subject/content .

Aqui está um exemplo de consulta:
select
  t_subject.tx_translation as subject,
  t_content.tx_translation as content

from newsletter n

-- join for subject
inner join translation t_subject
  on t_subject.id_i18n = n.i18n_subject

-- join for content
inner join translation t_content
  on t_content.id_i18n = n.i18n_content

inner join locale l

  -- condition for subject
  on l.id_locale = t_subject.id_locale

  -- condition for content
  and l.id_locale = t_content.id_locale

-- locale condition
where l.id_locale = 'en_GB'

  -- other conditions
  and n.id_newsletter = 1

Observe que este é um modelo de dados normalizado. Se você tiver um grande conjunto de dados, talvez possa pensar em desnormalizá-lo para otimizar suas consultas. Você também pode brincar com índices para melhorar o desempenho das consultas (em alguns bancos de dados, as chaves estrangeiras são indexadas automaticamente, por exemplo, MySQL/InnoDB ).