Сортировка по цене
1649 повідомлень
#13 років тому
Цитата ("Statukha"):Я бы в запросе умножал цену на курс из таблицы курсов
у меня курсы хранятся в базе но там немного другая логика. Если понадобится, смогу использовать.
Цитата ("Statukha"):
Хотя я считаю что это не аккуратное решение т.к. при изменении соотношений курсов сортировка может оказаться не верной.
почему не аккуратное? При смене курса в запросов подставляются другие значения которые у меня уже есть, до выполнения данного запроса.
1895 повідомлень
#13 років тому
1. Курсы валют нельзя хранить просто в таблице, все гораздо сложнее, курсы меняются ежедневно, нужно хранить курсы вместе с датой изменения курса, тоесть в таблице будет много записей чем просто несколько.Я думаю вы понимаете для чего, это нужно для получения любых значений любых дат, иначе информация будет терятся.
2. для удобства получения значения курса лучше написать функцию, а вывод информации из таблицы цен несомненно лучше сделать на вюхе или на хранимке.
принцип MVC применим к БД уже давно, в пхп оставьте только минимум, вся бизнес логика должна жить только на стороне БД, больше нигде
1649 повідомлень
#13 років тому
MMM_Corp, а более конкретно и доступными словами?
Есть способ лучше того что я выбрал?
3562 повідомлення
#13 років тому
Цитата ("MMM_Corp"):принцип MVC применим к БД уже давно, в пхп оставьте только минимум, вся бизнес логика должна жить только на стороне БД, больше нигдеРучки бы повыдергивал =)
1895 повідомлень
#13 років тому
Привожу простой пример, напр. на входе пользователь мог выбрать но не обьязательно цену+валюта, модель авто:PROCEDURE getcars (IN price1 int, IN valuta1 int, model1 int)
BEGIN
SET @query = 'SELECT field1 FROM test_table WHERE 1=1 '; -- широкий запрос
-- добавляем условия к широкому запросу если заданы
IF (price1 IS NOT NULL) and (valuta1 IS NOT NULL) Then
SET @query = CONCAT(@query, 'and price1 = ',price1 );
SET @query = CONCAT(@query, and 'valuta1 = ',valuta1 );
END IF;
IF model1 IS NOT NULL Then
SET @query = CONCAT(@query, 'AND model1 =' , model1 ');
END IF;
PREPARE stmt FROM @query;
EXECUTE stmt USING price1, valuta1, model1;
DEALLOCATE PREPARE stmt;
END
в пхп, или в любом другом языке тогда все что потребуется вызвать несколько строчек
1. подготовить параметры для хранимки, в разних яхыках это делается по разному примерно так:
query1.params(0).asinteger:=1000'; // price
query1.params(1).asinteger:=0; // valuta
query1.params(2).asinteger:=5; // model id
query1.StoreName:=getcars;
query1.execute;
вот простой пример как бизнес логика должна бить реализована красиво, только в БД, и не зависеть от клиента, ведь логика у нас в БД
Оффтопик
П.С. В мускуле, достаточно уродски сделаны хранимки, я привел простой пример, гораздо изящней и красивее это можно сделать в MsSQL
мускул должен бить версии не ниже 5.0.40 помоему!
мускул должен бить версии не ниже 5.0.40 помоему!
SmartDesign, если есть 1 база данных и напр. сайт, пару программ и т.д. то я бы выдёргивал руки за то что делают както по другому!)
1649 повідомлень
#13 років тому
MMM_Corp, и зачем тут так все усложнять? Просто что бы было круто?Например у меня в базе цена в одной валюте. При выводе я ее показываю во всех валютах. И это делается на PHP очень просто и красиво.
ПС: Я не понял что имеет общее моя темя с вашей процедурой

