Айде малко пояснения че от мързел предния път не написах и явно има проблеми.
За всяка таблица която има данни които ще се интернационализират (i18n) ще си правим по една друга таблица, която ще съдържа САМО данните, имащи нужда от интернационализация. Ще използваме същото име със суфикс ml (multilanguage) но всякакво име върши работа.
Започваме със структурата на таблицата за категориите:
+-------+---------+------+-----+---------+----------------+
+-------+---------+------+-----+---------+----------------+
+-------+---------+------+-----+---------+----------------+
И съдържанието:
+-------+
| catId |
+-------+
| 1 |
| 2 |
+-------+
В таблицата имаме само ай-дита на категориите - униклани и аутоинкреметн. По принцип е тъпо това и можем да пропуснем таблицата, но в повечето случаи ще имаш някаква мета информация, като дали е изтрита или невидима категорията, "майчини" категории ако имаш йерархична структура, поредност (ако няма да ползваш азбучен ред) и др.
Записите в таблицата ще са уникални, но за всяка категория тук ще имаш n на брой редове в таблицата categories_ml, като n е броят езици, който поддържаш.
Ето и структурата и данните в categories_ml:
+---------+-------------+------+-----+---------+-------+
+---------+-------------+------+-----+---------+-------+
+---------+-------------+------+-----+---------+-------+
Тук вече имаме айди-то на категорията, езика и самото наименование на съответният език. полето catId тук не е аутоинкремент или уникален ключ...само външен.
Уникалност на реда се указва едновременно от полето catId и lng.
Съдържанието на таблицата:
+-------+---------+-----+
| catId | catName | lng |
+-------+---------+-----+
| 1 | Дрехи | bg |
| 2 | Обувки | bg |
| 1 | Clothes | en |
| 2 | Shoes | en |
+-------+---------+-----+
Както се вижда за всеки език и категория имаме по 1 запис.
Правим абсолютно същото за items/items_ml:
items структура:
+--------+---------+------+-----+---------+----------------+
+--------+---------+------+-----+---------+----------------+
+--------+---------+------+-----+---------+----------------+
items съдържание:
+--------+-------+------+-------+
| itemId | price | size | catId |
+--------+-------+------+-------+
| 1 | 25 | 1 | 1 |
| 2 | 50 | 42 | 2 |
+--------+-------+------+-------+
items_ml структура:
+-------------+--------------+------+-----+---------+-------+
+-------------+--------------+------+-----+---------+-------+
+-------------+--------------+------+-----+---------+-------+
items_ml съдържание:
+--------+-----------+-------------------------------+-----+
| itemId | itemType | description | lng |
+--------+-----------+-------------------------------+-----+
| 1 | тениска | описание на тениската на бг | bg |
| 1 | t
-shirt
| t
-shirt description
in en
| en
| | 2 | маратонки | описание на маратонките на бг | bg |
| 2 | sneakers
| sneakers description
in en
| en
| +--------+-----------+-------------------------------+-----+
Важи същото, което писах за категориите. Данните, които няма да се интернационализират в items, останалите в items_ml със съответното айди (не е аутоинкремент) и език.
---------------------------------------------------------------------------------------------------
Със структурата по-горе няма да имаш проблем със добавянето на категории и продукти. Просто първо добавяш информацията във основната таблица (items, categories) и после взимаш полученото след инсърта id и го ползваш за да вкараш данните за интернационализация на съответните езици.
Заявките стават с малко повече джойнове, но това не би трябвало да е проблем, а смяната на езика става много лесно.
Ето ти примерна заявка за данните на английски:
mysql
> SELECT `cat`.
`catId` , `cml`.
`catName` , `items`.
`itemId` , `iml`.
`itemType` , `items`.
`size` , `items`.
`price` , `iml`.
`description` -> INNER JOIN `categories` AS `cat` ON `items`.
`catId` = `cat`.
`catId` -> INNER JOIN `items_ml` AS `iml` ON `items`.
`itemId` = `iml`.
`itemId` -> INNER JOIN `categories_ml` AS `cml` ON `cat`.
`catId` = `cml`.
`catId` -> AND `iml`.
`lng` = `cml`.
`lng` -> WHERE `iml`.
`lng` = "en"; +-------+---------+--------+----------+------+-------+----------------------------+
| catId | catName | itemId | itemType | size | price | description |
+-------+---------+--------+----------+------+-------+----------------------------+
| 1 | Clothes
| 1 | t
-shirt
| 1 | 25 | t
-shirt description
in en
| | 2 | Shoes
| 2 | sneakers
| 42 | 50 | sneakers description
in en
| +-------+---------+--------+----------+------+-------+----------------------------+
С обикновена смяна в where клаузата на "bg" ще изкараш същата информация на български.
--------------------------------------------------------------------------------------------------------------
Варианта, който Stan ти е дал също става, но ако решиш да добавяш нов език ще трябва да правиш ALTER на таблицата за категориите, което като цяло не е много добра идея