以 JSON 格式存储多语言数据 (MySQL)
Posted
技术标签:
【中文标题】以 JSON 格式存储多语言数据 (MySQL)【英文标题】:Storing multi-language data in JSON (MySQL) 【发布时间】:2014-06-15 06:25:25 【问题描述】:我目前正在设计一个多语言网站的数据库。
网站必须能够以不定数量的语言存储其数据(目前为 3 种语言,未来可能会更多)。
我的问题是:
在 mysql 中将网站的字段值存储在 JSON 字符串中是否有任何缺点?
我通常解决这个问题的方法是有一个额外的表 (var_translations),我会将每个翻译存储在一个新行中:
languages - vars - var_translations
我想我可以将“var”的所有翻译存储在同一行的“vars”表中,使用可以存储包含值数组的 JSON 字符串的 TEXT 字段,我以后可以在 php 中使用:
"name":
"EN": "Name",
"ES": "Nombre",
"FR": "Nom"
我不确定这种存储数据的方式是否有任何问题,但我喜欢它支持多种语言的方式,并且它使数据库更加干净和清晰。
在我开始实施这种方法之前,我有什么需要担心的吗?
【问题讨论】:
【参考方案1】:当然有一个缺点:你不能做简单的请求,例如获取没有法语翻译的元素。
关系数据库的重点是结构化数据。如果您没有重要的原因,请不要偏离这个逻辑。
如您所见,在这种精确的情况下,很容易有一个 i18n_name 表来保存翻译。
如果(且仅当)确认您应该存储原始 JSON,那么您可能想看看 DBMS 对其有很好的支持,most notably PostgreSQL。
【讨论】:
好的,但是如果与 MySQL 中数据的唯一交互是检索它,而不涉及 SQL 逻辑呢? 在这种情况下,您可以存储原始数据,但也许您根本不应该使用 SQL 数据库。最后,结构不够结构化的数据通常会给您带来严重的影响。【参考方案2】:这是在数据库字段中完美使用 JSON。
非常成功地推出了这个策略。
否则,您最终会扭曲逻辑数据结构以捕获语言。并有大量的柜台。查询和性能也变得很糟糕,特别是如果行不存在并且想要在所需语言不可用的情况下使用默认语言。
我们倾向于以多语言作为后缀来命名字段
nameMultiligual “en-gb”:”Name”, ...., 默认值:”en-gb” 爱好多语言…
尽管使用区域设置代码。
然后,您可以在会话应用程序中使用区域设置模式,业务层可以使用会话区域设置从 json 中提取值,因此它与表示层一样易于使用。
【讨论】:
以上是关于以 JSON 格式存储多语言数据 (MySQL)的主要内容,如果未能解决你的问题,请参考以下文章