powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / конвертация валют
71 сообщений из 71, показаны все 3 страниц
конвертация валют
    #39035220
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хочу добавить в базу данных конвертацию валюты:
1) все курсы будем хранить по отношению к евро
2) и пересчитывать в любую выбранную валюту
3) схема такая:



4) норм? нет?
...
Рейтинг: 0 / 0
конвертация валют
    #39035221
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab,
не туда запостила (хотела в проектирование БД), сотрите пожалуйста
...
Рейтинг: 0 / 0
конвертация валют
    #39035229
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
цель пересчитать данные по странам в выбранную валюту
прикручивать будем примерно так:

...
Рейтинг: 0 / 0
конвертация валют
    #39035279
Serguei
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblabцель пересчитать данные по странам в выбранную валюту
прикручивать будем примерно так:


для начала определитесь с постановкой задачи. Я так понимаю сейчас вы изливаете в интернет "поток своего сознания". И сами четко не понимаете чего хотите.
...
Рейтинг: 0 / 0
конвертация валют
    #39035287
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblabхочу добавить в базу данных конвертацию валюты:
1) все курсы будем хранить по отношению к евро

У Вас могут быть проблемы с точностью при расчете кросс-курсов
mini.weblab3) схема такая:


Не совсем понятно вынесение поля Rate в отдельную таблицу.
...
Рейтинг: 0 / 0
конвертация валют
    #39035291
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblabцель пересчитать данные по странам в выбранную валюту
прикручивать будем примерно так:


"Будте проще - к вам потянутся" (с) Карнеги.
Много лишнего, таблицу TimeSeries можно сократить, Таблицу Rate тоже.
Для ускорения можно в таблице Курсов либо две даты держать, либо курсы иметь всегда на каждый день.
...
Рейтинг: 0 / 0
конвертация валют
    #39035294
dma_caviar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab,

Делайте через валютные пары.
...
Рейтинг: 0 / 0
конвертация валют
    #39035326
Гхостик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Непонятно, какая выгода выносить TimeSeries и CountryTime в отдельные таблицы?

Я бы сделал так:

country_currency( country , from_date , to_date, currency)
currency_rate( currency , from_date , to_date, rate)

to_date заполняется автоматически, и not null.
...
Рейтинг: 0 / 0
конвертация валют
    #39035331
dma_caviar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гхостик,

А нафига две даты?
...
Рейтинг: 0 / 0
конвертация валют
    #39035338
Cane Cat Fisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неправильно хранить Rate к Евро. Нужно хранить исходные данные так, как публикует их официальный источник: "За 100 тугриков - 33 еврика, за 10 тугриков - 22 бублика", то есть хранить и 100, и 33, и 10, и 22, и тугрики и еврики и бублики.

А если хранить коэффициент, то при попытке обменять 100 миллионов тугриков получится не ровно 33 миллиона евриков, а с хвостиком. И будут вопросы.

Кроме того, при попытке обмена напрямую бублики на еврики могут быть особые правила - например, считать не через тугрики, а через другую валюту.

И вообще, просто "конвертации валюты" в вакууме не бывает. Мультивалютный учет - отдельная песня со своими тараканами. Погуглите "Курсовые валютные и суммовые разницы".
...
Рейтинг: 0 / 0
конвертация валют
    #39035379
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dma_caviarГхостик,

А нафига две даты?
если за некоторые даты курсов нет - так быстрее искать нужную.
...
Рейтинг: 0 / 0
конвертация валют
    #39035400
dma_caviar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan Durakdma_caviarГхостик,

А нафига две даты?
если за некоторые даты курсов нет - так быстрее искать нужную.
Так и не надо на конкретную дату искать курс. Ясно что его может не быть. Ищем максимальную имеющуюся дату, которая <= искомой даты, затем ищем курс на эту максимальную дату. Настраиваем индексы и все отлично работает.
...
Рейтинг: 0 / 0
конвертация валют
    #39035435
Злой Бобр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab,

Всего 2 таблицы : валюты и курсы валют. Ребята уже сказали - проще нужно быть, а то потом в вашем бардаке никто разбираться не будет.
...
Рейтинг: 0 / 0
конвертация валют
    #39035440
Гхостик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dma_caviarТак и не надо на конкретную дату искать курс. Ясно что его может не быть. Ищем максимальную имеющуюся дату, которая <= искомой даты, затем ищем курс на эту максимальную дату. Настраиваем индексы и все отлично работает.Один between и писать гораздо короче, и для СУБД проще выполнять.
...
Рейтинг: 0 / 0
конвертация валют
    #39035455
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гхостикdma_caviarТак и не надо на конкретную дату искать курс. Ясно что его может не быть. Ищем максимальную имеющуюся дату, которая <= искомой даты, затем ищем курс на эту максимальную дату. Настраиваем индексы и все отлично работает.Один between и писать гораздо короче, и для СУБД проще выполнять.

