Сергей К.
1649 повідомлень
#13 років тому
Цитата ("Statukha"):
Я бы в запросе умножал цену на курс из таблицы курсов

у меня курсы хранятся в базе но там немного другая логика. Если понадобится, смогу использовать.
Цитата ("Statukha"):
Хотя я считаю что это не аккуратное решение т.к. при изменении соотношений курсов сортировка может оказаться не верной.

почему не аккуратное? При смене курса в запросов подставляются другие значения которые у меня уже есть, до выполнения данного запроса.
Николай М.
1895 повідомлень
#13 років тому
1. Курсы валют нельзя хранить просто в таблице, все гораздо сложнее, курсы меняются ежедневно, нужно хранить курсы вместе с датой изменения курса, тоесть в таблице будет много записей чем просто несколько.
Я думаю вы понимаете для чего, это нужно для получения любых значений любых дат, иначе информация будет терятся.
2. для удобства получения значения курса лучше написать функцию, а вывод информации из таблицы цен несомненно лучше сделать на вюхе или на хранимке.

принцип MVC применим к БД уже давно, в пхп оставьте только минимум, вся бизнес логика должна жить только на стороне БД, больше нигде
Сергей К.
1649 повідомлень
#13 років тому
MMM_Corp, а более конкретно и доступными словами?
Есть способ лучше того что я выбрал?
Андрей Халецкий
3562 повідомлення
#13 років тому
Цитата ("MMM_Corp"):
принцип MVC применим к БД уже давно, в пхп оставьте только минимум, вся бизнес логика должна жить только на стороне БД, больше нигде
Ручки бы повыдергивал =)
Юрий М.
228 повідомлень
#13 років тому
Как удачно зашел . Похожая проблема.
Friq - отписался в личку.
Николай М.
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 помоему!


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 повідомлення
#13 років тому
Оффтопик
Цитата ("WebDesignStudio"):
имеет более 10 000 записей

Это вообще не таблица, а так... Мелкая мелочь.
Сергей К.
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"):
Угу. Расскажите это таким говносайтам как Вконтакте и Facebook. Откройте уже им наконец то глаза.

вы както агрессивно настроены, не знаю как они устроены, но как я уже писал MySQL - совсем не удачный выбор для нагруженных проектов, более того есть разные редакции мускула, есть такие вещи как кластеризация, репликации, наконец CISCO - оборудование для отказоустойчивости не только БД, но и других сервисов, все это есть, что же вы хотите от бесплатного мускула? всего и сразу ии еще на халяву? сами понимаете что все не так как кажется

Цитата ("frig"):
Ограничение по количеству операций в секунду. От спаммеров, грабберов

если вы занимались разработкой граберов/парсеров то должны понимать что защищаться бесполезно, всю информацию можно собрать, а там где чтото можно запостить - значит можно и заспамить
Цитата ("frig"):
- Отсылка уведомлений о подозрительной активности. Опять же если кто-то начинает много лишнего делать

отсылка куда? напр. админу в прямом эфире?
без проблем это делается в MSSQL/Postgree/Firebird, есть такая вещь как обратные вызовы процедур, в двух словах это звучит как: подписываемся на собитые, получают сигнал при его возникновении, в мускуле смотреть даже не охота, очень сомневаюсь что есть
Цитата ("frig"):
- Идентификация клиентов. Анонимных в том числе

при прямом доступе логин+пароль нужно указывать обьязательно, для идентификации можно использовать логин/пароль/айпи/мак
Цитата ("frig"):
- Обработка текстов. Типографика, цензура

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