powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Реализация "кошельков" для разных сущностей
13 сообщений из 38, страница 2 из 2
Реализация "кошельков" для разных сущностей
    #39857842
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mr.Fontaine,

Ну разговор не совсем теоретический. Я в данный момент формирую как будет эта вся коммерция и работа с учётом средств в БД сделана. И вот чтобы сразу сделать так, как оно должно быть или максимально близко к этому я тут все вопросы и спрашиваю.

Если без внешних счетов, то где в БД хранить информацию о поступлении средств в такой-то кошелёк?
Сейчас то, что я выше выкладывал, учёт средств идёт в таблице pay_actions (id, currID, debetBagID, creditBagID, debetSum, creditSumm) - т.е. кошелёк кредит, кошелёк дебит, валюта в которой действие происходит и двойная запись величины действия величина дебита и величина кредита.

А как с такой таблицей учёта движений средств указать поступление средств извне? Отдельная получается должна быть таблица pay_extActions (id, currID, bagID, extPayType, extPayData, paySum) - т.е. валюта внешней транзакции, с каким кошельком эта транзакция и собственно описание внешнего плавтежа. Я с введением внешних счетов просто получается дополнительно нормализовал эту таблицу, но если объективно это не требуется, то конечно обойдусь таким вариантом.
...
Рейтинг: 0 / 0
Реализация "кошельков" для разных сущностей
    #39857865
Mr.Fontaine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormot,
авторА как с такой таблицей учёта движений средств указать поступление средств извне?
да собственно так же как и в первой таблице, ибо хранить движения денег лучше в одной таблице.
только два поля кредита оставляй пустыми, ибо "извне".
Если есть необходимость хранить данные источника денег, то вот для этого и можно использовать вторую табличку убрав из твоего варианта лишние поля
pay_extActions (id, extPayType, extPayData)
...
Рейтинг: 0 / 0
Реализация "кошельков" для разных сущностей
    #39857868
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mr.Fontaine,

А если хранить детали внешнего платежа, то его же в любом случае надо линковать с движением средств. Т.е. в таблице pay_extPays надо ещё добавить payActID -> FK pay_actions(id)

А то что в двойной записи должен быть всегда в ноль баланс а мы тут половину отрежем - не будет принципиальной проблемой?
...
Рейтинг: 0 / 0
Реализация "кошельков" для разных сущностей
    #39857883
Mr.Fontaine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormotMr.Fontaine,

А если хранить детали внешнего платежа, то его же в любом случае надо линковать с движением средств. Т.е. в таблице pay_extPays надо ещё добавить payActID -> FK pay_actions(id)
Ну всё правильно.
Для этого я предполагал использовать существующее поле id. Ну конечно правильнее его назвать payActID. Но куда записывать идентификатор действия в общем-то не принципиально, ибо при структуре таблицы
pay_extActions (id, payActID, extPayType, extPayData)
вряд ли Вы будете использовать поле id вне контекста pay_actions

kormotА то что в двойной записи должен быть всегда в ноль баланс а мы тут половину отрежем - не будет принципиальной проблемой?Будет это приниципиальной проблемой или не будет зависит от ответов на вопросы: Нужно ли тебе знать, что где-то "вовне" деньги уменьшились? Зачем тебе нужен "ноль" в балансе?
Да и ты хорошо бы ответить на мой вопрос
Mr.Fontaine Что даёт тебе номер телефона или последние четыре цифры карты?
Может после этого тебе станет более понятно какие таблицы тебе нужны.
...
Рейтинг: 0 / 0
Реализация "кошельков" для разных сущностей
    #39857907
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mr.Fontaine pay_extActions (id, payActID, extPayType, extPayData)
вряд ли Вы будете использовать поле id вне контекста pay_actions
Точно... у меня просто ID головного мозга :) Во всех таблицах должен быть ID, а тут же точно можно такой-же как в таблице действий первичный ключ использовать. Всё, понял.

Mr.FontaineБудет это приниципиальной проблемой или не будет зависит от ответов на вопросы: Нужно ли тебе знать, что где-то "вовне" деньги уменьшились? Зачем тебе нужен "ноль" в балансе?
Да и ты хорошо бы ответить на мой вопрос
Нет, уменьшение денег вовне мне неинтересно. Но например может теолретически быть полезной информация сколько и откуда денег поступило. Но это уже другой вопрос, к балансу не относящийся.
Ноль в балансе - это меня когда отправили понимать что такое "двойная запись" которая является стандартом для учёта средств, я и взял от туда поступат, что должно быть так и всё. Сумма должна быть равна нулю.

