我需要为一个多语言的web应用程序创建一个大型数据库模型.

我每次思考如何做到这一点时都有一个疑问,那就是我如何解决一个领域有多个翻译的问题.举个例子.

管理员可以从后端编辑语言级别表,该表可以包含多个项目,如:基本、高级、流利、mattern...在不久的将来,它可能会是另一种类型.管理员进入后端并添加一个新级别,它会将其排序到正确的位置..但是我如何为最终用户处理所有的翻译呢?

数据库国际化的另一个问题是,用户研究可能因美国和英国的不同而有所不同...在每个国家,它们都有自己的水平(可能与另一个国家相当,但最终不同).那账单呢?

你是如何在大范围内对此进行建模的?

推荐答案

以下是我设计数据库的方法:

数据模型

Visualization by 100

i18n表只包含一个PK,因此任何表只需引用此PK即可国际化字段.然后,表translation负责将这个通用ID与正确的翻译列表链接起来.

locale.id_locale是管理enen_US ISO syntaxesVARCHAR(5).

currency.id_currency是管理ISO 4217 syntaxCHAR(3).

你可以找到两个例子:pagenewsletter.这admin-managed个实体都需要国际化他们的领域,分别是title/descriptionsubject/content.

下面是一个查询示例:

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

请注意,这是一个规范化的数据模型.如果你有一个巨大的数据集,也许你可以考虑denormalizing it个来优化你的查询.您还可以使用索引来提高查询性能(在某些数据库中,外键会自动索引,例如MySQL/InnoDB).

Mysql相关问答推荐

MYSQL子查询

拒绝非超级用户访问停靠的MariaDB(超级用户工作)

我需要为用户提供MySQL视图和存储的 routine ,但不是基础表

计算男生的人数和女生的人数.学生是有入学记录的人

无法确定查询逻辑

在 .NET 6 中使用 Dapper Framework 未能成功连接到 MySql

MySQL 8.0.33 Select json列时出现错误:排序内存不足,请考虑增加服务器排序缓冲区大小

MySQL - 事务绑定多个存储过程调用和回滚的简单方法?

MySql SELECT 查找包含数字的区间的时间复杂度是多少?

Select 最高等级最多的部门名称

在 MySQL 中跨日期和位置计算和排序实体的共现

MySQL - 如何查询涉及前面计算值的表结果

如何使用 express.js 和 react.js 删除连接表中的元素和关联元素

MySql部分匹配基于部分查询代码

Laravel 查询构建器 where() 用于何时产品必须有多个标签(使用 product_tags 数据透视表多对多)

重新加载 .env 变量而不重新启动服务器(Laravel 5,共享主机)

使用 Java 通过 SSH 连接到远程 MySQL 数据库

问号在 MySQL 中WHERE column = ?的意义是什么?

将 Blob 转换为字节数组的最简单方法

将数据库从 Postgres 迁移到 MySQL