Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Проектирование БД Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
 Re: Реализация "кошельков" для разных сущностей  [new]
kormot
Member

Откуда:
Сообщений: 249
Mr.Fontaine,

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

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

А как с такой таблицей учёта движений средств указать поступление средств извне? Отдельная получается должна быть таблица pay_extActions (id, currID, bagID, extPayType, extPayData, paySum) - т.е. валюта внешней транзакции, с каким кошельком эта транзакция и собственно описание внешнего плавтежа. Я с введением внешних счетов просто получается дополнительно нормализовал эту таблицу, но если объективно это не требуется, то конечно обойдусь таким вариантом.
5 сен 19, 12:32    [21964425]     Ответить | Цитировать Сообщить модератору
 Re: Реализация "кошельков" для разных сущностей  [new]
Mr.Fontaine
Member

Откуда: у меня столько мыслей?
Сообщений: 758
kormot,
автор
А как с такой таблицей учёта движений средств указать поступление средств извне?

да собственно так же как и в первой таблице, ибо хранить движения денег лучше в одной таблице.
только два поля кредита оставляй пустыми, ибо "извне".
Если есть необходимость хранить данные источника денег, то вот для этого и можно использовать вторую табличку убрав из твоего варианта лишние поля
pay_extActions (id, extPayType, extPayData)
5 сен 19, 12:57    [21964462]     Ответить | Цитировать Сообщить модератору
 Re: Реализация "кошельков" для разных сущностей  [new]
kormot
Member

Откуда:
Сообщений: 249
Mr.Fontaine,

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

А то что в двойной записи должен быть всегда в ноль баланс а мы тут половину отрежем - не будет принципиальной проблемой?
5 сен 19, 13:04    [21964471]     Ответить | Цитировать Сообщить модератору
 Re: Реализация "кошельков" для разных сущностей  [new]
Mr.Fontaine
Member

Откуда: у меня столько мыслей?
Сообщений: 758
kormot
Mr.Fontaine,

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

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

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

Может после этого тебе станет более понятно какие таблицы тебе нужны.
5 сен 19, 13:22    [21964500]     Ответить | Цитировать Сообщить модератору
 Re: Реализация "кошельков" для разных сущностей  [new]
kormot
Member

Откуда:
Сообщений: 249
Mr.Fontaine
pay_extActions (id, payActID, extPayType, extPayData)
вряд ли Вы будете использовать поле id вне контекста pay_actions

Точно... у меня просто ID головного мозга :) Во всех таблицах должен быть ID, а тут же точно можно такой-же как в таблице действий первичный ключ использовать. Всё, понял.

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

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

А для чего мне информация о источнике (т.е. номер телефона и идентификатор в платёжной системе и т.п.) - ну так для возможной привязки "внешнего счёта" к тому или иному "субъекту" в системе. Из карт не 4 последние цифры, а там какой-то есть же уникальный идентификатор данной карты в банке и при платеже там вроде передаётся эта информация.
Зачем нужно мне это в итоге, ну всё же это информация о средствах, причём информация о внешних платежах - именно о средствах реальных а не внутрисистемных, и у меня стойкое ощущение что каждый уникальных источник средств для системы должен быть оформлен сущностью.
5 сен 19, 13:48    [21964554]     Ответить | Цитировать Сообщить модератору
 Re: Реализация "кошельков" для разных сущностей  [new]
Mr.Fontaine
Member

Откуда: у меня столько мыслей?
Сообщений: 758
kormot
например может теолретически быть полезной информация сколько и откуда денег поступило.
Как раз для этого мы и создаём табличку pay_extActions (id, payActID, extPayType, extPayData) . Думаю, что при необходимости из extPayData можно получить откуда, а из payActions джойном можно получить сколько.
kormot
А для чего мне информация о источнике (т.е. номер телефона и идентификатор в платёжной системе и т.п.) - ну так для возможной привязки "внешнего счёта" к тому или иному "субъекту" в системе. Из карт не 4 последние цифры, а там какой-то есть же уникальный идентификатор данной карты в банке и при платеже там вроде передаётся эта информация.
Зачем нужно мне это в итоге, ну всё же это информация о средствах, причём информация о внешних платежах - именно о средствах реальных а не внутрисистемных, и у меня стойкое ощущение что каждый уникальных источник средств для системы должен быть оформлен сущностью.

