Я использую MySQL 5.6.10.Я хочу заменить открытый текст на идентификаторы в таблице импорта, чтобы обеспечить многоязычную поддержку моего приложения.Текущая (примерная) таблица выглядит следующим образом:
| 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 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';
Я использую эту таблицу, чтобы получить уникальный идентификатор (будущий lookup_id), не заботясь об управляющем процессе.Фактическая таблица перевода состоит из lookup_id, language_code и значения.Элемент lookup_id представляет контент и код_языка, на каком языке я хочу получать этот контент.
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';
Итак, с помощью этой процедуры я больше не могу правильно найти запись для «алюминия», так как есть несколько записей с «алюминием».Однако я не хочу сводить их к одной записи, поскольку переводы на другие языки могут отличаться.
Как вы обычно обрабатываете такие случаи?Здесь должна быть стандартная процедура.Тем не менее, я не смог найти ничего в Интернете.
Я знаю, таблицы / база данных не полностью нормализованы.До сих пор мы имели значительные преимущества в производительности, поэтому таблицы не были полностью нормализованы.Любые идеи, как я могу решить это?