productsproducts_lang
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的思想有一个问题,那就是查询它是非常不可能的,这反过来意味着在特定的时间不能只提取您需要的翻译。