Одним из широко используемых подходов для хранения локализованных версий документов в MongoDB является использование вложенных поддокументов или вложенных полей в рамках основного документа. Давайте рассмотрим несколько возможных вариантов организации хранения локализованных версий документа.
1. Хранение локализованных свойств в одном документе:
Здесь каждый документ содержит все доступные локализованные версии свойств, как вложенные поля. Например, для коллекции "books" мы можем использовать следующую структуру документа:
{ _id: ObjectId("609350e0c6a4d89e4a2b3ed1"), title: { en: "MongoDB in Action", fr: "MongoDB en Action", es: "MongoDB en Acción" }, author: { en: "Kyle Banker", fr: "Kyle Banker", es: "Kyle Banker" }, // остальные поля }
Этот подход позволяет быстро получить любую локализованную версию свойства для конкретного документа, т.к. свойства локализованы и доступны непосредственно в рамках основного документа. Однако, он требует дополнительного места для хранения переводов, особенно если у вас много локализованных свойств или если вам нужно поддерживать большое количество языков.
2. Хранение локализованных свойств в отдельной коллекции:
В этом случае каждый документ содержит только одну версию свойств, а локализованные версии хранятся в отдельной коллекции. Например, для коллекции "books" мы могли бы использовать следующие две коллекции:
// Коллекция основных документов books: { _id: ObjectId("609350e0c6a4d89e4a2b3ed1"), title_id: ObjectId("609350e0c6a4d89e4a2b3e00"), // ссылка на локализованную версию названия на английском author_id: ObjectId("609350e0c6a4d89e4a2b3e01"), // ссылка на локализованную версию автора на английском // остальные поля } // Коллекция локализованных версий свойств localized_properties: { _id: ObjectId("609350e0c6a4d89e4a2b3e00"), property: "title", lang: "en", value: "MongoDB in Action" }, { _id: ObjectId("609350e0c6a4d89e4a2b3e01"), property: "author", lang: "en", value: "Kyle Banker" }, // остальные локализованные свойства
Такой подход позволяет эффективно управлять локализованными версиями свойств, т.к. они хранятся отдельно и могут быть легко обновлены, добавлены или удалены для каждого документа. Он также экономит место, поскольку локализованные версии свойств хранятся только один раз и могут использоваться многократно для разных документов.
3. Хранение локализованных свойств в массиве в основном документе:
В этом случае каждый документ содержит массив, в котором хранятся локализованные версии свойств. Например, для коллекции "books" мы могли бы использовать следующую структуру документа:
{ _id: ObjectId("609350e0c6a4d89e4a2b3ed1"), title: [ { lang: "en", value: "MongoDB in Action" }, { lang: "fr", value: "MongoDB en Action" }, { lang: "es", value: "MongoDB en Acción" } ], author: [ { lang: "en", value: "Kyle Banker" }, { lang: "fr", value: "Kyle Banker" }, { lang: "es", value: "Kyle Banker" } ], // остальные поля }
Этот подход позволяет группировать все локализованные версии свойств в рамках основного документа, что делает его удобным для чтения и обновления. Однако он может быть неэффективным с точки зрения использования памяти и производительности, особенно если у вас много локализованных свойств или языков.
Выбор конкретного подхода зависит от особенностей вашего приложения и его требований к локализации. Подход №1 (хранение локализованных свойств в одном документе) обычно используется, когда у вас небольшое количество локализованных свойств или языков, и вы хотите, чтобы все свойства были доступны в рамках одного документа. Подход №2 (хранение локализованных свойств в отдельной коллекции) и подход №3 (хранение локализованных свойств в массиве в основном документе) обычно используются, когда у вас есть большое количество локализованных свойств или языков, и вы хотите более гибко управлять этими свойствами.