|
|
|
Организация БД мультиязычного сайта
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, товарищи! Попытаюсь максимально доходчиво объяснить свою проблему с помощью простых примеров «на пальцах». Итак, например, есть таблица пользователей: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Соответственно, есть таблица городов (для вышеуказанных пользователей): Код: sql 1. 2. 3. 4. 5. 6. 7. 8. Есть простой запрос с JOIN'ом, который излекает все данные пользователя, заменяя идентификатор города на название города. Код: sql 1. А теперь представим эту базу данных в контексте работающего сайта. И не просто сайта, а сайта мультиязычного, где (тут внимание!) : таблица dbo.User одна в неизменном виде, а вот таблиц dbo.City должно быть несколько: одна версия с русскими названиями городов, вторая, пускай, с английскими названиями тех же городов с теми же идентификаторами. Это нужно для того, чтобы можно было извлекать данные пользователя как с русскими названиями городов, так и с английскими. ПРИЧЁМ, dbo.City на русском будет находится в одной базе данных, а dbo.City на английском — в другой базе данных; при этом dbo.User должна быть общей для обоих баз данных — как это реализовать? 1) Самый брутальный вариант — держать 2 копии таблицы dbo.User в обоих базах данных, но таким образом мне необходимо будет данные в 2-х таблицах синхронизировать, а это значит нужно писать систему синхронизации, чего делать мне не хочется. 2) Второй вариант, держать в базе данных 2 таблицы городов: dbo.CityRUS и dbo.CityENG и уже, в зависимости, например от какого-то передаваемого в запрос параметра с идентификатором языка, выполнять переключение в дуже SWITCH: Код: c# 1. 2. 3. 4. 5. 6. 7. Но, я считаю, что это извращение. 3) Вариант — сделать так, чтобы в таблице городов хранились и русские и английские названия в разных колонках — не вариант, потому, что БД желательно разместить на разных серваках — из-за неоднородности нагрузки исходящей от клиентов, которые используют английские и русские названия городов. Может есть какое-то просто и быстрое решение, до которого я просто не могу додуматься? Также, сразу хочу отметить, что я против использования динамических SQL-запросов (ну, естественно, кроме ситуаций, где без них никак) — т.е., только хранимые процедуры. Спасибо! Роман. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2013, 14:10 |
|
||
|
Организация БД мультиязычного сайта
|
|||
|---|---|---|---|
|
#18+
roman_lenko, Вариант 3 будет самым быстрым. Кроме того мультиязычность никак не влияет на количество БД. Как правило все хранится в одной БД, либо в таблицах _en _ru ..., либо в столбцах таблиц соответственно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2013, 14:23 |
|
||
|
Организация БД мультиязычного сайта
|
|||
|---|---|---|---|
|
#18+
Злой Бобрroman_lenko, Вариант 3 будет самым быстрым. Кроме того мультиязычность никак не влияет на количество БД. Как правило все хранится в одной БД, либо в таблицах _en _ru ..., либо в столбцах таблиц соответственно. Спасибо. Уточню на всякий случай: вы имеете ввиду организовать таблицу городов по типу: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. А извлекать методом, по типу того, как я описал в примере?: Код: c# 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2013, 14:27 |
|
||
|
Организация БД мультиязычного сайта
|
|||
|---|---|---|---|
|
#18+
Ошибся: Код: c# 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2013, 14:29 |
|
||
|
Организация БД мультиязычного сайта
|
|||
|---|---|---|---|
|
#18+
Обычно это выглядит как единая таблица языкозависимых названий, типа ObjectID ObjectTypeID /* если разноязычные названия нудны не только для городов, но и для других обьектов*/ Language Literal. таким образом, у Вас единая таблица City c одной записью на каждый город, и к каждому городу несколько дочерних записей в таблице названий, по одной на каждый язык. Ссылочная целостность, правда, требует дополнительных ухищрений- но тоже ничего нерешаемого нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2013, 14:32 |
|
||
|
Организация БД мультиязычного сайта
|
|||
|---|---|---|---|
|
#18+
roman_lenkoдержать 2 копии таблицы dbo.User в обоих базах данных, но таким образом мне необходимо будет данные в 2-х таблицах синхронизировать, а это значит нужно писать систему синхронизации, чего делать мне не хочется. А использовать готовые механизмы репликации не позволяет что? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2013, 14:39 |
|
||
|
Организация БД мультиязычного сайта
|
|||
|---|---|---|---|
|
#18+
roman_lenko, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Да, извлекать примерно так же. Единственное пользователь на сайте сам выбирает язык. Вот выбранное значение и необходимо будет подставить. При этом в таблице юзеров также добавьте язык по умолчанию. Это на случай если значение в столбце выбранного языка будет пустое то подставить значение из таблицы юзеров. Соответственно и запрос у вас изменится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2013, 14:40 |
|
||
|
Организация БД мультиязычного сайта
|
|||
|---|---|---|---|
|
#18+
Кот МатроскинОбычно это выглядит как единая таблица языкозависимых названий, типа ObjectID ObjectTypeID /* если разноязычные названия нудны не только для городов, но и для других обьектов*/ Language Literal. таким образом, у Вас единая таблица City c одной записью на каждый город, и к каждому городу несколько дочерних записей в таблице названий, по одной на каждый язык. Ссылочная целостность, правда, требует дополнительных ухищрений- но тоже ничего нерешаемого нет. Я не понял :) Слишком абстрактно. Т.е., вы имеете ввиду, что-то типа такого: create table dbo.City( -- ID города. id int, -- Имя города. varchar name, -- Ссылка на другой город. reference id ); -- Например, это будет один и тот же город: insert into dbo.City values(1, 'Санкт-Петербург', NULL); insert into dbo.City values(NULL, 'St. Petersbourg', 1); Т.е., город с именем St. Petersbourg — ссылается на город 'Санкт-Петербург' — так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2013, 14:40 |
|
||
|
Организация БД мультиязычного сайта
|
|||
|---|---|---|---|
|
#18+
Злой БобрДа, извлекать примерно так же. Единственное пользователь на сайте сам выбирает язык. Вот выбранное значение и необходимо будет подставить. При этом в таблице юзеров также добавьте язык по умолчанию. Это на случай если значение в столбце выбранного языка будет пустое то подставить значение из таблицы юзеров. Соответственно и запрос у вас изменится. Извращенно, но что поделаешь. Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2013, 14:42 |
|
||
|
Организация БД мультиязычного сайта
|
|||
|---|---|---|---|
|
#18+
Кот Матроскин, Этот вариант автору неподойдет. Во первых запрос отработает медленнее. Во вторых - зачем хранить все в одной огромной таблице (EAV)? Да, с одной стороны это удобно. Но с другой - мы незнаем объемов таблиц и полей БД автора. Множим примерно на 5 языков и понимаем что занимаемся ерундой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2013, 14:45 |
|
||
|
Организация БД мультиязычного сайта
|
|||
|---|---|---|---|
|
#18+
roman_lenko, Да ничего извращенного. Посмотрите готовые шаблоны cms, там все это уже реализовано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2013, 14:47 |
|
||
|
Организация БД мультиязычного сайта
|
|||
|---|---|---|---|
|
#18+
Если список языков - константа, то можно добавить отдельное поле для конкретного языка. Если нет, то в таблицах делать составной ключ - код+язык. Будет удобно, если в выборки подставлять ф-цию, извлекающую язык согласно вх.параметров. При этом есть возможность заменить к-л название языком по умолчанию, если вдруг нужный язык для данного объекта отсутствует. Отдельные таблицы для разных языков - тупиковое решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2013, 14:47 |
|
||
|
Организация БД мультиязычного сайта
|
|||
|---|---|---|---|
|
#18+
Злой БобрНо с другой - мы незнаем объемов таблиц и полей БД автора. Множим примерно на 5 языков и понимаем что занимаемся ерундой. По объёмам данных — города 27 стран мира, переведённые где-то на 10 языков — т.е., реально много. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2013, 14:48 |
|
||
|
Организация БД мультиязычного сайта
|
|||
|---|---|---|---|
|
#18+
roman_lenko, Нет, не совсем. Так как Вы предлагаете, имеет смысл делать, если в табоице city единственное информационное поле - name. А если там еще, например, координаты, число жителей, принадлежность к стране и т.п. - какой смысл дублировать эти данные для 'Санкт-Петербург' и 'St. Petersbourg'? я предлагал следующее Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2013, 14:53 |
|
||
|
Организация БД мультиязычного сайта
|
|||
|---|---|---|---|
|
#18+
Ого! Ну, примерно, понял. Из полей у меня только идентификатор города и название города — больше ничего. А как тогда извлекать данные по вашему примеру? (с JOIN'ом). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2013, 14:58 |
|
||
|
Организация БД мультиязычного сайта
|
|||
|---|---|---|---|
|
#18+
Кот Матроскин, Эм... А разве кто-то числовые поля разделяет по языковому признаку? Непоймите меня неправильно, просто я такой бред слышу первый раз. Число оно и в африке число. Естественно кроме специфических направлений (например археология), но даже там нет предлагаемого разделения по языкам. Вы наверное долго с TecDoc возились. Там как раз то что вы предлагаете. Но лично я считаю что ребята пошли не тем путем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2013, 15:00 |
|
||
|
Организация БД мультиязычного сайта
|
|||
|---|---|---|---|
|
#18+
roman_lenkoПо объёмам данных — города 27 стран мира, переведённые где-то на 10 языков — т.е., реально много.С точки зрения базы, это не очень много. 2 Кот Матроскин: А если в таблице есть более одного поля, подлежащего переводу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2013, 15:02 |
|
||
|
Организация БД мультиязычного сайта
|
|||
|---|---|---|---|
|
#18+
ГхостикА если в таблице есть более одного поля, подлежащего переводу? 1) Выделяется сущность "текст" 2) Выделяется сущность "переводы текста" 3) Создаются соответствующие таблицы, вторичные ключи и вьюхи. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2013, 15:29 |
|
||
|
Организация БД мультиязычного сайта
|
|||
|---|---|---|---|
|
#18+
Злой БобрВо вторых - зачем хранить все в одной огромной таблице (EAV)? Но с другой - мы незнаем объемов таблиц и полей БД автора. Множим примерно на 5 языков и понимаем что занимаемся ерундой к EAV это не имеет вообще никакого отношения. Вариант, который Вам нравится (с несколькими полями одной записи) чрезвычайно сложно переживет добавление еще одного языка - придется переписывать кучу кода. Опять же возьмем случай Гхостика (N полей, требующих перевода) - придется создать N * M (M -кол-во возможных переводов) полей. "Понимаем, что занимаемся ерундой" (с) Злой БобрКот Матроскин, Эм... А разве кто-то числовые поля разделяет по языковому признаку? Какие числовые поля? Гхостик А если в таблице есть более одного поля, подлежащего переводу? В таблицу Literal добавится поле TypeField. roman_lenko А как тогда извлекать данные по вашему примеру? (с JOIN'ом). Код: sql 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2013, 16:34 |
|
||
|
Организация БД мультиязычного сайта
|
|||
|---|---|---|---|
|
#18+
Всем большое спасибо за ответы — мне, если честно, теперь все варианты нравятся (хотя раньше ни один особо не нравился:) Теперь мне нужно будет подумать и выбрать конкретно применительно к моему сайту. Единственная просьба еще к Коту Матроскину : ваш пример для меня очень сложен, я его понимаю, но боюсь, что, или понимаю только на половину, или понимаю не совсем правильно. Прошу вас объяснить максимально просто на основе моей таблицы городов (смотрите — у меня есть PRIMARY KEY для поля City.id — ваша схема, как я понимаю, PRIMARY KEY не учитывала, т.к., вы в примере вставляли два города с одинаковым идентификатором, но названиями на разном языке). Таблица городов (в ней больше нет НИКАКИХ полей, кроме указанных): Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. А вот указаный вами запрос для извлечения данных — я его переписал: Код: sql 1. 2. 3. 4. Правильно? — видимо, нет — не понимаю, что это за таблица dbo.Literal — зачем она нужна? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2013, 17:19 |
|
||
|
Организация БД мультиязычного сайта
|
|||
|---|---|---|---|
|
#18+
roman_lenkoТаблица городов (в ней больше нет НИКАКИХ полей, кроме указанных): Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. [..] Правильно? — видимо, нет — не понимаю, что это за таблица dbo.Literal — зачем она нужна?Матроскин предлагает из Вашей таблицы City сделать две: собственно ГОРОДА и НАПИСАНИЯ_ГОРОДОВ. И это правильно. Если в Вашей City убрать languageId, то она будет ГОРОДА, а если в ней же с ID_Города убрать 'primary key' и ввести дополнительно PK на ID_Написание, то она превратится в Literal Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Как упоминалось, неприятностей стОит ожидать при поддержании целостности, например, следует задаться вопросом: может ли быть город в City и не иметь ни одного написания в Literal? Какие бизнес правила нарушаются, если City будет не таблицей, а вьюхой из Literal, с 'languageId = @CurrentLanguage' Ну и тому подобные... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2013, 18:09 |
|
||
|
Организация БД мультиязычного сайта
|
|||
|---|---|---|---|
|
#18+
Зачем язык в справочнике городов? Я бы сделал так (синтаксис оракловый): Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2013, 18:17 |
|
||
|
Организация БД мультиязычного сайта
|
|||
|---|---|---|---|
|
#18+
> create table dbo.City() > create table dbo.Literal() Всё бы хорошо, Кот Матроскин, но вам понадобятся эквиваленты не только названий, но и топонимов. Иногда прямое соответствие для разных языков существует, иногда нет. Что намерены делать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2013, 18:47 |
|
||
|
Организация БД мультиязычного сайта
|
|||
|---|---|---|---|
|
#18+
Sgt.Pepper, я немного подредактировал то, что вы написали: я добавил FOREIGN KEY для dbo.Literal.id_city — это правильно? Я вот теперь не понимаю зачем мне нужно ID написания, если у меня, например, уже есть languageId? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Короче, видимо, в рамках форума мне это понять не получится :/ Гхостик, извиняюсь, но я не понимаю вашего примера. Тут уже «переводы» пошли, «тексты» — помоему, это из другой области, или я вы предлагаете принципиально другую реализацию. guest_20040621, вот только топонимов еще не хватало :) У меня не настолько сложная база. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2013, 18:55 |
|
||
|
Организация БД мультиязычного сайта
|
|||
|---|---|---|---|
|
#18+
roman_lenko, А вам и не нужно ID написания, смело удаляйте. А primary key составной на id_city и languageId. Блин... и постарайтесь придерживаться единых правил: или id_city и id_language или cityId и languageId. Сами же потом путаться будете ) P.s. и еще Кот Матроскин предлагал сделать одну таблицу для всех переводов (поэтому добавил поле ObjectTypeID - обозначающее что за перевод тут хранится). Вы это поле убрали и фактически сделали эту таблицу только для перевода городов. Вот и назовите ее как-нибудь CityTranslate, а не Literal (а то потом другому разработчику будет сложно понять что вы хотели). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2013, 19:44 |
|
||
|
|

start [/forum/moderation_log.php?user_name=DragonLight]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
142ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
| others: | 445ms |
| total: | 709ms |

| 0 / 0 |

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