У меня есть несколько таблиц базы данных, которые содержат name
и description
столбцы, которые необходимо локализовать. Моя первая попытка разработать схему БД, которая бы поддерживала это, была что-то вроде:
product
-------
id
name
description
local_product
-------
id
product_id
local_name
local_description
locale_id
locale
------
id
locale
Однако для этого решения требуется новая таблица local_
для каждой таблицы, содержащей name
, и столбцы описания, для которых требуется localization
. Пытаясь избежать этих издержек, я переработал схему так, чтобы была нужна только одна localization
таблица
product
-------
id
localization_id
localization
-------
id
local_name
local_description
locale_id
locale
------
id
locale
Вот пример данных, которые будут храниться в этой схеме, когда есть 2 таблицы (продукт и страна), требующие локализации:
страна
id, localization_id
-----------------------
1, 5
продукт
id, localization_id
-----------------------
1, 2
локализация
id, local_name, local_description, locale_id
------------------------------------------------------
2, apple, a delicious fruit, 2
2, pomme, un fruit délicieux, 3
2, apfel, ein köstliches Obst, 4
5, ireland, a small country, 2
5, irlande, un petite pay, 3
язык
id, locale
--------------
2, en
3, fr
4, de
Обратите внимание, что составной первичный ключ таблицы localization
равен (id, locale_id)
, но внешний ключ в таблице product
относится только к первому элементу этого составного PK. Это похоже на «плохую вещь» от POV нормализации.
Можно ли как-нибудь исправить эту проблему, или, альтернативно, существует ли совершенно другая схема, которая поддерживает локализацию без создания отдельной таблицы для каждой локализуемой таблицы?
Обновление:
Ряд респондентов предложили решение, которое требует создания отдельной таблицы для каждой локализуемой таблицы. Однако это именно то, чего я пытаюсь избежать. Схема, которую я предложил выше, почти решает проблему к моему удовлетворению, но я недоволен тем фактом, что внешние ключи localization_id
относятся только к части соответствующего первичного ключа в таблице localization
.
Спасибо,
Дон