Вставлять новый курс зато дороже, и коллизии в данных возможны. Схема с двумя датами имхо осмысленна для вьюшки, но не для исходной таблицы.
...
Рейтинг: 0 / 0
конвертация валют
    #39035459
dma_caviar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гхостикdma_caviarТак и не надо на конкретную дату искать курс. Ясно что его может не быть. Ищем максимальную имеющуюся дату, которая <= искомой даты, затем ищем курс на эту максимальную дату. Настраиваем индексы и все отлично работает.Один between и писать гораздо короче, и для СУБД проще выполнять.
Представьте, если каждый кодер будет городить в таблице кучу полей чтобы лично ему было проще жить из-за своих сложностей с sql.
...
Рейтинг: 0 / 0
конвертация валют
    #39035481
Гхостик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Кот Матроскин:
Делая две даты во view а не таблице, мы не улучшаем производительность запросов. И, конечно, денормализация имеет свою цену, это и код поддержки правильности дублирования данных, и удорожание модификации данных. И, в данным конкретном случае, я считаю что эта цена не чрезмерна.

dma_caviarиз-за своих сложностей с sql.Сложностей с sql нет, но зачем делать сложнее когда можно сделать проще?
...
Рейтинг: 0 / 0
конвертация валют
    #39035494
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гхостик2 Кот Матроскин:
Делая две даты во view а не таблице, мы не улучшаем производительность запросов.

Если вьюшка материализованная - то улучшает (тоже возникает удорожание модификаций, конечно - но тут уж либо дудочка, либо кувшинчик)
Т.е. любая вьюшка закрывает Ваше "between писать проще" + материализованная закрывает и "для СУБД проще выполнять", если это действительно нужно
...
Рейтинг: 0 / 0
конвертация валют
    #39035507
17-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab,
слишком сложно, достаточно двух таблиц -
справочник валют (ид, код, наименование, страна)
таблица: ид, ид валюты1, ид валюты2, дата/время, курс
...
Рейтинг: 0 / 0
конвертация валют
    #39035534
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кот МатроскинГхостик2 Кот Матроскин:
Делая две даты во view а не таблице, мы не улучшаем производительность запросов.

Если вьюшка материализованная - то улучшает (тоже возникает удорожание модификаций, конечно - но тут уж либо дудочка, либо кувшинчик)
Т.е. любая вьюшка закрывает Ваше "between писать проще" + материализованная закрывает и "для СУБД проще выполнять", если это действительно нужно
вместо одного поля добавлять цельную мат.вью. !!!!!!
Это лажа.
...
Рейтинг: 0 / 0
конвертация валют
    #39035537
dma_caviar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гхостикно зачем делать сложнее когда можно сделать проще?
Сложнее чего, вот этого?))

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select Rate
from Rates
where
	Currency1 = ... and
	Currency2 = ... and
	Date = (
		select max(Date)
		from Rates
		where
			Currency1 = ... and
			Currency2 = ... and
			Date <= '2015-08-25'
	)



или

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select Rate
from Rates
where
	Currency1 = ... and
	Currency2 = ... and
	Date = (
		select top 1 Date
		from Rates
		where
			Currency1 = ... and
			Currency2 = ... and
			Date <= '2015-08-25'
		order by Date desc
	)
...
Рейтинг: 0 / 0
конвертация валют
    #39035546
Shr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dma_caviarГхостикно зачем делать сложнее когда можно сделать проще?
Сложнее чего, вот этого?))

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select Rate
from Rates
where
	Currency1 = ... and
	Currency2 = ... and
	Date = (
		select max(Date)
		from Rates
		where
			Currency1 = ... and
			Currency2 = ... and
			Date <= '2015-08-25'
	)


Да, этого:
Код: sql
1.
2.
3.
4.
5.
6.
select Rate
from Rates
where
	Currency1 = ... and
	Currency2 = ... and
	'2015-08-25' between FromDate and ToDate


И когда такие запросы пишутся сотнями для десятка аналогичных таблиц с историческими данными, разница заметна.
...
Рейтинг: 0 / 0
конвертация валют
    #39035549
dma_caviar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shr,

А где код, который обновляет вторую дату? Желательно с контолем на пересечение.
...
Рейтинг: 0 / 0
конвертация валют
    #39035554
dma_caviar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShrИ когда такие запросы пишутся сотнями для десятка аналогичных таблиц с историческими данными, разница заметна.
Каких таблиц... курсы как правило юзаются в виде скалярной функции, типа ПолучитьКурсНаДату и все эти сотни просто юзают эту функцию.
...
Рейтинг: 0 / 0
конвертация валют
    #39035558
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan DurakКот Матроскинпропущено...

Если вьюшка материализованная - то улучшает (тоже возникает удорожание модификаций, конечно - но тут уж либо дудочка, либо кувшинчик)
Т.е. любая вьюшка закрывает Ваше "between писать проще" + материализованная закрывает и "для СУБД проще выполнять", если это действительно нужно
вместо одного поля добавлять цельную мат.вью. !!!!!!
Это лажа.

