如何实现存储在 MySQL 表中的实体的本地化?

问题描述 投票:0回答:1

假设我有一个像这样的 MySQL 表

product

+-------------+--------------+------+-----+---------+-------+
| Field       | Type         | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| id          | varchar(36)  | NO   | PRI | NULL    |       |
| lang        | varchar(255) | YES  |     | NULL    |       |
| description | varchar(255) | YES  |     | NULL    |       |
+-------------+--------------+------+-----+---------+-------+

我想将这个

product
信息翻译成几种语言。目前只有
description
字段可翻译,但我们会在未来添加更多可翻译字段。

为了启用翻译,我创建了一个新表

product_translation
,如下所示:

CREATE TABLE product_translation (
  id            VARCHAR(36) PRIMARY KEY,
  language_code VARCHAR(10),
  product_id    VARCHAR(36),
  description   VARCHAR(255),
  FOREIGN KEY (product_id) REFERENCES product(id)
);

现在,如果请求的语言是英语或不存在,我使用

description
表的
product
字段。否则,我像这样加入
product
product_translation
表:

SELECT product.*, 
       product_translation.language_code,
       product_translation.description 
FROM product INNER JOIN product_translation
ON product_translation.product_id = product.id 
WHERE product_translation.language_code = 'fr';

有意义吗?
我可以使用一个 SQL 语句检索任何语言的产品吗?

description
表中删除
product
字段,复制数据,并始终使用连接会更好吗?

mysql sql database-schema
1个回答
1
投票

如果请求的语言是英语或不存在我使用

description
product
表的字段。否则,我加入
product
product_translation
桌子

您可以使用 mysql 中的 COALESCE 函数实现此目的

MySQL COALESCE() 函数用于返回第一个非空值 表达式列表中的值。如果列表中的所有值都计算 为 NULL,则 COALESCE() 函数返回 NULL。

您的查询可以写成:

SELECT product.*, 
       COALESCE(product_translation.language_code, 'en') AS language_code,
       COALESCE(product_translation.description, product.description) AS description
FROM product LEFT JOIN product_translation
ON product_translation.product_id = product.id 
AND product_translation.language_code = 'fr';

从产品中删除描述字段会更好吗 表,复制数据,并始终使用连接 ?

如果你打算很少翻译product_information;那么您可以保留

description
字段,否则您可以将其从
product
表中删除并将数据复制到
product_translation
表。

© www.soinside.com 2019 - 2024. All rights reserved.