我目前正在设计一个多语言网站的数据库。
此网站必须能够以不确定数量的语言存储数据(目前有3种语言,未来可能更多)。
我的问题是:
在MySQL中的JSON字符串中存储网站的字段值是否有任何缺点?
我解决这个问题的常用方法是有一个额外的表(var_translations),我将每个翻译存储在一个新行中:
languages - vars - var_translations
我认为我可以存储" var"的所有翻译。在同一行中,在" vars"表,使用一个TEXT字段,可以存储一个JSON字符串,用于表示值的数组,我以后可以在PHP中使用:
{
"name":{
"EN": "Name",
"ES": "Nombre",
"FR": "Nom"
}
}
我不确定这种存储数据的方式是否有任何问题,但我喜欢它支持多种语言,它使数据库更清晰,更清晰。
在开始实施之前,我在这种方法中应该担心什么?
答案 0 :(得分:2)
当然有一个缺点:你不能做简单的请求,例如获取没有法语翻译的元素。
关系数据库的关键是构建数据。如果没有重要原因,请不要偏离这种逻辑。
在这个精确的情况下,如你所见,很容易有一个表i18n_name持有翻译。
如果(并且仅当)确认您应该存储原始JSON,那么您可能希望看一下DBMS对它的支持,most notably PostgreSQL。
答案 1 :(得分:1)
这是 JSON 在数据库字段中的完美使用。
非常成功地推出了这个策略。
否则你最终会扭曲你的逻辑数据结构来捕获语言。并有大量的柜台表。查询和性能也变得很糟糕,特别是如果行不存在并且想要在所需语言不可用的情况下使用默认语言。
我们倾向于使用多语言作为后缀来命名字段
nameMultiligual {“en-gb”:”Name”, ...., default:”en-gb”} 爱好多语言{…}
尽管使用区域设置代码。
然后,您可以在会话应用程序中使用区域设置模式,业务层可以负责从带有会话区域设置的 json 中提取值,因此在表示层使用起来也很容易。