Да, вместо одного поля добавить цельную мат.вью.
Вопрос "чем это лучше?" - для самостоятельного изучения.
...
Рейтинг: 0 / 0
конвертация валют
    #39035587
Shr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dma_caviarShr,

А где код, который обновляет вторую дату? Желательно с контолем на пересечение.Запросов на выборку больше чем один раз написанный код на модификацию.

dma_caviarкурсы как правило юзаются в виде скалярной функции, типа ПолучитьКурсНаДатуКогда такой атрибут (курс) один - да. Когда их несколько - уже сложнее. Ну, и в целом к функциям в sql у меня есть некоторая подозрительность.
...
Рейтинг: 0 / 0
конвертация валют
    #39035594
dma_caviar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShrНу, и в целом к функциям в sql у меня есть некоторая подозрительность.
А, понятно, вопросов больше нет)
...
Рейтинг: 0 / 0
конвертация валют
    #39036011
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо за ответы!

Уточню:
1) Конвертация "приделывается" к уже существующей ДБ. Поэтому простота не очень-то прокатывает.
2) Курсы буду хранить на каждый день
3) TimeSeries - таблица из начальной ДБ, поэтому убирать ее никуда не нужно
будем использовать ее для привязки
3) По поводу того, что выносить Rate в отдельную таблицу не стоит,
пожалуй, соглашусь. Зачем я это сделала? ну например, чтобы не
хранить пустые значения (на самом-то деле, я поэкспериментировала с нормализацией)
4) Конвертация происходит через связку CountryTime.
Т.е в базе собрана некоторая статистика по странам
и денежные значения нужно уметь конвертировать в любую валюту.
5) Хранить курсы я буду не в евро, а в нац.валюте
(т.е стоимость 1евро в нац. валюте)
6) Курсы будем хранить на каждый день
7) Конвертация проста:
пусть нужно предоставить отчет в доллара на определенную дату:
a)находится курс USD/EUR на заданную дату
б)выбираются курсы CUR/EUR на заданную дату
в)делим USD/EUR на CUR/EUR и получаем нужные курсы нац. валют в USD
...
Рейтинг: 0 / 0
конвертация валют
    #39036014
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и дополнительный вопрос по поводу функций:
почему к функциям относитесь с недоверием? :)
у нас в базе кстати тоже функций мало (в основном мои :D), а ведь оч. удобная вещь
...
Рейтинг: 0 / 0
конвертация валют
    #39036017
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и еще вопрос, допустим я все-таки выношу Rate в отдельную таблицу (как в схеме)
rtID в таблице Rate будет foreign key по отношению к rtID в таблице TimeCurrency? правильно или нет?
...
Рейтинг: 0 / 0
конвертация валют
    #39036128
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblabи еще вопрос, допустим я все-таки выношу Rate в отдельную таблицу (как в схеме)
rtID в таблице Rate будет foreign key по отношению к rtID в таблице TimeCurrency? правильно или нет?
неправильно, форейн будет в таблице которая на рэйт ссылается.
Но реально есть уже бест практисы по реализации курсов валют давным давно,
ни в одной из них нету никакой отдельной таблицы для самого курса!
...
Рейтинг: 0 / 0
конвертация валют
    #39036130
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dma_caviarShrНу, и в целом к функциям в sql у меня есть некоторая подозрительность.
А, понятно, вопросов больше нет)
перегрузка запроса функциями - лучший способ запутать оптимизатор
...
Рейтинг: 0 / 0
конвертация валют
    #39036139
dma_caviar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan Durakdma_caviarпропущено...

А, понятно, вопросов больше нет)
перегрузка запроса функциями - лучший способ запутать оптимизатор
Никакой перегрузки тут нет, простейшая функция с минимальной стоимостью (лично у меня показывает 0.009).
...
Рейтинг: 0 / 0
конвертация валют
    #39036140
dma_caviar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dma_caviarу меня показывает 0.009).
Ой, не туда посмотрел, 0.003
...
Рейтинг: 0 / 0
конвертация валют
    #39036260
Злой Бобр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab,

Еще раз - всего 2 таблицы решают вашу задачу. Это если вы все озвучили правильно. В противном случае схема может расширяться.
...
Рейтинг: 0 / 0
конвертация валют
    #39036937
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Злой Бобр,
нормализация базы как раз и используется, для того чтобы была возможность сравнительно легко расшириться в будущем.

вопрос про ключи это теоретический вопрос, возникший по ходу разбора полетов
отдельную тему заводить не хотелось

Рассмотрим часть таблицы с вынесением курсов в отдельную таблицу


теперь нужно обеспечить целостность БД
ключ rtID в таблице TimeCurrency будет первичным ключом (эта таблица собственно и используется для генерации ключей)

что происходит с таблицей Rate?
я бы ставила Foreign Key + Unique Constraint на rtID в таблице Rate.
прокомментируйте пожалуйста
(и не говорите, что нет смысла выносить курсы в отдельную таблицу)
...
Рейтинг: 0 / 0
конвертация валют
    #39037108
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblabключ rtID в таблице TimeCurrency будет первичным ключом
а смысл???
...
Рейтинг: 0 / 0
конвертация валют
    #39037129
