@websolab

Как организовать базу данных для мультиязычной онлайн картотеки?

Столкнулся с проблемой при создании мультиязычной картотеку для мануалов.

Задача заключается в том, чтобы связать отдельные абзацы текста одного языка с соответствующим абзацем другого языка учесть при этом автора, сам мануал из которого достался абзац и т.д.

Абзац выбран как минимальная единица от которой отталкиваться потому что за каждым абзацем будут закреплены теги.

Пока наброски структуры выглядят так:

Таблица authors:

60efed2a3eda4385828081.png

поле uuid будет одинаковым для разных переводов одной и той же записи в БД.

Например:

id | uuid | first_name |last_name| content | lang

1 | 9at29342-2aa7-41b2-ae37-4mk7470b7244 | John | Doe | Few words about John Doe | us
2 | 9at29342-2aa7-41b2-ae37-4mk7470b7244 | Джон | Доу | Пара слов проо Джона | ru
3 | 9at29342-2aa7-41b2-ae37-4mk7470b7244 | John | Doe | Ein paar Worte über John Doe | de

Таблица manuals:

60efeee5b8432203007845.png

Таблица paragraphs:

60efee91686dd499656330.png

Таблица languages (связка с остальными полями происходит по languages.code == anytable.lang ):

60eff1b7e6459286732478.png

Проблема с которой столкнулся это дублирование информации например.
Есть lang для manual для author и для paragraph. Хотя, по идее, было бы правильно указывать lang только в одной какой-то таблице.

В общем, буду рад любому комментарию, помощи в структурировании архитектуры или замечаниям.

Заранее, спасибо.
  • Вопрос задан
  • 63 просмотра
Пригласить эксперта
Ответы на вопрос 1
@acwartz
Тут должна быть ваша реклама.
Вынеси локализацию параграфов в отдельную таблицу.
Таблица переводов paragraphs_locale:
id
uuid
manualId = manuals.Id
authorId = Authors.id
changeAuthorId = Authors.id
parentParagraphId = paragraphs_locale.Id - будет NULL у параграфов от имени автора по authorId может даже в нескольких локалях т.к. автор же может знать несколько языков и написать переводы?
lang
content
revision - просто счетчик, увеличивающийся с вверх с каждым изменением.
created
updated

Я вынес параграфы в отдельную таблицу paragraphs_locale т.к. переводов параграфа может быть много и делать их могут разные люди, включая самого автора. Другие люди всегда берут за основу имеющийся параграф, по этому есть parentParagraphId и lang где lang - целевой язык который хотят добавить. Здесь же разделяется понятие автора. Автором может быть один человек но вносить изменения могут и другие, потому есть changeAuthorId чтобы указать на того кто последним внес изменения.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы