|
|
|
Как реализуют многоязычность в БД?
|
|||
|---|---|---|---|
|
#18+
Добрый день! Хочу узнать, как лучше и удобней всего реализовывать в БД поддержку интернационализации для наименований? Я пока реализовал это таким способом: Код: sql 1. 2. 3. 4. 5. где в l10_data лежит сериализованный массив: Код: php 1. 2. 3. 4. 5. а в srchIdx кладётся конкатенация всех этих элементов массива, для организации поиска по этому полю. Подскажите примеры как реализуют правильно и красиво в БД хранение объектов с переводами содержимого на разные языки. Думал хранить в виде связаной таблицы: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Или с помощью длинной таблицы: Код: sql 1. 2. 3. 4. 5. 6. Но с вариант с доп. таблицей вроде подразумевает дофига JOIN'ов причём в условиях, когда не обязательно что перевод есть. И это либо LEFT JOIN либо всякие NULL'ы обрабатывать. А вариант с разреженой таблицей - так запросы строить один гемор. Вобщем как это на практике чаще всего делается? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2016, 12:51 |
|
||
|
Как реализуют многоязычность в БД?
|
|||
|---|---|---|---|
|
#18+
Сам по форуму посмотрел, такие топики уже неоднократно возникали и собственно два варианта и предлагаются всегда. Я же для себя понял, что оставлю комбинацию моего "сериализованного" варианта и варианта с доп. таблицей в которой перевод лежит по ключу: (itemID, langCode). Просто для повседневного использования проще использовать "сериализованный" вариант. Не надо связывания дополнительной таблицы. Но чтобы сам перевод делать, надо как минимум получить информацию о том какие элементы на какие языки ещё не переведены. И это из сериализованного варианта кроме как через чёрный ход не получить. Для осуществления самой функции перевода нужна таблица в которой отдельные переводы и будут. А уже при её наполнении будет обновляться запись в сериализованной таблице. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2016, 17:56 |
|
||
|
Как реализуют многоязычность в БД?
|
|||
|---|---|---|---|
|
#18+
kormot, таблица (сущность, идентификатор, язык -> название) или другой вариант к каждой таблице, где нужны переводы - еще одна, (pk основной таблицы, язык -> атрибут1,атрибут2 ...) все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2016, 18:05 |
|
||
|
Как реализуют многоязычность в БД?
|
|||
|---|---|---|---|
|
#18+
kormot? Я пока реализовал это таким способом: Код: sql 1. 2. 3. 4. 5. где в l10_data лежит сериализованный массив: [src PHP] Array( "ru" => "Наименование объекта", "en" => "Object name", ....... ) так нельзя, нарушение 1НФ, это все нельзя будет обрабатывать запросами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2016, 18:08 |
|
||
|
Как реализуют многоязычность в БД?
|
|||
|---|---|---|---|
|
#18+
kormotНо с вариант с доп. таблицей вроде подразумевает дофига JOIN'ов причём в условиях, когда не обязательно что перевод есть. И это либо LEFT JOIN либо всякие NULL'ы обрабатывать. А вариант с разреженой таблицей - так запросы строить один гемор. куча join-ов не проблема, это недорогая операция. если тебе геморрой писать запросы или выражения в них -- так что ты полез в базы данных их писать? Доверь это дело профессионалам! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2016, 18:14 |
|
||
|
Как реализуют многоязычность в БД?
|
|||
|---|---|---|---|
|
#18+
MasterZivтак нельзя, нарушение 1НФ, это все нельзя будет обрабатывать запросами. Так а если это поле для удобства использования данных в приложении? А таблица связаная в которой находятся данные по ключу (objectID, langCode) тоже присутствует и сериализованные данные для объекта обновляются в случае внесения изменений в таблицу с переводами. JOIN не проблема, так вроде пишут что множество JOIN'ов это как раз причина медленных запросов и для этого как решение всегда предлагают в разумных пределах делать денормализацию базы. Тут в моём варианте и нормальная форма имеется для правильного логического хранения, а l10_data это для устранения необходимости для каждой таблицы джойнить переводы, да ещё с проверкой а есть ли нужный перевод и если его нет, то сджойнить ещё перевод по умолчанию. Я в общем выбор сделал, спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2016, 21:18 |
|
||
|
Как реализуют многоязычность в БД?
|
|||
|---|---|---|---|
|
#18+
kormotMasterZivтак нельзя, нарушение 1НФ, это все нельзя будет обрабатывать запросами. Так а если это поле для удобства использования данных в приложении? Это можно делать только в одном случае -- если внутри БД (т.е. и в запросах к ней) это поле будет только читаться (целиком) или писаться (целиком). Но я лично в это не верю. Клиенстскому приложению всё равно, как получить эти данные, так или иначе, а вот внутри БД лучше иметь их в нормальном виде. kormotJOIN не проблема, так вроде пишут что множество JOIN'ов это как раз причина медленных запросов и для этого как решение всегда предлагают в разумных пределах делать денормализацию базы. Послушай дебилов -- и сделай наоборот, не ? kormotТут в моём варианте и нормальная форма имеется для правильного логического хранения, а l10_data это для устранения необходимости для каждой таблицы джойнить переводы, да ещё с проверкой а есть ли нужный перевод и если его нет, то сджойнить ещё перевод по умолчанию. Я в общем выбор сделал, спасибо! Поздравляю, главное, чтобы он был правильным! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2016, 12:31 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=39180976&tid=1540385]: |
0ms |
get settings: |
9ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
52ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
2ms |
| others: | 247ms |
| total: | 392ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...