Злой Бобр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab,

Мне, как и всем тут, абсолютно всеравно как вы реализуете свою задачу. Мы лишь можем подсказать как лучше, что б потом не переделывать кучу таблиц.
Для начала расшифруйте что у вас в какой таблице. Я примерно догадываюсь, но опыт подсказывает что все может быть. И уточню еще раз - вам необходимо хранение курсов валют? Или курсов в разрезе поставщиков? Ну или еще что ... Если речь именно о денежном курсе валют - 2 таблицы решают все. В противном случае нужно подробно знать что и как.

После обеда гляну и подскажу что и как.
...
Рейтинг: 0 / 0
конвертация валют
    #39037189
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan Durak,
смысл в том, что я хочу разобраться
...
Рейтинг: 0 / 0
конвертация валют
    #39037214
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblabключ rtID в таблице TimeCurrency будет первичным ключом (эта таблица собственно и используется для генерации ключей)

что происходит с таблицей Rate?
я бы ставила Foreign Key + Unique Constraint на rtID в таблице Rate.

А что, Ваша СУБД не умеет делать одно и то же поле primary key и foreign key? Ну тогда делайте так, как Вы написали.
Понимаете, непонятен смысл Вашей таблицы Rate - чего Вы хотите добиться при помощи нее? поэтому сложно советовать, как ее правильно сделать.
если у Вас отношение 1:0..1 - каков бизнес-смысл записи в TimeCurrency, которой не соответствует запись в rate?

Злой БобрЕсли речь именно о денежном курсе валют - 2 таблицы решают все.
Нет, конечно - как минимум еще могут понадобиться виды курсов.
...
Рейтинг: 0 / 0
конвертация валют
    #39037244
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblabIvan Durak,
смысл в том, что я хочу разобраться
ну щаззз.
кто холчет разобраться пишет. "подскажите как"
А вы пишете - "я уже все решила, напишите мне что это правильно. Только не пишите что это непрвильно."
А на вопросы "нафига вот эта лишняя хрень?" отвечаете что-то невразумительное типа "на самом-то деле, я поэкспериментировала с нормализацией".
...
Рейтинг: 0 / 0
конвертация валют
    #39037937
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) как правильно заметил Злой Бобр, решение никого не интересует, поэтому я просто учла критику и возможные трудности и более-менее определилась со схемой, спасибо

2) но возникли новые вопросы по ключам и я беру начальную схему как пример и спрашиваю, как лучше сделать ключи в таблице Rate в начальной схеме



рассматриваю варианты
а) Foreign Key + Primary Key
б) Foreign Key + Unique

посоветуйте

таблицы:
Currency: содержит список валют (добавленная)
TimeSeries: содержит список временных рядов (часть ДБ к которой добавим конвертер)
TimeCurrency: таблица-отношение, используется для генерации ключей (добавленная)
Rate: таблица значений курсов, вынесена, чтобы не хранить пустых значений курсов (добавленная)
...
Рейтинг: 0 / 0
конвертация валют
    #39037940
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кот Матроскин,
умеет, я сразу не подумала :)
в TimeCurrency я генерирую ключи по Identity на 10 лет вперед
возможно в TimeCurrency такая схема себя не оправдывает, но в случае CountryTime такая схема очень даже удобно,
многие статистические показатели зависят от времени-страны и их нужно связывать между собой,
поэтому я генерирую ключи в отдельной таблице
в таблице Rate я держу имеющиеся ненулевые курсы

если коротко, то TimeCurrency используется for consistency
...
Рейтинг: 0 / 0
конвертация валют
    #39037970
Злой Бобр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab,

Примерно так:

Дальше уже расширять в зависимости от необходимости.
...
Рейтинг: 0 / 0
конвертация валют
    #39038049
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblabв TimeCurrency я генерирую ключи по Identity на 10 лет вперед
возможно в TimeCurrency такая схема себя не оправдывает, но в случае CountryTime такая схема очень даже удобно,
многие статистические показатели зависят от времени-страны и их нужно связывать между собой,
поэтому я генерирую ключи в отдельной таблице
в таблице Rate я держу имеющиеся ненулевые курсы

если коротко, то TimeCurrency используется for consistency

Схема странная, но назвать явно неправильной ее нельзя - никаких особых проблем кроме усложнения логики она не несет, так что если Вам нравится - почему нет.
Float - не очень хороший тип для денежных значений, лучше использовать что-то типа money.
...
Рейтинг: 0 / 0
конвертация валют
    #39038369
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кот Матроскин, Злой Бобр

Спасибо за помощь :)
...
Рейтинг: 0 / 0
конвертация валют
    #39039004
Фотография Alex_496
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab,

