Создание справочных таблиц из текстовых таблиц - PullRequest
0 голосов
/ 14 мая 2019

Я использую 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';

Итак, с помощью этой процедуры я больше не могу правильно найти запись для «алюминия», так как есть несколько записей с «алюминием».Однако я не хочу сводить их к одной записи, поскольку переводы на другие языки могут отличаться.

Как вы обычно обрабатываете такие случаи?Здесь должна быть стандартная процедура.Тем не менее, я не смог найти ничего в Интернете.

Я знаю, таблицы / база данных не полностью нормализованы.До сих пор мы имели значительные преимущества в производительности, поэтому таблицы не были полностью нормализованы.Любые идеи, как я могу решить это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...