SQLinfo.ru - Все о MySQL Highload++ 2017

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 01.07.2017 14:29:12

Pantela777
Завсегдатай
Зарегистрирован: 06.06.2016
Сообщений: 39

Таблицы для баланса пользователя, транзакции, заказов

Всем прив.
Я не первый наверное кто подобный вопрос поднимает, но всё же... Стоит задача в проекте сделать баланс пользователей.
Сразу подчеркну что надо создать 2 разных счёта "USD" и "EUR"
Думаю какого вида таблицы создать. Попробую привести прим. той что я думаю.

В таблице пользователя создать 2 поля:

balance_usd double(15,2)
balance_eur double(15,2)

Думаю для того что бы сумму подсчитывать баланс сразу из одного поля, что бы не пробегать по другой таблицы для суммирования все входящие и исходящие суммы.


Таблица транзакции: Для введение учёта всех транзакции
CREATE TABLE IF NOT EXISTS `users_transactions` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) DEFAULT NULL COMMENT 'Пользователь',
  `datetime` datetime NOT NULL COMMENT 'Дата-Время операции',
  `type` enum('credit','debit') NOT NULL COMMENT 'credit-поступило на счет, debit - снято со счета',
  `currency` enum('usd','eur') NOT NULL COMMENT 'Какая валюта была',
  `method_id` tinyint(1) NOT NULL COMMENT 'Метод',
  `order_id` int(11) DEFAULT NULL COMMENT 'Заказ',
  `amount` double(15,2) NOT NULL COMMENT 'Сумма',
  `comment` text NOT NULL COMMENT 'Комментарий'
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Вопрос: "order_id" думаю тут держать, т.к. снятие счёта тоже тут буду сохранять


