Скоро я буду работать над каталогом (php + mysql), который будет поддерживать многоязычный контент. А теперь я рассматриваю лучший подход к разработке структуры базы данных. На данный момент я вижу 3 способа многоязычной обработки:
1) Наличие отдельных таблиц для данных, специфичных для каждого языка, т.е. схематично это будет выглядеть так:
- Будет одна таблица Main_Content_Items, в которой будут храниться основные данные, которые нельзя перевести, такие как ID, Creation_date, Hit, голосов и т. Д. - это будет только одна таблица, которая будет относиться ко всем языкам.
А вот таблицы, которые будут дублироваться для каждого языка:
- Таблица Common_Data_LANG (пример: common_data_en_us) (хранящая общие / "статические" поля, которые могут быть переведены, но присутствуют для любого элемента каталога: title, desc и так далее ...)
- Таблица Extra_Fields_Data_LANG (хранение данных дополнительных полей, которые могут быть переведены, но могут отличаться для настраиваемых групп элементов, например: | id | item_id | field_type | value | ...) Затем по запросу элементов мы будем посмотрите в таблице в соответствии с языком пользователя / по умолчанию и соедините переводимые данные с таблицей main_content.
Плюсы:
- мы можем обновить «основные» данные (например, обращения, голоса ...), которые чаще всего обновляются с помощью всего одного запроса
- нам не нужно дублировать данные 4 раза или больше, если у нас есть 4 или более языков по сравнению со структурой, использующей только одну таблицу с полем 'lang'. Таким образом, запросы MySql займут меньше времени, чтобы пройти через каталог 100000 (например) записей, а не 400000 или более.
Минусы:
- +2 таблицы для каждого языка
2) Использование поля lang в таблицах содержимого:
- Таблица Main_Content_Items (хранящая базовые данные, которые нельзя перевести, такие как ID, Creation_date, Hit, голосов и т. д.)
- Таблица Common_Data (хранящая общие / "статические" поля, которые могут быть переведены, но присутствуют для любого элемента каталога: | id | item_id | lang | title | desc | и так далее ...)
- Таблица Extra_Fields_Data (хранящая данные дополнительных полей, которые могут быть переведены, но могут отличаться для пользовательских групп элементов, например: | id | item_id | lang | field_type | value | ...) Итак, мы присоедините common_data и extra_fields к main_content_items в соответствии с полем lang.
Плюсы:
- мы можем обновить «основные» данные (например, обращения, голоса ...), которые чаще всего обновляются с помощью всего одного запроса
- мы только 3 таблицы для данных содержимого
Минусы:
- у нас есть таблица custom_data и extra_fields, заполненная данными для всех языков, поэтому ее время X больше, а запросы выполняются медленнее
3) То же, что и второй способ, но с таблицей Main_Content_Items, объединенной с Common_Data, в которой есть поле lang:
Плюсы:
- ...?
Минусы:
- нам нужно обновить обновленные «основные» данные (например, обращения, голоса ...), которые обновляются чаще всего для каждого языка
- у нас есть таблица custom_data и extra_fields, заполненная данными для всех языков, поэтому ее время X больше, а запросы выполняются медленнее
Будем рады услышать предложения «что лучше» и «почему»? Или есть способы получше?
Заранее спасибо...