когда работал в компании с международным бизнесом и требовались курсы разнообразных валют, даже тех, которые котируются 1 раз в месяц, то сделал таблицу фактов, в которой курс по отношению к рублю каждой валюты на каждую дату и за период за 10 лет. Никаких коэффициентов, всё максимально подготовлено. Навесил покрывающий индекс. Один раз прогрузил курсы, далее они никогда не меняются, далее только подгружай ежедневно. Даже пересчитывал и загружал курсы по устаревшим валютам - драхма, немецкая марка и т.д.
...
Рейтинг: 0 / 0
конвертация валют
    #39046335
ShkrylAndrei
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторхочу добавить в базу данных конвертацию валюты:
1) все курсы будем хранить по отношению к евро
2) и пересчитывать в любую выбранную валюту
3) схема такая:



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

Конвертация-это операция, или функция, на вход которой должно подаваться значение, а на выходе получать пересчитанный денежный курс нужной страны.

Вы некорректно ставите задачу, отсюда проблемы с самого начала.

Что за база данных, она существует? Тогда надо посмотреть схему, или вы собираетесь добавлять отдельно новую структуру от всей базы данных?

Вся реляционная теория строится на сущностях и связей между ними, хотите добавить новую сущность
Ее надо написать на человекопонятном языке, тогда ваши мысли будут понятны не только вам, и людям желающим вам помочь, а разработчикам который достанется ваш продукт после вас.
...
Рейтинг: 0 / 0
конвертация валют
    #39207895
sameuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер.
Есть одна.. Задачка, так скажем. В последнее время не приходят свежие мысли в голову по поводу ее решения...

Существует (пока что в вакууме) сервис.. :) По выкупу и пересылке товаров.

Который принимает от клиентов рубли , меняет рубли на доллары , на которые в свою очередь выкупаются товары . Процесс в упрощенном виде выглядит так:

- клиент добавил в корзину товаров на 100$;
- этот же клиент пополняет свой рублевый счет на 10 000 рублей, которые затем меняются по некоему внутреннему курсу на доллары (пусть в данном примере это будет 100 рублей за 1 доллар для удобства);
- клиент получает на баланс [долларового счета] 100$;
- клиент оплачивает товары в кабинете,
- оператор-сотрудник, получив "заказ" клиента, проводит фактическую оплату.
- денежка списывается со счета, в свойствах товаров фиксируем курс покупки (чтобы клиент знал, по какому курсу были выкуплены те или иные товары или сколько рублей он потратил на ту или иную вещь), проблем никаких не возникает.

Но если вдруг (а такое, к сожалению, бывает) по какому-то из товаров выкуп осуществить не удается (например, товар кончился у поставщика уже после оплаты сделки), проблемный товар удаляется и не принимает участие в подсчете баланса клиента.

Допустим, в примере выше оператор смог оплатить 5 товаров на сумму 70$, а шестой товар на сумму 30$ решили отменить.
Клиент говорит, что пока не собирается ничего покупать на освободившуюся сумму в 30 долларов. Пусть она полежит на счете.
...
Через неделю клиент решает купить вещь за 300 долларов. На счете у клиента осталось 30$ из предыдущего заказа.
Курс теперь составляет не 100, а 90 р\доллар, клиент пополняет счет на (90руб\$ * 270$) = 24 300 рублей, которые меняются на доллары и приходят на долларовый счет клиента в личном кабинете. Теперь баланс клиента составляет ровно 300 долларов.

Вопрос: как следует подойти к решению вопроса об указании курса данной сделки? Что должно быть вписано в поле "курс"?
В данной сделке 30$ менялись по курсу 100 р\$ и 270 по курсу 90 р\$.
Думаю, какие-то решения существуют на этот счет.. Догадки о том, как должно быть (или во всяком случае как НЕ должно быть) :).

Как в таком случае определяется принадлежность транзакции тому или иному товару?..
Одна транзакция на обмен валюты может послужить основанием для выкупа 10 разных товаров, ровно как и несколько транзакций (с разными курсами обмена) могут обеспечить выкуп лишь одного товара.
...
Рейтинг: 0 / 0
конвертация валют
    #39207910
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
atrsameuser,
Я думаю, проблема из-за того, что курс не должен быть атрибутом сущности "сделка" - Ваш пример это адекватно показывает.
Т.е. есть операция "конвертация" - у нее есть курс, и есть операция "сделка" - она происходит уже в целевой валюте, и курса у нее нет.
...
Рейтинг: 0 / 0
конвертация валют
    #39207927
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sameuserВопрос: как следует подойти к решению вопроса об указании курса данной
сделки? Что должно быть вписано в поле "курс"?
То, что предписывает налоговый кодекс. Иначе как только бизнес перестанет быть
сферическим, Вас загонят туда, где и Ходорковский не бывал.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
конвертация валют
    #39207930
sameuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov, интересует ответ на вопрос с точки зрения технической реализации в первую очередь. :)

В дополнение - в данном случае суммы совершенно не сопоставимы... ) С суммами транзакций вышеназванного господина) Речь о выкупе товаров с онлайн-магазинов вроде ебей и т.п., тут большим цифрам браться неоткуда..
...
Рейтинг: 0 / 0
конвертация валют
    #39208237
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sameuserDimitry Sibiryakov, интересует ответ на вопрос с точки зрения технической реализации в первую очередь. :)