1322 повідомлення
#13 років тому
Цитата ("MMM_Corp"):вот простой пример как бизнес логика должна бить реализована красиво, только в БД, и не зависеть от клиента, ведь логика у нас в БД
Мнение мягко говоря спорное. Скажем так удел особого типа перфекционистов. Отладка сложных моментов будет сродни BDSM.
Если дико захотелось красоты и "клиентонезависимости" можно ORM.
1895 повідомлень
#13 років тому
Цитата ("WebDesignStudio"):Например у меня в базе цена в одной валюте. При выводе я ее показываю во всех валютах. И это делается на PHP очень просто и красиво.
ПС: Я не понял что имеет общее моя темя с вашей процедурой
хорошо объясняю: я привел пример как можно завернуть всего в 1 хранимку! целый блок выбора авто по критериям, расширил для примера, чтобы наглядно показать
пример включает выбор авто (если указали), выбор цени и валюты (если указали)
более того мой код будет гораздо проще вашего, видь такой подход (все через хранимки) исключает напр. SQL-injection, нет границ что будет в роли клиента (напр. 10 сайтов, 10 программ, и что в каждой менять код если мелочь какято поменяется в критериях выборки), можно отлаживать бизнес-логику прямо в менеджере БД, просто выполнив напр. код :
execete getcars 1,1, NULL;
здесь крутость не причем, это пример разработки промышленного и безопасного кода
ORM - зависим от платформи, обертки типа LINQ и т.д. это всеголиш обёрткы, важно что идет на БД
1649 повідомлень
#13 років тому
MMM_Corp, у меня все делается одним простым запросом. Для этого нужна хранимая процедура? Я думаю что нет. А делать вычисления на уровне БД не вижу смысла.Цитата ("MMM_Corp"):
хорошо объясняю: я привел приме
может пример хорош, но он не в теме, извините.
1322 повідомлення
#13 років тому
Цитата ("MMM_Corp"):ORM - зависим от платформи, обертки типа LINQ и т.д. это всеголиш обёрткы, важно что идет на БД
Можно сказать и обратное. Имея логику в базе - мы не спрыгнем на postgress или mssql. Имея ORM - это произойдет с меньшими усилиями.
Инъекций можно избежать используя запросы через myqsqli::prepare
Не вплетайте тут "промышленный код". До 10 сайтов - 10 программ тут доживает крайне малая часть проектов. И, думаю, исполнители их не задают таких вопросов на форуме.
Цитата:
Преждевременная оптимизация — это корень всех бед
3562 повідомлення
#13 років тому
Цитата ("MMM_Corp"):SmartDesign, если есть 1 база данных и напр. сайт, пару программ и т.д. то я бы выдёргивал руки за то что делают както по другому!)Я про фразу что _вся_ _бизнес_логика_ должна реализовываться на стороне БД. За это точно стрелять нужно. По поводу примера, нужно смотреть на частоту смены курсов, количеству товаров, частототу/объемы выборок и требования к точности.
Есть вариант что лучшим решением будет сортировать по хранимому полю "цена в у.е." чем пересчитывать на лету и т.д.
В общем к задачу нужно подходить комплексно, а радоваться тому что логику унесли в Базу Данных - не стоит =)
1649 повідомлень
#13 років тому
SmartDesign, таблица на данный момент имеет более 10 000 записей. Но думаю будет еще больше. Курсы как курсы. постоянно меняются.
16382 повідомлення
1649 повідомлень
#13 років тому
frig, знаю. И пока мой способ работает достаточно быстро. Возможно со временем придется что то другое придумать, поэтому я и решился создать эту тему.
16382 повідомлення
#13 років тому
Цитата ("MMM_Corp"):если есть 1 база данных и напр. сайт, пару программ и т.д. то я бы выдёргивал руки за то что делают както по другому!)
Предпочитаете давать прямой доступ к БД для удаленных клиентов?
Вообще не надо изобретать условия которых в задаче нет. Если бы в задаче был доступ и оттуда и отсюда - то над решением этой задачи и следовало бы работать. Даже в таком случае я бы предпочел все же API, а не вынесение логики в БД и прямой доступ к ней. А до тех пор пока таких задач нет - и решение такое ой как далеко от оптимального.
Оффтопик
WebDesignStudio, ваш способ это тот который я предложил, через case? 

