从明文表中创建查找表

时间:2019-05-14 17:46:17

标签: mysql sql

我正在使用mysql 5.6.10。我想用导入表中的ID替换纯文本,以实现我的应用程序的多语言支持。 当前(示例)表如下所示:

|  id  |   product_id  | product_name  |  cover_material  | inlay_material  |  price  |  language_code  |
---------------------------------------------------------------------------------------------------------
|  1   |  p1           | Name 1        |  Aluminum        | Aluminum        |  100    | en              |
|  2   |  p2           | Name 2        |  Iron            | Aluminum        |  200    | en              |
|  3   |  p3           | Name 3        |  Plastic         | Copper          |  200    | en              |
|  4   |  p1           | Name 1        |  Aluminium       | Aluminium s2    |  100    | de              |
|  5   |  p2           | Name 2        |  Eisen           | Aluminium s2    |  200    | de              |
|  6   |  p3           | Name 3        |  Plastik         | Kupfer          |  200    | de              |
|  7   |  p1           | Name 1        |  Aluminio        | Aluminio        |  100    | es              |
|  8   |  p2           | Name 2        |  Hierro          | Aluminio        |  200    | es              |
|  9   |  p3           | Name 3        |  Plástico        | Cobre           |  200    | es              |

该表包含针对每种可用语言存储的几种产品。

纯文本(在我们的示例中为两个实质列)应替换为id。 “封面材料”和“镶嵌材料”中的内容可以具有相同的内容,但在其他语言中没有相同的翻译。参见ID的1、4、7。

我的问题是,如何在此处正确进行

我首先创建了一个临时表,用于存储“封面材料”和“镶嵌材料”的内容。

CREATE TABLE tmp (
  id int (10) unsigned NOT NULL AUTO_INCREMENT,
  value TEXT NOT NULL,
  PRIMARY KEY (id)
);

INSERT INTO tmp (value) SELECT DISTINCT cover_material FROM products WHERE language_code = 'en';

INSERT INTO tmp (value) SELECT DISTINCT inlay_material FROM products WHERE language_code = 'en';

我正在使用此表获取唯一的ID(将来的lookup_id),而无需处理后面的管理过程。实际的翻译表由lookup_id,language_code和值组成。 lookup_id代表内容和我要接收该内容所用语言的language_code。

CREATE TABLE `translations` (
  `id` int (10) unsigned NOT NULL AUTO_INCREMENT,
  `lookup_id` int (10) unsigned NOT NULL,
  `language_code` VARCHAR (2) NOT NULL,
  `value` text NOT NULL,
  PRIMARY KEY (`id`)
);

INSERT INTO translations (lookup_id, language_code, value) SELECT id, 'en' AS language_id, value FROM tmp;

由于我现在拥有所有表和关联的lookup_id,因此我可以继续使用其他语言:

SELECT DISTINCT t.id AS lookup_id, 'de' AS language_id, de.inlay_material AS value
FROM products
RIGHT JOIN products DE ON en.product_id = en.product_id
INNER JOIN tmp t ON en.inlay_material = t.value
WHERE
en.inlay_material = t.value AND
en.language_code = 'en' AND
en.language_code = 'de';

因此,通过此过程,现在不再能够正确地找到“铝”的条目,因为有多个带有“铝”的条目。但是,我不想将它们简化为一个条目,因为其他语言的翻译可能有所不同。

您通常如何处理此类情况?这里必须有一个标准程序。但是,我在网上找不到任何东西。

我知道,表/数据库未完全标准化。到目前为止,我们已经获得了显着的性能优势,因此这些表尚未完全标准化。有什么想法可以解决这个问题吗?

0 个答案:

没有答案