По моему мнению, проектирование базы данных на основе документов сильно зависит от того, как приложение представляет данные пользователю, другими словами, какие API доступны. Итак, это зависит от требований системы и пользовательского интерфейса. Поэтому я сделал много предположений во время предложенного дизайна.
Я начну с проектирования, затем объясню, почему этого может быть достаточно для предполагаемых требований системы.
Требуются 4 коллекции:
- Пользователь.
- Business.
- Пакет.
- Покупка.
Первый: коллекция пользователей.
Используется ТОЛЬКО для хранения информации пользователей, без кошелька.
Второе: бизнес-коллекция
Используется ТОЛЬКО для хранения информации о компаниях, не включает пакеты.
В-третьих: Коллекция пакетов
Используется для хранения пакетов с денормализованной деловой информацией для лучшего запроса.
const packageSchema = new Schema({
itemInfo: {}, //The item to be sold in the package: (Name, description, ... etc). Try not to include more than one piece of information in a single field, for example: instead of name being: "ITEM_NAME (The big one)", separate them into two fields: name in one and the size in another.
businessInfo: {
//All data of business needed to show the package in the UI, along with the businessId.
},
count: {}, //Number of items
//.... Any other data needed for the package, like price, description, ... etc.
});
Четвертый: покупка коллекции
Коллекция покупок - это представление пользователя, владеющего пакетом.
const purchaseSchema = new Schema({
user: {}, //Id of the user
package: {}, //PackageId along with any denormalized data needed about the package to display it to the user.
status: {type: String, required: true, enum: ["pending", "redeemed", "cancelled"], default: "pending"}, //Status of the package, for the enum, use a constant variable accessible everywhere in the system, so it's easy to make it consistent.
});
Обоснование дизайна
Это список, содержащий предполагаемые функции в системе, а также предполагаемую частоту использования каждой функции, количество вызовов в БД и простоту вызова.
- Админы.
- Добавить новый бизнес:
- Частота: низкая.
- Количество вызовов в БД: 1.
- Простота: Простая вставка вызова в бизнес-коллекции.
- Изменить существующий бизнес:
- Частота: очень низкая.
- Количество вызовов в БД: 3
- Простота: сложная и неэффективная, требует обновления: бизнес, пакет и коллекции покупок.
- Компании.
- Добавить новый пакет:
- Частота: средняя.
- Количество вызовов в БД: 1.
- Простота: очень простой, один атомарный вызов вставки в коллекцию Package. (Ненормализованные бизнес-данные могут быть отправлены вместе со звонком, так как вызывающим абонентом является сама компания.
- Изменить существующий пакет:
- Частота: низкая.
- Количество звонков в БД: 1 (поскольку уже купленные предметы не должны меняться).
- Простота: очень простой, один атомарный вызов обновления для коллекции пакетов.
- Клиенты.
- Добавить (приобрести) пакет.
- Частота: очень высокая.
- Количество вызовов в БД: 1.
- Простота: очень простой, один атомарный вызов вставки в коллекцию покупок.
- Погасить пакет.
- Частота: очень высокая.
- Количество вызовов в БД: 1.
- Простота: очень простой, один элементарный вызов обновления для коллекции покупок (Изменение статуса, фильтрация по статусу = "в ожидании" и userId).
- Получить предметы в кошельке.
- Частота: очень высокая.
- Количество обращений в БД: 1.
- Простота: очень просто, один элементарный вызов для коллекции покупок.
- Показать, с сортировкой и фильтрацией, все доступные пакеты.
- Частота: очень высокая.
- Количество вызовов в БД: 1.
- Простота: очень просто, один элементарный вызов find для сбора пакетов, все данные там.
Наконец, дизайн также позволяет очень легко получать статистику о данных, так как для всего следующего требуется только один простой (и эффективный) вызов базы данных:
- Количество предприятий.
- Подсчет количества пакетов (активных, неактивных и т. Д.).
- Общая сумма погашенных денег.
- Общая сумма денег на бизнес.
- Средняя сумма денег, выплачиваемая за пользователя.
- Общая сумма денег, уплаченная за пользователя.
и многое другое.