1895 повідомлень
#13 років тому
Цитата ("frig"):Предпочитаете давать прямой доступ к БД для удаленных клиентов?
конечно, это вполне нормально на практике, но мало применимо к MySQL, он примитивен до ужаса, нет аудита и пр. нужного для этого, гляньте на MSQL, Oracle, вот там есть все что нужно
более того, защита должна строится именно на этом слое, на конечном барьере, можно написать безобразный пхп-код, но если БД защищена, то переживать нечего, проблема только в том что пхп - вещь примитивная как и мускул, вот поэтому и мешают в кашу логику и представление, хотя пхп уже давно оброс MVC фреймворками, и все в них говорит - разделяй и властвуй
не вижу ничего опасного в предоставлении прямого доступа к БД, с чего вы взяли что это опасно? конечно опасно если дать все права, они ведь для этого и разработаны, grant + stored proc = делают базу непробиваемой, говорю с личного опыта работы с большими проектами, просто нужно понимать что безопасность должна бить там где она необходима, а не на прослойках типа пхп, видь БД + пхп + браузер - это по сути трёхзвенка, хотя и в прикладном программирование разработка промежуточных серверов - не проблема, во всяком случаи БД - должна бить непробиваемой
16382 повідомлення
#13 років тому
Цитата ("MMM_Corp"):проблема только в том что пхп - вещь примитивная как и мускул
Угу. Расскажите это таким говносайтам как Вконтакте и Facebook. Откройте уже им наконец то глаза.
Цитата ("MMM_Corp"):
не вижу ничего опасного в предоставлении прямого доступа к БД, с чего вы взяли что это опасно?
Может быть я просто чего-то не знаю. Подскажите как реализовать подобные вещи
- Ограничение по количеству операций в секунду. От спаммеров, грабберов
- Отсылка уведомлений о подозрительной активности. Опять же если кто-то начинает много лишнего делать
- Идентификация клиентов. Анонимных в том числе
- Обработка текстов. Типографика, цензура
Хотя бы эти простые и необходимые вещи.
1649 повідомлень
#13 років тому
Цитата ("frig"):WebDesignStudio, ваш способ это тот который я предложил, через case?да
1895 повідомлень
#13 років тому
Оффтопик
Цитата ("frig"):
вы както агрессивно настроены, не знаю как они устроены, но как я уже писал MySQL - совсем не удачный выбор для нагруженных проектов, более того есть разные редакции мускула, есть такие вещи как кластеризация, репликации, наконец CISCO - оборудование для отказоустойчивости не только БД, но и других сервисов, все это есть, что же вы хотите от бесплатного мускула? всего и сразу ии еще на халяву? сами понимаете что все не так как кажется
Цитата ("frig"):
если вы занимались разработкой граберов/парсеров то должны понимать что защищаться бесполезно, всю информацию можно собрать, а там где чтото можно запостить - значит можно и заспамить
Цитата ("frig"):
отсылка куда? напр. админу в прямом эфире?
без проблем это делается в MSSQL/Postgree/Firebird, есть такая вещь как обратные вызовы процедур, в двух словах это звучит как: подписываемся на собитые, получают сигнал при его возникновении, в мускуле смотреть даже не охота, очень сомневаюсь что есть
Цитата ("frig"):
при прямом доступе логин+пароль нужно указывать обьязательно, для идентификации можно использовать логин/пароль/айпи/мак
Цитата ("frig"):
совершенно не проблема, почитайте про словари в БД, сразу отпадет этот вопрос, но помоему их нет в мускуле
Угу. Расскажите это таким говносайтам как Вконтакте и Facebook. Откройте уже им наконец то глаза.
вы както агрессивно настроены, не знаю как они устроены, но как я уже писал MySQL - совсем не удачный выбор для нагруженных проектов, более того есть разные редакции мускула, есть такие вещи как кластеризация, репликации, наконец CISCO - оборудование для отказоустойчивости не только БД, но и других сервисов, все это есть, что же вы хотите от бесплатного мускула? всего и сразу ии еще на халяву? сами понимаете что все не так как кажется
Цитата ("frig"):
Ограничение по количеству операций в секунду. От спаммеров, грабберов
если вы занимались разработкой граберов/парсеров то должны понимать что защищаться бесполезно, всю информацию можно собрать, а там где чтото можно запостить - значит можно и заспамить
Цитата ("frig"):
- Отсылка уведомлений о подозрительной активности. Опять же если кто-то начинает много лишнего делать
отсылка куда? напр. админу в прямом эфире?
без проблем это делается в MSSQL/Postgree/Firebird, есть такая вещь как обратные вызовы процедур, в двух словах это звучит как: подписываемся на собитые, получают сигнал при его возникновении, в мускуле смотреть даже не охота, очень сомневаюсь что есть
Цитата ("frig"):
- Идентификация клиентов. Анонимных в том числе
при прямом доступе логин+пароль нужно указывать обьязательно, для идентификации можно использовать логин/пароль/айпи/мак
Цитата ("frig"):
- Обработка текстов. Типографика, цензура
совершенно не проблема, почитайте про словари в БД, сразу отпадет этот вопрос, но помоему их нет в мускуле