Всем привет! подскажите вопрос по дизайну был юзер с банальным параметром "balance" ok,

икремент/декремент баланса при помощи транзакций

появилась необходимость - анализировать баланс
ok, добавили коллекцию "транзакции" (debit/credit, sum, desctiption, etc.)

т.е. при покупки чего-либо со стороны пользователи выполняются действия:
- списываем сумму { $inc: { balance: -N } }
- создаем запись в коллекции транзакции
- коммит

вроде все нормально и работает
бухгалтерия получает отчетность в виде:
- пополнение
- списание
- и т.д.

вопрос №1
нормальный подход при работе с балансом и коллекцией транзакции?

вопрос №2
как быть, если необходимо теперь связать транзакции с покупками?
бухгалтерия кроме текста "списание -100" хочет видеть что купил пользователь
а кроме текста "пополнение +200" хочет видеть как пополнил пользователь
тема обширная, подскажите идеи/статьи куда копать чтобы все связать с транзакциями

9 ответов

22 просмотра

1. нормально, кроме транзакций конечно можно перестроить все на идемпотентность, но это сложно будет 2. начать с определений что такое покупка, пополнение, где и как они фиксируются. Потом собрать список того что хотят видеть в результате по этим данным. Выбрать самую подходящую схему связывания (просто в виде ссылки, хранение внутри транзакции или вообще в стороннем хранилище уже предагрегированные данные)

Leksey-🕶 Автор вопроса
Nick
1. нормально, кроме транзакций конечно можно перес...

> 1. нормально, кроме транзакций конечно можно перестроить все на идемпотентность, но это сложно будет здесь не совсем понял "перестроить все на идемпотентность" о чем примерно может идти речь? попробую нагуглить, но от помощи не откажусь (статья или любое другое объяснение) > 2. начать с определений что такое покупка, пополнение, где и как они фиксируются. Потом собрать список того что хотят видеть в результате по этим данным. Выбрать самую подходящую схему связывания (просто в виде ссылки, хранение внутри транзакции или вообще в стороннем хранилище уже предагрегированные данные) примерно начал прикидывать, но кажется таким уродским решением есть транзакция (user, debit/credit, amount, description, createdAt, etc.) есть действие транзакции (transactionId, type: "deposit", "buyGame", "buyElectronic", depositId, gameId, electronicId, etc.) т.е. действие транзакции включает все возможные ID: - depositId - gameId - electronicId но только 1 id может быть указан выглядит стремно, все перерыл, не придумал ничего иного цель - бухгалтерия должна увидеть по транзакциям: - списание -100 (купил игру #gameId, вот описание) - пополнение +200 (пополнил #depositId, вот описание)

Leksey-🕶 Автор вопроса
Nick
1. нормально, кроме транзакций конечно можно перес...

спасибо что помогаете и подсказываете!

Leksey 🕶
> 1. нормально, кроме транзакций конечно можно пер...

1. особо под рукой ничего нет, поэтому просто почитайте про идемпотентность, думаю пару статеек дадут понимание, а дальше только прикидывать как у себя можно это применить 2. так нормально выглядит, по id можно при необходимости подтянуть данные например по связанной игре. не совсем понятно хотите ли вы хранить транзакии и экшн в разных коллекциях, если да то в этом нет необходимости и можно просто сделать поле transactionAction:{type:.. , gameId:. ...} . Выборки в таком случае будут так же удобны как и в отдельной коллекции, но не придется собирать из разных коллекций данные

Leksey-🕶 Автор вопроса
Nick
1. особо под рукой ничего нет, поэтому просто почи...

> 1. особо под рукой ничего нет, поэтому просто почитайте про идемпотентность, думаю пару статеек дадут понимание, а дальше только прикидывать как у себя можно это применить понял, спасибо! 2. так нормально выглядит, по id можно при необходимости подтянуть данные например по связанной игре. не совсем понятно хотите ли вы хранить транзакии и экшн в разных коллекциях, если да то в этом нет необходимости и можно просто сделать поле transactionAction:{type:.. , gameId:. ...} . Выборки в таком случае будут так же удобны как и в отдельной коллекции, но не придется собирать из разных коллекций данные думаю что так сделаю collection transaction: - userId (ref) - type: String (debit/credit) - amount: Int - description: String - actions: { depositId (ref) gameId (ref) electronicId (ref) } да и не надо будет отдельно коллекцию тащить с экшенами + лукап побыстрее будет (избавляемся от доп. единицы)

Leksey 🕶
> 1. особо под рукой ничего нет, поэтому просто по...

только бы actionS без S, а то будет желание как с массивом работать. А при появлении массива уже начнутся трудности при которых уже можно рассматривать связанную табличку)

