|
Что лучше: Java или ...?
|
|||
---|---|---|---|
#18+
Возникла необходмость вести многовалютный учет. Для этого пришлось к каждому полю с ценой завести поле с ид. валюты. Мне так не всегда удобно. 1. Имеет-ли смысл завести Ява-класс, в котором сразу хранить и сумму и валюту? На первый взгляд, мне во многих местах так было бы удобнее. 2. А много я в производительности потеряю, в случаях, если я буду накладывать ограничение на запрос по какому-либо полю (или тем более методу) ява-класса? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2003, 14:59 |
|
Что лучше: Java или ...?
|
|||
---|---|---|---|
#18+
А чем не удобен вариант с полем id валюты ? Даже если сделаете Java класс, там также придется делать 2 поля, какая разница. В производительности однозначно потеряете, чтобы обработать обьект СУБД придется его десериализовывать для каждой записи, плюс на выборку по полям класса оптимизатор запросов будет уходить на Table Scan. По моему обычными средствами все реализуется гораздо проще, эффективнее и красивее. P.S. Кстати тема более подходит для форума "Проектирование БД". Если хотите, я могу этот топик туда перенаправить, думаю там найдется много народу, которые выскажут свое мнение ЗА и ПРОТИВ. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2003, 23:56 |
|
Что лучше: Java или ...?
|
|||
---|---|---|---|
#18+
не удобен, в основном, одним: есть куча функций для работы с ценой - не удобно возвращать два параметра. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2003, 16:51 |
|
Что лучше: Java или ...?
|
|||
---|---|---|---|
#18+
Ну и работайте с ценой - сделайте вьювер, в котором будет вычисляемое поле Цена * ЗначениеВалюты и применяйте на них свою кучу функций :) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2003, 17:18 |
|
Что лучше: Java или ...?
|
|||
---|---|---|---|
#18+
1. Я посмотрел "проектирование БД" - не надо меня туда. 2. Не понял, что такое "вьювер"? Если это просто вьюшка :) - то не очень понял, как я могу их использовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2003, 17:27 |
|
Что лучше: Java или ...?
|
|||
---|---|---|---|
#18+
Можно такой вариант: хранить цену как условные единицы, а в справочнике валют делать раскладку на условные единицы, например если принять USD как условную единицу, то типа того: Цена товара: 200.00 Справочник валют: USD - 1.00 Руб - 29.80 Eur - 0.92 Делаем вьювер: Код: plaintext 1. 2. 3. 4. 5.
В итоге вьювер возвращает на каждый товар его раскладку для каждой валюты. Далее с ним легко работать - например надо получить товар в его рублевом эквиваленте: Код: plaintext 1. 2. 3. 4.
Если необходимо хранить цену не в условных единицах, а реальных на конкретно указанную валюту, то вышеприведенный пример просто следует немного усложнить: добавить в таблицу Товар еще поле КодВалюты, в справочнике валют оставить все как есть - то есть отношение значения валюты к условной единице, а вьювер написать примерно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Тут получается, что мы подвязываем справочник валют дважды - под алиасом вт мы получаем валюту, на которую ссылается товар и деля цену товара на значение валюты получаем цену в условных еденицах, которую потом далее и умножаем на значение для каждой валюты справочника по алиасу в Ну и естественно оба варианта требуют, чтобы какая то валюта была принята за условную (то есть имела значение валюты равное 1) и весь справочник валют расписывался по отношению к ней. Если возникнет необходимость хранения истории изменения значений валют, то со справочника валют необходимо будет вынести значение валюты в отдельную таблицу с датой периода действия значения и соотвествующе для облегчения получения значений так же понаделать вьювера, например возвращать текущие значения валют, возвращать значения валют на указанную дату и т.д. P.S. Ну общий смысл думаю понятен - тут надо искать не пути изменения модели работы РСУБД (а использование Java именно к этому и приведет и кстати думаю хлопот больше будет, чем отдачи), а более серьезно подойти к структуре проектируемой БД, чем правильней она будет созданна, тем легче и красивей обычным SQL без всяких заморочек можно будет работать. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2003, 11:09 |
|
Что лучше: Java или ...?
|
|||
---|---|---|---|
#18+
автор=ASCRUS писал:Если возникнет необходимость хранения истории изменения значений валют, то со справочника валют необходимо будет вынести значение валюты в отдельную таблицу с датой периода действия значения А, в принципе, так и сделано :), только без вьюшек. Цену товара на заданную дату и в заданной валюте я получаю вызовом функции. 1. А что, если использовать просмотры, будет быстрее? Вот они, беды, перехода от программирования к БД - иногда некоторые БДшные приемы даже не приходят в голову, хотя, казалось бы, ничего не известного. Надо будт на реальных данных покрутить, что быстрее... 2. Да, так можно жить (так и живем), но есть одна большая неудобность: в прайс-листе есть куча цен, каждая из которых может быть или задана непосредственно (с указанием валюты) или задана ссылкой на другую цену с некоторой скидкой/наценкой. Вычисляется рекурсивным вызовом функции. Вот тут при каждом вызове надо получать и цену и валюту. Собственно, вопрос только в этом месте. Правда, полагаю, можно будет обойтись использованием _чего_нибудь_такого_ только в функции, а хранить отдельно. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2003, 13:50 |
|
Что лучше: Java или ...?
|
|||
---|---|---|---|
#18+
Одно точно - запросы и представления без пользовательских функций работают однозначно быстрее. Во первых вызов функции на каждую строку возвращаемого результата приведет к тому, что СУБД придется вызывать функцию, которая скажем так не на Си написана и изначально по определению будет работать медленно. Во вторых если функция использует запросы внутри себя, то это еще больше замедлит работы системы, ведь получается на каждую запись результата запроса будет выполнен еще один запрос, что тоже довольно таки печально. В случае же обработки информации чистыми запросами в дело вступает оптимизатор запросов, который уже начинает использовать индексы и статистику, выбирать наиболее эффективный план выполнения запроса и т.д.. Так что мое мнение - UDF существуют только для легких скалярных вычислений, т.е. для обработки результата запроса (округлить, сравнить, сумма прописью и т.д). А обработка множеств данных должна всегда осуществляться только на SQL, в случае часто использования запросов в качестве подзапросов в других запросов целесообразно делать вьювера, в крайних случаях некой расширенной обработки информации, при ее частом использовании в разных местах можно иногда позволять себе использовать в запросах ХП, но опять же это приведет к снижению эффективности оптимизатора запросов и увеличению в планах запросов методов table scan. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2003, 14:04 |
|
Что лучше: Java или ...?
|
|||
---|---|---|---|
#18+
Вопрос: Код: plaintext 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.
А что плохого в таком плане? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2003, 16:23 |
|
Что лучше: Java или ...?
|
|||
---|---|---|---|
#18+
Неплохо было бы посмотреть сам запрос, план без запроса не очень читабелен :) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2003, 18:37 |
|
Что лучше: Java или ...?
|
|||
---|---|---|---|
#18+
2 ASCRUS Начиная с восьмой версии ASA сайбейз обещает "сквозную" оптимизацию UDF в запросах, т.е. с учетом плана запроса. Не знаю, как там реализовано, но заявление есть. Но по-моему тоже лучше вместо функции написать view: проще оптимизировать (для оптимизатора), проще читать и часто проще писать. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2003, 00:45 |
|
Что лучше: Java или ...?
|
|||
---|---|---|---|
#18+
Я так понимаю, в ASA есть кэширование функций. Но что выполняется внутри функций, естественно в план запроса никак попасть не может. Отследить очень легко, например есть 2 таблицы Table1 и Table2: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Пишем обычный запрос: Код: plaintext 1. 2. 3.
Смотрим план запроса, там все Ok, присутствуют обе таблицы, сканирование Table2 идет по индексу внешнего ключа. Например мы написали функцию, которая по Id возвращает поле Name таблицы Table1: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Пишем запрос, по на первый взгляд аналогичен вышенаписанному запросу: Код: plaintext 1. 2.
Смотрим план запроса, там присутствует только Table2, по которой идет TableScan. Сканирование Table1 будет вызываться для каждой строчки запроса Table2 из самой функции и оптимизатором никак не учитывается. Даже с учетом того, что вышеприведенный пример очень прост, если в таблицы Table1 и Table2 загнать по десяток миллионов записей, то разницу во времени выполнения можно будет уже ощутить не только через план запросов. Плюс если рассмотреть оба варианта запроса - без функции и с функцией, то выплывает, что они будут возвращать разный результат запросов. Я не зря сделал поле T1_id в таблице Table2 как NULL - по key join будут возвращаться только те записи, которые имеют родителя в таблице Table1, в случае с функцией будут возвращаться все записи таблицы Table2. Так что в случае перевода частей запросов в функции мы сами себя очень даже можем запутать, привести к неоднозначности и ограничить использование соединений в SQL. P.S. В этом плане легко тем, кто работал с MSSQL версий ниже 2000, там UDF не было и в помине, поэтому и вопросов насчет эффективности вьюверов и UDF не возникало, в каком то плане наверное это даже было полезным, хотя частенько отсутствие UDF было очень и очень печальным. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2003, 05:51 |
|
Что лучше: Java или ...?
|
|||
---|---|---|---|
#18+
2 ASCRUS > Но что выполняется внутри функций, естественно в план запроса никак попасть не может. Видел эту информацию в what's new для ASA8, буквально одно предложение, подробностей не знаю. >P.S. В этом плане легко тем, кто работал с MSSQL версий ниже 2000, там UDF не было и в помине, поэтому и вопросов насчет эффективности вьюверов и UDF не возникало, в каком то плане наверное это даже было полезным, хотя частенько отсутствие UDF было очень и очень печальным. У меня в этом плане трудностей вроде тоже не было, хотя можно сказать был воспитан сайбейзом, когда он еще был ваткомом. Шутка. На самом деле это скорее вопорс типа мышления, кому-то удобнее мыслить декларативно, кому-то процедурно. Оба подхода имеют достоинства и недостатки. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2003, 02:00 |
|
|
start [/forum/topic.php?fid=55&fpage=131&tid=2014781]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
76ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
109ms |
get tp. blocked users: |
2ms |
others: | 274ms |
total: | 507ms |
0 / 0 |