go mysql 数据 json_MySQL数据库I18N,一种JSON方法?

更新:几年后我遇到了这个问题:现在我知道这是一个非常糟糕的方法。请不要用这个。对于i18n,您始终可以使用其他表(例如products和products_lang),每个语言环境都有单独的条目:对于索引更好,对于搜索更好,等等。

我试图在mysql/php站点中实现i18n。

我读过这样的回答:“i18n通常不是数据库的一部分”,我认为这是一种有点狭隘的方法。

产品名称(product namesd)呢,或者像在我的实例中一样,一个菜单结构和存储在数据库中的内容呢?

考虑到语言应该是可扩展的,我想知道您对我的方法有何看法,所以我尽量避免“每个语言解决方案只有一列”。

一种解决方案是对要翻译的字符串使用引用(id),对于每个可翻译列,都有一个带有主键、字符串id、语言id和翻译的表。

另一个解决方案是使用json。所以我数据库中的菜单项看起来像:idmenu label

------ -------------------------------------------

5 {"en":"Homepage", "it":"pagina principale"}

你觉得这种方法怎么样?

最佳答案:

一种解决方案是对要翻译的字符串使用引用(ID),并且对于每个可翻译列,都有一个带有主键、字符串ID、语言ID和翻译的表。

我实现了一次,我做的是获取现有的数据库模式,查找具有可翻译文本列的所有表,对于每个这样的表,我创建了一个单独的表,其中仅包含这些文本列,以及一个附加的语言id和id,以将其绑定到原始ta中的“data”行。布尔。所以如果我有:create table product (

id int not null primary key

, sku varchar(12) not null

, price decimal(8,2) not null

, name varchar(64) not null

, description text

)

我会创造:

create table product_text (

product_id int not null

, language_id int not null

, name varchar(64) not null

, description text

, primary key (product_id, language_id)

, foreign key (product_id) references product(id)

, foreign key (language_id) references language(id)

)

我想这样问:

SELECT product.id

, COALESCE(product_text.name, product.name) name

, COALESCE(product_text.description, product.description) description

FROM product

LEFT JOIN product_text

ON product.id = product_text.product_id

AND 10 = product_text.language_id

(10正好是您现在感兴趣的语言ID。)

正如您所看到的,原始表保留文本列-如果当前语言没有可用的翻译,这些列将作为默认列。

因此不需要为每个文本列创建单独的表,只需为所有文本列创建一个表(每个原始表)

正如其他人指出的那样,json的思想有一个问题,那就是查询它是非常不可能的,这反过来意味着在特定的时间不能只提取您需要的翻译。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值