Leksey-🕶 Автор вопроса
Leksey-🕶 Автор вопроса
Leksey 🕶
> 1. особо под рукой ничего нет, поэтому просто по...

а вот сразу интересно здесь какой-нибудь dynamic lookup возможен? или с учетом того, что у меня есть некая гарантия, что в action будет только 1 id, то можно сделать так: { '$lookup': { 'from': 'games', 'localField': 'gameId', 'foreignField': '_id', 'as': 'dataGame' }, { '$lookup': { 'from': 'deposits', 'localField': 'depositId', 'foreignField': '_id', 'as': 'dataDeposit' }, { '$lookup': { 'from': 'electronics', 'localField': 'electronic', 'foreignField': '_id', 'as': 'dataElectronic' } а так уже кодом

Leksey 🕶
а вот сразу интересно здесь какой-нибудь dynamic l...

хах, ровно этот же вопрос первый вылез когда начал писать ответ, но все реашется банально таким лукапом как раз изза того что если idне выставлен, то ничего не замапится и поулчится заполненным только то что есть. Так что пока у вас там не массив то это действительно будет работать

Похожие вопросы

Обсуждают сегодня

Добрый вечер, Пока не совсем понимаю как наладить общение между телеграм ботом и ПО для работы с сим боксом. По самому боту так понял: - Нужен некий баланс, который можно поп...
Magic
6
Объясните, пожалуйста, почему компилятор ругается на использование в условии неинициализированной переменной: int x; Task.Run(async () => { x = await somefunc(); }).Wait...
Александр
5
Всем привет. Ребята, подскажите, пожалуйста. у ботов есть ограничение на отправку сообщений - 30 сообщений в секунду, эти ограничения накладываются на все сообщения? или на со...
Artem Stormageddon
4
1. https://www.kaggle.com/code/ahmadrezagholami2001/housing-estimation-linear-regression 2. https://www.kaggle.com/code/ahmadrezagholami2001/uncovering-quality-in-wines-logis...
Ahmadreza
1
Блин, ребята, сори за тупые вопросы. А можно ли как-то открыть вебапку по нажатию на кнопку в меню(которое появляется слева, команды)?
Artem Stormageddon
3
Коллеги, может знает кто, можно ли цвет бейджа счётчика в BackendMenu менять без бубнов?
Alex Blaze
3
а плаксы из-под питона умеют только в комфортных условиях что-то выдавить из себя?)
Lencore
9
Но, может, есть уже проверенная? Наши требования такие: 1. Сообщения должны приходить из Инста в CRM оду 2. Должна быть возможность подключить несколько экаунтов Инстаграм. Р...
Alexander Sharoiko MSE / Александр Шаройко
13
Привет!) Кто как юзает переменные в строках?) Чисто ради интереса Вот так: echo "У меня {$bananasAmount} бананов"; Или вот так: echo "У меня ${bananasAmount} бананов";
Виталий
3
разработчик ботов скидывает портфолио, боты которые он уже создал. А вот как узнать что это именно он их создал?
Gosudar
4
Карта сайта