В дополнение - в данном случае суммы совершенно не сопоставимы... ) С суммами транзакций вышеназванного господина) Речь о выкупе товаров с онлайн-магазинов вроде ебей и т.п., тут большим цифрам браться неоткуда..
Верно тебе ответили. Курс - свойство конвертации. У покупки курса нет!!
Единственное, что у меня большие сомнения в том что вы реально меняете клиентские рубли на валюту до оплаты за товар. То есть бизнес-процесс у вас скорее всего неверно описан, и на счету у клиента таки рубли висят.
...
Рейтинг: 0 / 0
конвертация валют
    #39208330
sameuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кот Матроскинatrsameuser,
Я думаю, проблема из-за того, что курс не должен быть атрибутом сущности "сделка" - Ваш пример это адекватно показывает.
Т.е. есть операция "конвертация" - у нее есть курс, и есть операция "сделка" - она происходит уже в целевой валюте, и курса у нее нет.
В таком случае теряется определенная точность.. Хотелось бы, конечно, контролировать данные полностью.
Мысль вчера пришла. Возможно, не самая лучшая.. Возможно я что-то упустил. Но все же хотел обсудить..

Если.. Создать таблицу принадлежности транзакций примерно такой структуры:

Код: html
1.
2.
3.
4.
5.
6.
ID   TOVAR_ID   TRANSACTION_ID   AMOUNT
1      1010         35             30$
2      1010         36            270$
3      1232         40             10$
4      1233         40             25$
5      1234         40             40$




При осуществлении фактической оплаты товаров оператором напротив каждой оплачиваемой товарной позиции расположить выпадающий список с возможностью множественного селекта..
Состав списка - транзакции данного конкретного клиента..

Код: html
1.
2.
3.
4.
5.
6.
Товар          Сумма     Принадлежность транзакции
                         (здесь выпадающий список)
__________________________________________

Футболка       10$        250$ от 01.01.2015 по курсу 100p\$
                           80$ от 02.02.2015 по курсу  85p\$




Что-то вроде того. Конечно, подобный механизм будет оправдан в первую очередь для позиций со смешанным курсом.. В остальных случаях (коих, слава богу, большинство) выпадающий список транзакций будет содержать практически всегда одну транзакцию, а не 2, как в случае с тем клиентом, который решил отложить денежку.
...
Рейтинг: 0 / 0
конвертация валют
    #39208348
sameuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторЕдинственное, что у меня большие сомнения в том что вы реально меняете клиентские рубли на валюту до оплаты за товар.
К счастью или к сожалению, именно так и выстроен бизнес-процесс. Переделывание не представляется возможным (пока что).
...
Рейтинг: 0 / 0
конвертация валют
    #39208406
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot
Если...
Что-то вроде того..[/quot]
Этот изобретенный велосипед называется партионный учет себестоимости, класически бывает по методу FIFO или LIFO
и совершенно не нужен вам!!!!
Контролирость данные полностью - это как раз и есть введение операции "конвертация"
...
Рейтинг: 0 / 0
конвертация валют
    #39208408
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sameuserавторЕдинственное, что у меня большие сомнения в том что вы реально меняете клиентские рубли на валюту до оплаты за товар.
К счастью или к сожалению, именно так и выстроен бизнес-процесс. Переделывание не представляется возможным (пока что).
Как так?? Меняются рубли на валюту сразу при зачислении?? Ну так вообще какие проблемы?? Тогда весь учет и баланс клиента ведите и отображайте ему в валюте!!!
...
Рейтинг: 0 / 0
конвертация валют
    #39208853
sameuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторМеняются рубли на валюту сразу при зачислении??
Не сразу, процесс требует время. За которое, кстати, иногда курс меняется. Это другая головная боль..
...
Рейтинг: 0 / 0
конвертация валют
    #39209012
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sameuserавторМеняются рубли на валюту сразу при зачислении??
Не сразу, процесс требует время. За которое, кстати, иногда курс меняется. Это другая головная боль..
тем более в операцциях клиент должен видеть операцию "конвертации" - с реальной датой этой конвертации. Тогда у него не будет вопроса "шозанах".
...
Рейтинг: 0 / 0
конвертация валют
    #39209690
sameuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автортем более в операцциях клиент должен видеть операцию "конвертации" - с реальной датой этой конвертации. Тогда у него не будет вопроса "шозанах".
Разумеется. Предполагается детальный учет транзакций обмена валюты с указанием даты, суммы списания рублей, суммы зачисления долларов, курса обмена (ожидаемого и фактического, по которому состоялась процедура обмена).

авторЭтот изобретенный велосипед называется партионный учет себестоимости, класически бывает по методу FIFO или LIFO
и совершенно не нужен вам!!!!
Очень бы не хотелось отказываться от полной детализации, так скажем.
Про партионный учет почитал немного, спасибо. Знал бы раньше - не потратил 2 дня на размышления. Изобретение велосипедов отнимает время.. Потому, наверное, и решил на форум зайти ))