Метод пополнения счёта:
CREATE TABLE `methods` (
  `method_id` int(11) NOT NULL,
  `status` tinyint(1) NOT NULL,
  `title` varchar(55) COLLATE utf8_unicode_ci NOT NULL
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;



Заказы:
CREATE TABLE `orders` (
  `order_id` int(11) NOT NULL,
  `status` tinyint(1) NOT NULL,
  `summ` double(15,2) NOT NULL COMMENT 'Сумма',
  `sale` double(15,2) NOT NULL COMMENT 'Скидка',
  `comment` text NOT NULL COMMENT 'Комментарий'
  PRIMARY KEY (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Вопрос: Как тут определятьопределять каике продукты входят в запись? Делять ещё отдельную таблицу и там ввести учёт? напр. order_id = product_id


Продукты:
CREATE TABLE `products` (
  `product_id` int(11) NOT NULL AUTO_INCREMENT,
  `status` tinyint(1) NOT NULL,
  `title` varchar(55) COLLATE utf8_unicode_ci NOT NULL
  `price` double(15,2) NOT NULL COMMENT 'Сумма',
  `comment` text NOT NULL COMMENT 'Комментарий'
  PRIMARY KEY (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


Что думаете...?

спс.Ув.

Отредактированно Pantela777 (01.07.2017 14:38:34)

Неактивен

 

#2 01.07.2017 18:08:04

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2093

Re: Таблицы для баланса пользователя, транзакции, заказов

Никогда (от слова совсем!) не храните деньги в double. В decimal или int складывайте.
Есть ли вероятность того, что балансы будут нужны еще в 10-ти других валютах?
Если да, то лучше создать таблицу валют и на нее ссылаться.
Ссылку на пользователя в таблице транзакций лучше в foreign key обернуть, ну и остальные ссылки.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 01.07.2017 19:14:10

Pantela777
Завсегдатай
Зарегистрирован: 06.06.2016
Сообщений: 39

Re: Таблицы для баланса пользователя, транзакции, заказов

deadka написал:

Никогда (от слова совсем!) не храните деньги в double. В decimal или int складывайте.


Есть ли вероятность того, что балансы будут нужны еще в 10-ти других валютах?
Если да, то лучше создать таблицу валют и на нее ссылаться.
Ссылку на пользователя в таблице транзакций лучше в foreign key обернуть, ну и остальные ссылки.

1. Почему? У меня в компании приложение 6 год работает с полями double проблем не было...

2. Нет строго только 2 валюты.

3. т.е?

Ну а в общем что я описал и спросил как быть...?

Неактивен

 

#4 01.07.2017 20:54:11

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2093

Re: Таблицы для баланса пользователя, транзакции, заказов

1) Ружье, висящее на стене обязательно выстрелит.
https://toster.ru/q/23947
https://stackoverflow.com/questions/628 … l-database

Лично такое реализовывать не довелось, но какие могу дать общие рекомендации:

Хранить обе валюты в таблице транзакций user_transactions.
То есть поля usd_amount и eur_amount в таблице транзакций - также как и в таблице пользователей.
Чтобы всегда, на каждом шаге представлять сколько денег было потрачено, сколько осталось, etc.

Таблица user_transactions должна через foreign key ссылыться на user_id таблице user.

Таблица order ссылается на пользователя.
Таблица product_orders - это многие ко многим, ссылается на order и на product.
то есть если купили 3 веника и 2 грелки в одном заказе, то создаются 2 записи в таблице product_orders, обе ссылаются на один order (ибо заказ один), но на разные товары в таблице product.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 01.07.2017 20:58:22

klow
Активист
Зарегистрирован: 06.12.2014
Сообщений: 236

Re: Таблицы для баланса пользователя, транзакции, заказов

1. Просто еще не наступили на грабли. Хотите проверить грабли - может продолжать. smile Для денег нужно использовать только "точные" типы.

Неактивен

 

#6 01.07.2017 21:26:25

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2093

Re: Таблицы для баланса пользователя, транзакции, заказов

Равно как и для медицины, радиации и прочих сущностей подобного рода smile.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#7 02.07.2017 00:01:52

Pantela777
Завсегдатай
Зарегистрирован: 06.06.2016
Сообщений: 39

Re: Таблицы для баланса пользователя, транзакции, заказов

Хранить обе валюты в таблице транзакций user_transactions.
То есть поля usd_amount и eur_amount в таблице транзакций - также как и в таблице пользователей.
Чтобы всегда, на каждом шаге представлять сколько денег было потрачено, сколько осталось, etc.

ну вроде у меня сейчас так, 

`currency` enum('usd','eur') NOT NULL COMMENT 'Какая валюта была',
буду определять для а кой валюты было действие. а в таблице пользователей уже полный итог держать. В принципе полный итог я и из таблицы user_transactions смогу доставать, просто т.к. записей очень много будет считать от туда не хочу... Быстрее будет сразу статичное из таблицы пользователей взать.

Про сылание понял спс, так и собирался.

Ну а так по архитектуре таблиц и полей есть замечание или правки...?

спс.Ув.

Неактивен

 

#8 02.07.2017 08:38:51

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2093

Re: Таблицы для баланса пользователя, транзакции, заказов

Если Вы хотите иметь возможность восстановить историю баланса в обеих валютах (а лучше, разумеется, так и сделать) - то надо хранить не `currency` enum('usd','eur') , а как я написал выше.
Курсы валют меняются по много раз на дню, нужно всегда писать финальный баланс  "после сделки" в обеих валютах в Вашем случае.
Остальные замечания или правки могут возникнуть, если приведете итоговую структуру.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#9 02.07.2017 11:15:08

Pantela777
Завсегдатай
Зарегистрирован: 06.06.2016
Сообщений: 39

Re: Таблицы для баланса пользователя, транзакции, заказов

Ну историю подсчитать всегда ведь смогу т.е. запись у меня будет или usd или eur, это не курс! А именно валюта по которой прошла транзакция.
Вечером попробую накидать дамп. Что бы наглядно было бы.
спс.Ув.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson