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

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

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

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

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

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

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

9 ответов

19 просмотров

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не выставлен, то ничего не замапится и поулчится заполненным только то что есть. Так что пока у вас там не массив то это действительно будет работать

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

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

Ребята, всем привет. Подскажите, пожалуйста, можно ли как-то через бота понять, что этого бота добавили в группу\канал и выдали ему права администратора?
Artem Stormageddon
9
Это переведённый текст с английского. Я не говорю на русском, но могу использовать переводчик Телеграм. Приветствую! Я начинающий веб-разработчик и все еще учусь. В настояще...
𐩱𐩪𐩣𐩱𐩲𐩺𐩡
3
А не хотим ли мы развлечься? 😉 Но так чтобы с пользой для наших профессиональных навыков?? 👨‍🎓👩‍🎓 Предлагаю на октябрь запланировать тестовый запуск новой командной игры "Игр...
Andrii Kurdiumov
2
Привет всем! Почему этот код не срабатывает при добавлении или удалении пользователя из чата? bot.on('chat_member', async (ctx) => { console.log(ctx); }) bot.launch({allo...
Alexander
5
у кого сколько оперативы на базе данных ?
АДИЛЬБЕК
4
Через бот апи возможно получить ID стикерпака? Не ссылку.
Vexylon [АФК до 09.09]
5
Привет Хочу сделать аналог iCloud’а для своих проектов, чтобы пользовательская информация хранилась в облаке, была доступна во всех сервисах, её можно было подсасывать везде)...
Виталий
9
В тг можно спарсить всех кто пишет в группе? Если список участников скрыт
S
3
код Event::listen('cms.page.display', function (&$content, $slug, $page, $html) { if (is_object($content)) { dump($content); } else { dump($s...
Point 111
3
Всем привет. Не понимаю, в чём тут шутка юмора. Убирается только разрешение на send_messages. А send_media_messages остаётся. Как сделать, чтобы оба убирались? await b...
Alexander
2
Карта сайта