Бывает, что заказ клиента может состоять всего из одной позиции (одной строки в личном кабинете). Например, какая-то дорогая вещь или же наоборот, множество мелких и дешевых (1 action-камера или 20 пар перчаток).

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

> Верно тебе ответили. Курс - свойство конвертации. У покупки курса нет!!

Клиент спросит: скажи мне, любезный, во сколько мне обошлась вот эта вот вещь, когда я ее покупал, в рублях?

Какие есть варианты?
а) отказаться и забить - не хотелось бы..
б) считать по действовавшему на ту дату курсу обмена валют - возможны неточности (см. пример с оставшимися 100$ на счете)
в) считать по курсу обмена ближайшей к дате покупки товара транзакции - сработает в большинстве случаев (но не во всех, см. тот же пример)
г) ввести партионный учет - сложновато, лишний код, лишняя нагрузка на оператора, не исключены ошибки того же оператора

Причем если 1 раз у клиента остались средства с предыдущих покупок, то с большой долей вероятности в будущем в составе баланса также будут присутствовать доллары с разных транзакций (по 1-10 долларов или по несколько центов). Ну и возможность изменения курсов за время, требуемое для обмена, также подкидывает хаотичности процессу. Подобные случаи "смешанного" баланса, я так думаю, будут наблюдаться гораздо чаще, чем казалось изначально.
...
Рейтинг: 0 / 0
конвертация валют
    #39209773
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sameuserКлиент спросит: скажи мне, любезный, во сколько мне обошлась вот эта вот вещь, когда я ее покупал, в рублях?

Какие есть варианты?
а) отказаться и забить - не хотелось бы..
б) считать по действовавшему на ту дату курсу обмена валют - возможны неточности (см. пример с оставшимися 100$ на счете)
в) считать по курсу обмена ближайшей к дате покупки товара транзакции - сработает в большинстве случаев (но не во всех, см. тот же пример)
г) ввести партионный учет - сложновато, лишний код, лишняя нагрузка на оператора, не исключены ошибки того же оператора

Нагрузка на оператора не нужна - Иван-Дурак упомянул же, что партионный учет обычно реализуется по методу LIFO или FIFO. Спрашивать оператора, какие именно доллары тратятся на покупку, купленные по 30 рублей или по 80 - бессмысленно, клиенту это неважно (если он не юрлицо - но тогда он эти расчеты ведет сам). Программа вполне может это решать сама, в соответствии с выбранной логикой учета.
Но вообще мультивалютный учет - непростая вещь и для нужд обычного инет-магазина довольно избыточная. Вот Вы хотите сообщать клиенту, во сколько в рублях ему обойдется покупка. А если клиент скажет "нет, чего-то в рублях выходит дофига - не буду покупать, давайте-ка мне лучше эти рубли назад"? Выйдет неловко. Проблема даже не в технической реализации (она хоть и непростая, но вполне изжеванная) - а в том, что придется прописывать кучу всего в регламенты, в оферту для клиента, чтобы в случае чего успешно решать такие вопросы в судах. Так что на Вашем месте я бы собрал бухгалтера, юриста и директора и спросил у них "А мы все-таки точно хотим вести учет клиентской позиции в нескольких валютах сразу?" ;)
...
Рейтинг: 0 / 0
конвертация валют
    #39210054
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sameuserКлиент спросит: скажи мне, любезный, во сколько мне обошлась вот эта вот вещь, когда я ее покупал, в рублях?

Какие есть варианты?

Правильный вариант только один.
Ответить - эта вещь обошлась вам в 100$. Так как мы потратили на нее именно 100$ а не рубли. И эти 100$ взяли из вашего кошелька.
А Как и по какому курсу попали 100$ в ваш кошелек - смотрте историю конвертаций.

Это самый правильный и честный ответ!
...
Рейтинг: 0 / 0
конвертация валют
    #39216497
sameuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ничего более полезного я придумать не смог по вопросам, разбиравшимся выше. Возьму предложенные способы в работу :)

Далее приходится задумываться о хранении записей движения средств (транзакций).
Предполагается наличие в системе нескольких внутренних счетов (напр., рублёвый_банк1, рублевый_киви, рублевый_вебмани, долларовый и т.п.)

Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
transaction_table
______________________
tran_id	          INT
tran_type         ENUM('1','2','3')   
tran_amount       INT	              // количество средств
tran_owner        Внешний ключ на user_id из таблицы пользователей сервиса
...
tran_from_account Внешний ключ на account_id из таблицы системных счетов
tran_to_account   Внешний ключ на account_id из таблицы системных счетов



И tran_from_account, и tran_to_account могут быть null.

Если NULL'ом является сущность tran_from_account, то предполагается, что средства поступили извне (ENUM № 1 - пополнение баланса клиентом), а если tran_to_account является типом NULL - то подразумевается вывод средств из системы (ENUM № 3 - возврат денег клиенту, например).