А для чего мне информация о источнике (т.е. номер телефона и идентификатор в платёжной системе и т.п.) - ну так для возможной привязки "внешнего счёта" к тому или иному "субъекту" в системе. Из карт не 4 последние цифры, а там какой-то есть же уникальный идентификатор данной карты в банке и при платеже там вроде передаётся эта информация.
Зачем нужно мне это в итоге, ну всё же это информация о средствах, причём информация о внешних платежах - именно о средствах реальных а не внутрисистемных, и у меня стойкое ощущение что каждый уникальных источник средств для системы должен быть оформлен сущностью.
...
Рейтинг: 0 / 0
Реализация "кошельков" для разных сущностей
    #39857914
Mr.Fontaine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormotнапример может теолретически быть полезной информация сколько и откуда денег поступило. Как раз для этого мы и создаём табличку pay_extActions (id, payActID, extPayType, extPayData) . Думаю, что при необходимости из extPayData можно получить откуда, а из payActions джойном можно получить сколько.
kormotА для чего мне информация о источнике (т.е. номер телефона и идентификатор в платёжной системе и т.п.) - ну так для возможной привязки "внешнего счёта" к тому или иному "субъекту" в системе. Из карт не 4 последние цифры, а там какой-то есть же уникальный идентификатор данной карты в банке и при платеже там вроде передаётся эта информация.
Зачем нужно мне это в итоге, ну всё же это информация о средствах, причём информация о внешних платежах - именно о средствах реальных а не внутрисистемных, и у меня стойкое ощущение что каждый уникальных источник средств для системы должен быть оформлен сущностью.
А вот это веский аргумент для того, чтобы создать табличку с внешними счетами. и тогда в pay_extActions не будет пустых полей и будет красивый ноль в балансе.
Только может быть в pay_actions ещё поле ввести с типом кредита (внешний или внутренний)?
Да и для дебета тогда можно поле типа ввести. А то мало ли что потребуется....
...
Рейтинг: 0 / 0
Реализация "кошельков" для разных сущностей
    #39857923
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mr.FontaineА вот это веский аргумент для того, чтобы создать табличку с внешними счетами. и тогда в pay_extActions не будет пустых полей и будет красивый ноль в балансе.
Только может быть в pay_actions ещё поле ввести с типом кредита (внешний или внутренний)?
Да и для дебета тогда можно поле типа ввести. А то мало ли что потребуется....
Т.е. поток движений средств имеет смысл разделять на внутренние и внешние?
А про поле с типом внешний и внутренний у pay_Actions я не понял. Ведь если есть pay_extActions - в которой (currID, extAccID, bagID, extPayAmount, bagPayAmount) зачем указание на внешний или внутренний в pay_actions?

Да и к тому же если типы "внешний счёт" или "кошелёк" будут определяться значением поля в таблице - то это же сразу будет проблемой при выборке. Надо джойнить с обеими таблицами ext_accounts и pay_bags и IF'ом выбирать или в самом приложении брать то или иное поле. Нужно ли тут это EAV?
...
Рейтинг: 0 / 0
Реализация "кошельков" для разных сущностей
    #39857933
Mr.Fontaine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormot,
Я говорю про такую структуру (выдеру таблицы из твоих сообщений, потому формат разный)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 table pay_actions (id, currID, debetBagID, creditBagID, debetSum, creditSumm) 

TABLE Accounts (
    id           SERIAL,
    entityType   TINYINT UNSIGNED NOT NULL,
    entityID     BIGINT UNSIGNED NOT NULL,
    accData      .....
)

//Описание внешних счетов
Account_Ext (
    id        SERIAL,
    accType   TINYINT UNSIGNED NOT NULL, /*константа тип: ЯД, WM, SMS и т.д.*/
    accKey    CHAR(64) UNIQUE, /* идентификатор счёта, т.е. номер кошелька в ЯД или номер телефона в SMS */
    accData1 ...
    accData2 ...
    .....
)


вот тут-то и можно в таблицу pay_actions добавить тип аккаунта
pay_actions (id, currID, debetBagID, debetBagType, creditBagID, creditBagType, debetSum, creditSumm)
а таблица pay_extActions (id, currID, bagID, extPayType, extPayData, paySum) в этом случае вообще не нужна.
...
Рейтинг: 0 / 0
Реализация "кошельков" для разных сущностей
    #39857935