А вот это веский аргумент для того, чтобы создать табличку с внешними счетами. и тогда в pay_extActions не будет пустых полей и будет красивый ноль в балансе.
Только может быть в pay_actions ещё поле ввести с типом кредита (внешний или внутренний)?
Да и для дебета тогда можно поле типа ввести. А то мало ли что потребуется....
5 сен 19, 14:01    [21964572]     Ответить | Цитировать Сообщить модератору
 Re: Реализация "кошельков" для разных сущностей  [new]
kormot
Member

Откуда:
Сообщений: 249
Mr.Fontaine
А вот это веский аргумент для того, чтобы создать табличку с внешними счетами. и тогда в pay_extActions не будет пустых полей и будет красивый ноль в балансе.
Только может быть в pay_actions ещё поле ввести с типом кредита (внешний или внутренний)?
Да и для дебета тогда можно поле типа ввести. А то мало ли что потребуется....

Т.е. поток движений средств имеет смысл разделять на внутренние и внешние?
А про поле с типом внешний и внутренний у pay_Actions я не понял. Ведь если есть pay_extActions - в которой (currID, extAccID, bagID, extPayAmount, bagPayAmount) зачем указание на внешний или внутренний в pay_actions?

Да и к тому же если типы "внешний счёт" или "кошелёк" будут определяться значением поля в таблице - то это же сразу будет проблемой при выборке. Надо джойнить с обеими таблицами ext_accounts и pay_bags и IF'ом выбирать или в самом приложении брать то или иное поле. Нужно ли тут это EAV?
5 сен 19, 14:11    [21964586]     Ответить | Цитировать Сообщить модератору
 Re: Реализация "кошельков" для разных сущностей  [new]
Mr.Fontaine
Member

Откуда: у меня столько мыслей?
Сообщений: 758
kormot,
Я говорю про такую структуру (выдеру таблицы из твоих сообщений, потому формат разный)
 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) в этом случае вообще не нужна.
5 сен 19, 14:32    [21964603]     Ответить | Цитировать Сообщить модератору
 Re: Реализация "кошельков" для разных сущностей  [new]
Mr.Fontaine
Member

Откуда: у меня столько мыслей?
Сообщений: 758
Хотя таблицу Accounts лучше показать по последнему варианту:
'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="Счета в системе"
5 сен 19, 14:36    [21964605]     Ответить | Цитировать Сообщить модератору
 Re: Реализация "кошельков" для разных сущностей  [new]
kormot
Member

Откуда:
Сообщений: 249
Mr.Fontaine,

Ну да, я так и понял, но ведь тут ссылка на родителя (счёт) получается в зависимости от accType - это стоит того? Как тогда например выбирать информацию о всех поступлениях в данный кошелёк, с информацией о счетах участвующих в операции?
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'ом всё однозначно получается.
5 сен 19, 14:45    [21964617]     Ответить | Цитировать Сообщить модератору
 Re: Реализация "кошельков" для разных сущностей  [new]
Mr.Fontaine
Member

Откуда: у меня столько мыслей?
Сообщений: 758
kormot, ну согласен. недетерминированно.
Твой вариант с разными таблицами внутренних и внешних перемещений лучше.
5 сен 19, 14:54    [21964628]     Ответить | Цитировать Сообщить модератору
 Re: Реализация "кошельков" для разных сущностей  [new]
kormot
Member

Откуда:
Сообщений: 249
Mr.Fontaine спасибо за помощь!
В итоге сформировалась благодаря этому обсуждению такая схема:
		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;


Если есть предложения и замечания, буду благодарен!
5 сен 19, 15:04    [21964648]     Ответить | Цитировать Сообщить модератору
 Re: Реализация "кошельков" для разных сущностей  [new]
iOracleDev
Member

Откуда:
Сообщений: 303
kormot
Скажите пожалуйста, как лучше оформить личные счета ...
Пример исключительно теоретический

Как угодно, рабочий вариант будет только в том случае когда есть конкретная постановка задачи, нет постановки задачи, придумайте сами процессы для которых создаете информационное сопровождение, из них и выделяйте необходимые сущности и атрибуты, универсального решения на все случаи жизни не существует.
5 сен 19, 15:54    [21964712]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / Проектирование БД Ответить