Если же и tran_from_account и tran_to_account не являются NULL'ом - то это будет обмен валюты или перевод со счета на счет (ENUM - тип № 2)

При таком раскладе в базе отсутствуют сущности, отвечающие за определение направления входа и выхода средств (точнее, поступления и вывода). Вместо них используется NULL, т.к. зачисление может осуществляться разными способами, как и вывод может быть произведен на разные кошельки или счета в разных банках.
Была мысль вместо NULL использовать ноль, но тогда бы пришлось создать системный счёт account_id=0, который выступал бы как свалка для описанных выше задач. От этой мысли я отказался.

Баланс клиента user_id № 150 в рублях будет считаться примерно так (подсчетом суммы поступлений и последующим вычитанием из нее всех возможных расходов).. Я, возможно,чуть напутал с синтаксисом, но .. Суть передать смогу. :)

SELECT ( SUM(tran_amount) in transaction_table WHERE tran_owner=150 AND tran_type=1 AND tran_from_account IS NULL ) -
// выше вычислили сумму всех поступлений
......SELECT ( SUM(tran_amount) in tran_table WHERE tran_owner=150 AND tran_type=2 AND tran_from_account IS NOT NULL AND tran_to_account IS NOT NULL ) -
......// вычитаем сумму всех списаний по обмену валюты
............SELECT ( SUM(tran_amount) in tran_table WHERE tran_owner=150 AND tran_type=3 AND tran_to_account IS NULL )
............// вычитаем сумму всех выплат клиенту (возвратов средств)
Возможно, конечно, удастся ограничиться в запросах выше лишь указанием типа транзакций (tran_type) без последующей логической проверки (напр., AND tran_from_account IS NOT NULL AND tran_to_account IS NOT NULL ). Я пока еще не могу точно определить, потребуются ли эти условия для обеспечения целостности расчетов, исключая возможность ошибки где-то.. Или же послужат лишней нагрузкой. Вероятно, ответ придет позднее (в процессе дальнейшей разработки и проектировки).
Готов к критике. :)
...
Рейтинг: 0 / 0
конвертация валют
    #39217014
sameuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Будем считать, что возражений не поступило. И на том спасибо! :)
...
Рейтинг: 0 / 0
конвертация валют
    #39217791
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У тебя на три типа операции - три селекта. А когда типов будет 100 ???
Баланс должен собиратьс простой суммой всех! операций по нему.
Операции себе заведи с + приход, с - уход.
То есть сумируешь ВСЕ по счету, а там уже автоматом приходы прибавляются, уходы отнимаются.
...
Рейтинг: 0 / 0
конвертация валют
    #39217793
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, да. Этот велосипед называется "двойная запись", тоже давно изобретен, погугли
...
Рейтинг: 0 / 0
конвертация валют
    #39219689
sameuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторУ тебя на три типа операции - три селекта. А когда типов будет 100 ???
Баланс должен собиратьс простой суммой всех! операций по нему.
Операции себе заведи с + приход, с - уход.
То есть сумируешь ВСЕ по счету, а там уже автоматом приходы прибавляются, уходы отнимаются.
Спасибо за ваш отзыв. Думаю, едва ли этих типов наберется более 5-6...
И т.к. биллинг бивалютный, одним селектом все равно, видимо, не отделаешься..
...
Рейтинг: 0 / 0
конвертация валют
    #39220219
sameuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Забыл добавить - валютный баланс тоже предполагается подсчитывать именно как сумму поступлений на валютный счет от клиента ID=XXX, за вычетом всех списаний и за вычетом всех товаров. Ибо сумма за каждый конкретный товар собирается из множества мелких расходов вроде страховки, цен на доставку по регионам, разных комиссий и прочая-прочая, что невозможно собрать в единый тарифный план или еще как-то структурировать (да и не нужно оно, т.к. значения всех этих страховок, доставок и пр. регулярно меняются на лету).
...
Рейтинг: 0 / 0
конвертация валют
    #39248979
mini.weblab, а каким образом привязать конвертацию к ежедневному изменению курса доллара?
...
Рейтинг: 0 / 0
конвертация валют
    #39249095
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Рюриковmini.weblab, а каким образом привязать конвертацию к ежедневному изменению курса доллара?
вычеркните слово "изменению", добавьте слово "дату" перед словом "конвертации" перечитайте вопрос и поймете ответ
...
Рейтинг: 0 / 0
конвертация валют
    #39249152
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Рюриков,

1) можно использовать формулу, т.е на основе имеющихся данных пересчитать сколько стоит доллар (или любая другая интересующая валюта) в различных валютах
2) если вы будете работать с долларами, то вам имеет смысл хранить стоимость доллара (а не евро) в различных валютах
3) если вы работаете с форексом, то вам схема не подойдет: нужно рассматривать не валюты, а валютные пары
4) приведенная схема использовалась для конкретной уже работающей базы, поэтому она выглядит не совсем стандартно, это нужно учитывать
...
Рейтинг: 0 / 0
71 сообщений из 71, показаны все 3 страниц
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / конвертация валют
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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