Mr.Fontaine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя таблицу Accounts лучше показать по последнему варианту:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
'CREATE TABLE IF NOT EXISTS `pay_account` ('.
					'	id		BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, '.
					'	cDate		DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP(), '.
					'	sessID		BIGINT UNSIGNED NOT NULL, '.
					'	accType		TINYINT UNSIGNED NOT NULL, '.
					'	accObjID	BIGINT UNSIGNED NOT NULL, '.
					'	UNIQUE KEY	accKey (accType, accObjID) '.
					') ENGINE=InnoDB CHARSET="utf8" COMMENT="Счета в системе"
...
Рейтинг: 0 / 0
Реализация "кошельков" для разных сущностей
    #39857942
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mr.Fontaine,

Ну да, я так и понял, но ведь тут ссылка на родителя (счёт) получается в зависимости от accType - это стоит того? Как тогда например выбирать информацию о всех поступлениях в данный кошелёк, с информацией о счетах участвующих в операции?
Код: sql
1.
2.
3.
4.
select aa..... , bb.... , cc....
FROM pay_actions    aa 
LEFT JOIN Accounts bb ON ... /* Как мы должны понять, что aa.debetBagID - это именно bagID а не extID?*/
LEFT JOIN Account_Ext cc ON .../* Как мы должны понять, что aa.creditBagID - это именно bagID а не extID?*/


Как-то очень недетерминировано выглядит это.

А в случае наличия двух таблиц ext_actions и bag_actions , там UNION ALL'ом всё однозначно получается.
...
Рейтинг: 0 / 0
Реализация "кошельков" для разных сущностей
    #39857950
