Хранение различных типов документов в одной коллекции DocumentDb

У нас есть многопользовательское приложение, которое использует Azure DocumentDB в качестве базы данных NoSQL, ориентированной на документы.

Для мультиарендности мы читаем этот вопрос и эту запись в блоге. Поскольку прямо сейчас наше количество пользователей не соответствует необходимости использовать разные базы данных и/или documentCollections, и, что более важно, для экономии средств мы реализовали мультиарендность с предложением «Где» в поле TenantId с одним documentCollection.

Точно так же, когда дело доходит до хранения «документов» или «объектов» совершенно разной природы (скажем, например, Book и Car), мы задаемся вопросом, использовать ли один documentCollection.

На первый взгляд кажется более разумным создать два разных documentCollection для Book и Car. Однако создание documentCollection стоит минимум 25$. Мы не хотим платить +25$ каждый раз, когда нам нужно добавить новую функцию, даже если она предназначена для хранения небольшого объема данных (например, наше приложение хранит много Books, но мало Cars...).

Хорошо ли поместить Книгу и Машину в один и тот же documentCollection? И сохраните ссылку на тип документа в общем элементе (например, string Type ="Book" or string Type = "Car").

Зная, что мы уже внедрили мультиарендность с «предложением» Where, чтобы запросить все автомобили в нашем приложении для данного арендатора, все наши запросы будут содержать Where TenantId ="XXXX" AND Type = "Car".

Я видел, что DocumentDB теперь поддерживает разделенную коллекцию. . Может ли это быть хорошим использованием разделов или, наоборот, их следует сохранить для достижения лучшей масштабируемости и не приспособлены для разделения различных типов документов, количество объектов которых может быть неодинаковым?


person Benoit Patra    schedule 20.04.2016    source источник
comment
Возможный дубликат Один или несколько объектов на коллекцию в DocumentDB   -  person Michael Freidgeim    schedule 14.03.2018


Ответы (1)


Да, это "хороший дизайн" для использования type="Book". Вы также можете использовать isBook=true, который, как мне кажется, немного более эффективен и обеспечивает наследование и поведение примесей.

Разделенные коллекции на самом деле являются способом поместить больше вещей в один более крупный объект, а не наоборот. Идея состоит в том, чтобы разрешить масштабирование как пропускной способности (RU), так и пространства без необходимости самостоятельного управления несколькими коллекциями. Вы «могли бы» сделать свой ключ раздела полем type, но я бы не рекомендовал этого делать. Ключи разделов должны обеспечивать примерно равномерное распределение между разделами... среди других критериев.

person Larry Maccherone    schedule 20.04.2016
comment
Спасибо за быстрый ответ. Просто чтобы быть уверенным, когда вы пишете, ключи разделов должны позволять примерно равномерное распределение между разделами... среди других критериев. Вы имеете в виду, что ключи раздела используются для создания раздела примерно одинакового размера? - person Benoit Patra; 20.04.2016
comment
Мы также изучаем вашу библиотеку lumenize на предмет включения агрегатных функций в DocumentDb. Выглядит очень многообещающе. - person Benoit Patra; 20.04.2016
comment
Аналогичные размеры и пропускная способность. Дайте мне знать, если вам нужна помощь с Lumenize. Я отслеживаю этот тег переполнения стека, а также этот. - person Larry Maccherone; 20.04.2016
comment
Не могли бы вы подробнее рассказать об операторе isBook=true, который, как мне кажется, немного более эффективен и обеспечивает наследование и поведение примесей? - person Jacob; 18.04.2018
comment
Допустим, у вас есть класс WorkItem с подклассами для Defect и Story. Когда вы визуализируете страницу для спринта со всеми рабочими элементами, вы можете выполнить поиск isWorkItem=true. Когда вы делаете что-то, что относится только к Дефектам, вы можете искать isDefect=true. Если бы у вас был только type=Defect или type=Story, это тоже могло бы сработать. Вам просто нужно использовать предложение or для Defect или Story, но как насчет добавления другого типа WorkItem. Затем вам нужно изменить код везде, где вы хотите, чтобы все рабочие элементы. - person Larry Maccherone; 20.04.2018
comment
поэтому предположим, что у нас есть дополнительное свойство для проверки типа документа. Таким образом, наш предикат будет .where(x=›x.tenantId == '' && x.type == 'book'). Итак, можно ли сохранить свойство типа в объекте «Книга» ?? (тогда только мы можем использовать x.type). - person Ranadheer Reddy; 04.10.2018
comment
Моим личным предпочтением было бы сделать одно или другое, но обязательно. То, как вы это делаете (x.type == 'book'), встречается гораздо чаще, чем isBook == true. Я просто предпочитаю включать примесь в поведении наследования. - person Larry Maccherone; 05.10.2018
comment
@LarryMaccherone (извините за немного поздний комментарий), как насчет того, чтобы иметь другое свойство type (дефект, история, что угодно ..), но иметь все WorkItems под одним и тем же partitionKey? Таким образом, получение всех рабочих элементов — это вопрос чтения всех документов с одним и тем же ключом раздела, а фильтрация определенных типов — это фильтрация по свойству type. Конечно, partitionKey для WorkItems, вероятно, должен быть детализированным/составным, включая любого родителя, имеющего смысл в этом контексте; будь то CreatorId, Year, ProjectId или подобное. - person dee zg; 05.02.2019
comment
@deezg, это работает для двух уровней наследования. Что делать, если вам нужно 3? - person Larry Maccherone; 06.02.2019
comment
@LarryMaccherone Я считаю, что что-то вроде ARRAY_CONTAINS(["story", "workitem", "defect"], items.type) - это то, что покрывает эти случаи, хотя мне трудно представить, зачем мне нужны мои документы БД, отражающие наследование моделей предметной области 1: 1. Пожалуйста, не поймите меня неправильно, я не говорю, что с вашим подходом что-то не так... он просто привлек мое внимание как то, что я никогда не использовал, и я пытаюсь проверить себя, есть ли у меня варианты его использования. . - person dee zg; 07.02.2019