我正在开发一种多语言软件.就应用程序代码而言,可本地化不是问题.我们可以使用特定于语言的资源,并拥有适合他们的各种工具.
但是,定义多语言数据库模式的最佳方法是什么?假设我们有很多表(100或更多),每个表可以有多个可以本地化的列(大多数nvarchar列应该是可本地化的).例如,其中一个表可能包含产品信息:
CREATE TABLE T_PRODUCT (
NAME NVARCHAR(50),
DESCRIPTION NTEXT,
PRICE NUMBER(18, 2)
)
Run Code Online (Sandbox Code Playgroud)
我可以想到三种方法来支持NAME和DESCRIPTION列中的多语言文本:
每种语言的单独列
当我们向系统添加新语言时,我们必须创建其他列来存储翻译后的文本,如下所示:
CREATE TABLE T_PRODUCT (
NAME_EN NVARCHAR(50),
NAME_DE NVARCHAR(50),
NAME_SP NVARCHAR(50),
DESCRIPTION_EN NTEXT,
DESCRIPTION_DE NTEXT,
DESCRIPTION_SP NTEXT,
PRICE NUMBER(18,2)
)
Run Code Online (Sandbox Code Playgroud)翻译表与每种语言的列
不存储翻译的文本,而是仅存储翻译表的外键.转换表包含每种语言的列.
CREATE TABLE T_PRODUCT (
NAME_FK int,
DESCRIPTION_FK int,
PRICE NUMBER(18, 2)
)
CREATE TABLE T_TRANSLATION (
TRANSLATION_ID,
TEXT_EN NTEXT,
TEXT_DE NTEXT,
TEXT_SP NTEXT
)
Run Code Online (Sandbox Code Playgroud)用于每种语言的行的转换表
不存储翻译的文本,而是仅存储翻译表的外键.转换表仅包含一个键,而一个单独的表包含每个语言转换的行.
CREATE TABLE T_PRODUCT (
NAME_FK int,
DESCRIPTION_FK int,
PRICE NUMBER(18, 2)
)
CREATE TABLE T_TRANSLATION ( …Run Code Online (Sandbox Code Playgroud)创建多语言数据库的最佳方法是什么?为每个表创建本地化表使设计和查询变得复杂,在其他情况下为每种语言添加列很简单但不动态,请帮助我理解什么是企业应用程序的最佳选择
我需要为一个多语言的Web应用程序创建一个大型数据库模型.
我每次想到如何做到这一点的一个疑问是我如何解决一个字段的多个翻译.一个案例.
管理员可以从后端编辑的语言级别表可以有多个项目,如:basic,advance,fluent,mattern ......在不久的将来,它可能会是另一种类型.管理员进入后端并添加一个新级别,它会将其排序在正确的位置..但我如何处理最终用户的所有翻译?
数据库国际化的另一个问题是,用户研究可能会有所不同,从美国到英国再到DE ......在每个国家,他们都有自己的水平(可能它会相当于另一个但最终不同).计费怎么样?
你如何大规模地模拟这个?
mysql database multilingual database-design internationalization
可能重复:
多语言数据库的模式
我正在构建一个非常繁忙的Web应用程序,它具有多语言数据.所有这些数据都存储在MySQL数据库中.存储此数据的最佳方法是什么?我有一些猜测:
我有一个名为的特征Multilingual,它使用模型及其lang属性translation_of(另请参阅/sf/answers/510984421/)来提供实体的多种翻译。
现在我想在调用translation_of时从模型中隐藏该字段$model->toArray(),这是最容易的通过将其添加到$hidden属性中来完成的。像这样:
class Model {
use Multilingual;
protected $hidden = ['translation_of'];
}
Run Code Online (Sandbox Code Playgroud)
但为了保持原始模型干净,我想通过使用的特征添加隐藏字段。
我努力了:
添加protected $hidden = ['translation_of'];到特征中,这是不允许的:Undefined: trait declaration of property 'hidden' is incompatible with previous declaration
而且扩展性也不是很好(我认为它将被$hidden类的属性覆盖......)
向特征添加启动方法:
static function bootMultilingual() {
static::$hidden[] = 'translation_of';
}
Run Code Online (Sandbox Code Playgroud)
由于范围的原因,这(正如我怀疑的那样)也是不允许的。
有什么干净的方法来做到这一点的想法吗?
请帮忙!
注意:为了保持动态,我认为可以通过两种方式完成:
$this->hidden[] = 'translation_of';$model->setHidden(array_merge($model->getHidden(), ['translation_of']));multilingual ×3
database ×2
mysql ×2
attributes ×1
eloquent ×1
laravel ×1
localization ×1
model ×1
php ×1
sql ×1
traits ×1