Mr.Fontaine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormot, ну согласен. недетерминированно.
Твой вариант с разными таблицами внутренних и внешних перемещений лучше.
...
Рейтинг: 0 / 0
Реализация "кошельков" для разных сущностей
    #39857959
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mr.Fontaine спасибо за помощь!
В итоге сформировалась благодаря этому обсуждению такая схема:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
		case 'tab.pay_transaction.create':	//Транзакции в системе
			$sql	= 'CREATE TABLE IF NOT EXISTS `pay_transaction` ('.
					'	id		BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, '.
					'	cDate		DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP(), '.
					'	sessID		BIGINT UNSIGNED NOT NULL, '.
					'	tDescr		CHAR(255) '.
					') ENGINE=InnoDB CHARSET="utf8" COMMENT="Транзакции в системе"';
			break;

		case 'tab.pay_bags.create':		//Таблица с кошельками в системе
			$sql	= 'CREATE TABLE IF NOT EXISTS `pay_bags` ('.
					'	id		BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, '.
					'	cDate		DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP(), '.
					'	sessID		BIGINT UNSIGNED NOT NULL, '.
					'	bagType		TINYINT UNSIGNED NOT NULL, '.
					'	ObjID		BIGINT UNSIGNED NOT NULL, '.
					'	UNIQUE KEY	bagKey (bagType, ObjID) '.
					') ENGINE=InnoDB CHARSET="utf8" COMMENT="Кошельки разных объектов в системе"';
			break;

		case 'tab.pay_moneyBags.create':	//Состояние кошельков
			$sql	= 'CREATE TABLE IF NOT EXISTS `pay_moneyBags` ('.
					'	id		BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, '.
					'	bagID		BIGINT UNSIGNED NOT NULL, '.
					'	currID		SMALLINT UNSIGNED NOT NULL, '.
					'	currMoney	DECIMAL(30,20), '.
					'	UNIQUE KEY	bagCurr (bagID, currID), '.
					' FOREIGN KEY	(bagID) REFERENCES pay_bags(id) ON DELETE RESTRICT ON UPDATE RESTRICT, '.
					' FOREIGN KEY	(currID) REFERENCES sys_currInfo(id) ON DELETE RESTRICT ON UPDATE RESTRICT '.
					') ENGINE=InnoDB CHARSET="utf8" COMMENT="Состояние кошельков в системе в разных валютах"';
			break;

		case 'tab.pay_bagActions.create':		//Таблица с записью движений средств между кошельками
			$sql	= 'CREATE TABLE IF NOT EXISTS `pay_bagActions` ('.
					'	id		BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, '.
					'	cDate		DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP(), '.
					'	sessID		BIGINT UNSIGNED NOT NULL, '.
					'	PT_ID		BIGINT UNSIGNED NOT NULL, '.
					'	actType		TINYINT UNSIGNED NOT NULL, '.
					'	currID		SMALLINT UNSIGNED NOT NULL, '.
					'	debBagID	BIGINT UNSIGNED, '.
					'	debAmount	DECIMAL(30,20) NOT NULL, '.
					'	credBagID	BIGINT UNSIGNED, '.
					'	credAmount DECIMAL(30,20) NOT NULL, '.
					' FOREIGN KEY	(PT_ID) REFERENCES pay_transaction(id) ON DELETE RESTRICT ON UPDATE RESTRICT, '.
					' FOREIGN KEY	(currID) REFERENCES sys_currInfo(id) ON DELETE RESTRICT ON UPDATE RESTRICT, '.
					' FOREIGN KEY	(debetBagID) REFERENCES pay_bags(id) ON DELETE RESTRICT ON UPDATE RESTRICT, '.
					' FOREIGN KEY	(creditBagID) REFERENCES pay_bags(id) ON DELETE RESTRICT ON UPDATE RESTRICT '.
					') ENGINE=InnoDB CHARSET="utf8" COMMENT="Движения на счетах."';
			break;

		case 'tab.pay_extAccounts.create':		//Таблица с внешними счетами
			$sql	= 'CREATE TABLE IF NOT EXISTS `pay_extAccounts` ('.
					'	id		BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, '.
					'	cDate		DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP(), '.
					'	sessID		BIGINT UNSIGNED NOT NULL, '.
					'	extType		SMALLINT UNSIGNED NOT NULL, '.	/* Тип внешнего счёта. Определённая константа указывающая на внешний сервис */
					'	extKey		CHAR(64) NOT NULL, '.			/* Уникальный ключ счёта во внешнем сервисе */
					' UNIQUE KEY	extAcc (extType, extKey) '.	/* Уникальность счёта в сервисе */
					') ENGINE=InnoDB CHARSET="utf8" COMMENT="Счета участвовавшие во внешних денежных транзакциях системы"';
			break;

		case 'tab.pay_extActions.create':		//Таблица с движениями средств в\из системы
			$sql	= 'CREATE TABLE IF NOT EXISTS `pay_extActions` ('.
					'	id		BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, '.
					'	cDate		DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP(), '.
					'	sessID		BIGINT UNSIGNED NOT NULL, '.
					'	PT_ID		BIGINT UNSIGNED NOT NULL, '.
					'	currID		SMALLINT UNSIGNED NOT NULL, '.	/* TODO: Хотя наверное у счёта внешнего сервиса одна валюта. В будущем будет понятно */
					'	extAccID	BIGINT UNSIGNED NOT NULL, '.	/* Ссылка на внешний счёт */
					'	extAmount	DECIMAL(30,20) NOT NULL, '.		/* Величина движения средств на внешнем счёте */
					'	bagID		BIGINT UNSIGNED NOT NULL, '.	/* Ссылка на кошелёк */
					'	bagAmount	DECIMAL(30,20) NOT NULL, '.		/* Величина движения средств на кошельке */
					' FOREIGN KEY	(PT_ID) REFERENCES pay_transaction(id) ON DELETE RESTRICT ON UPDATE RESTRICT, '.
					' FOREIGN KEY	(currID) REFERENCES sys_currInfo(id) ON DELETE RESTRICT ON UPDATE RESTRICT, '.
					' FOREIGN KEY	(extAccID) REFERENCES pay_extAccounts(id) ON DELETE RESTRICT ON UPDATE RESTRICT, '.
					' FOREIGN KEY	(bagID) REFERENCES pay_bags(id) ON DELETE RESTRICT ON UPDATE RESTRICT '.
					') ENGINE=InnoDB CHARSET="utf8" COMMENT="Движения средств В/ИЗ системы"';
			break;



Если есть предложения и замечания, буду благодарен!
...
Рейтинг: 0 / 0
Реализация "кошельков" для разных сущностей
    #39857994
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormotСкажите пожалуйста, как лучше оформить личные счета ...
Пример исключительно теоретический
Как угодно, рабочий вариант будет только в том случае когда есть конкретная постановка задачи, нет постановки задачи, придумайте сами процессы для которых создаете информационное сопровождение, из них и выделяйте необходимые сущности и атрибуты, универсального решения на все случаи жизни не существует.
...
Рейтинг: 0 / 0
13 сообщений из 38, страница 2 из 2
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Реализация "кошельков" для разных сущностей
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]