MySQL Design Patterns?

vovik

Новичок
Sender
Смотри, у нас две альтернативы.
По паттерну: кода меньше, код проще, работает быстрее. Меньше вероятность ошибки (как следствие того, что кода меньше и он проще).
На клиенте: Кода больше, работает медленнее, вероятность ошибки больше.

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


Wicked
Обсуждение конкретного паттерна - не сильное отдаление от темы. Разобрали его зато по полной :) Не пиво же обсуждаем. И тема вниз не падает.
 

Sender

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

надо определиться что я вляется клиентом, пользователь+браузер?


по сути мне еще пока что непонятно почему количество кода разное? при выводе цикл будет идти не по сформированным пустым данным, а по нужной последовательности, и будет идти проверка: нету инфы в массиве - значит пустота. То есть на этапе вывода будет реализовываться вариант 2 (без паттерна). чтобы не быть голословным:

выбираем все даты:
SELECT date FROM table WHERE date_format( date, '%Y' ) = date_format( NOW(), '%Y' )
загоняем в массив ассоциативный: $days[{day_of_year_events}] = 1

for( $i=1; $i<365; $i++)
{
проверка, есть ли $i в ключах массива, если есть - значит не выводим, если нету - выводим
}

вроде бы все...
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: Wicked
Таблица-итератор.
Нигде ничего подобного не видел, так что считаю это своим изобретением.

Объясню на более простом примере.
Допустим, у нас есть таблица с интервалами дат `range`.
id | date_start | date_end
1 | 2006-01-01 | 2006-01-19 (длина 19 дней)
2 | 2006-01-06 | 2006-01-20 (длина 15 дней)

А нам из нее надо получить все 19+15 промежуточных дат. Тогда мы создаем таблицу-итератор `iterator` с единственным полем `i` типа int. И заполняем ее 19-ю (max(15, 19) в данном случае) значениями от 0 до 18.
Тогда чтобы сгененировать интересующие нас даты, делаем следующий запрос:
[sql]SELECT
range.id, range.date_start + INTERVAL iterator.i DAY as `date`
FROM
range
INNER JOIN iterator ON (range.date_start + INTERVAL iterator.i DAY <= range.date_end)
order by id, `date`[/sql]
"И вуаля" &copy; я.
id | `date`
1 | 2006-01-01
1 | 2006-01-02
...
1 | 2006-01-18
1 | 2006-01-19
2 | 2006-01-06
2 | 2006-01-07
...
2 | 2006-01-19
2 | 2006-01-20
Ничаво, маленький, что у тебя одна ножка короче другой и маленький горбик. Зато у тебя есть блестящие костылики, которые мы будем называть "паттерны". А вот у злых мальчиков, которые смеются над тобой и пальцем показывают, таких красивых костыликов нету:
Код:
Welcome to psql 8.1.4, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit

test=# select date_start + i
test-# from (
test(#   select '2006-01-01'::date as date_start, '2006-01-19'::date as date_end
test(# ) as range, generate_series(0, 666) as iterator(i)
test-# where date_start + i <= date_end;
  ?column?
------------
 2006-01-01
 2006-01-02
 2006-01-03
 2006-01-04
 2006-01-05
 2006-01-06
 2006-01-07
 2006-01-08
 2006-01-09
 2006-01-10
 2006-01-11
 2006-01-12
 2006-01-13
 2006-01-14
 2006-01-15
 2006-01-16
 2006-01-17
 2006-01-18
 2006-01-19
(19 rows)
Если без поэзии, то нахрена городить в базе таблицу с абсолютно бесполезными данными, если эти данные элементарно можно сгенерировать при необходимости? Или Могучие Хранимые Процедуры в MySQL так и не научились возвращать наборы записей?..
 

vovik

Новичок
Автор оригинала: Sad Spirit
Если без поэзии, то нахрена городить в базе таблицу с абсолютно бесполезными данными, если эти данные элементарно можно сгенерировать при необходимости? Или Могучие Хранимые Процедуры в MySQL так и не научились возвращать наборы записей?..
Речь шла о паттерне. Который заключается в том, что некоторые задачи можно упростить, написав запрос, в котором используется непрерывная последовательность чисел. Какая разница, каким образом она формируется, с помощью таблички, подзапроса, доморощенной функции postgre или еще как-нибудь.

Или цель Вашего сообщения - показать все величие postgre по сравнению с жалким инвалидом мускулом ? Что ж, могу только посоветовать пройтись по всем темам в форуме "PHP & MySQL" и везде, где с помощью postgre запрос можно написать проще - обязательно об этом сообщить. А то ведь столько людей до сих пор пользуется разнообразными костыликами мускула.
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: vovik
Речь шла о паттерне. Который заключается в том, что некоторые задачи можно упростить, написав запрос, в котором используется непрерывная последовательность чисел. Какая разница, каким образом она формируется, с помощью таблички, подзапроса, доморощенной функции postgre или еще как-нибудь.
А я что --- возражаю против такого подхода? Я просто тонко намекнул, что все эти таблички и представления с кучей union появляются от бедности: от отсутствия встроенной функции, аналогичной generate_series(), и невозможности написать самому такую функцию. Потому что когда она есть, её использование раздуть до "паттерна" сложно, похожий пример с датами прямо таки в документации PostgreSQL есть.

Переведя пример на PHP, вы тут, грубо говоря, предлагаете вместо цикла использовать конструкцию
PHP:
include 'array.php';
где файл array.php пишется руками и имеет примерно такое содержимое:
PHP:
$ary = array();
$ary[] = 1;
$ary[] = 2;
// ...
$ary[] = 1000;
Если вы такой подход предложите в местном форуме "Вопросы по программированию на РНР", то на вас будут пальцем показывать... А в форуме про MySQL --- это целый "паттерн", гы-гы-гы.

Или цель Вашего сообщения - показать все величие postgre по сравнению с жалким инвалидом мускулом ? Что ж, могу только посоветовать пройтись по всем темам в форуме "PHP & MySQL" и везде, где с помощью postgre запрос можно написать проще - обязательно об этом сообщить. А то ведь столько людей до сих пор пользуется разнообразными костыликами мускула.
Костылями можно пользоваться с отвращением и хотеть от них избавиться. А я примеры такие обычно пишу в темы "как нам весело вместе прыгать на костылях!" и "как правильно покрасить костыли серебрянкой?". :-P
 

HEm

Сетевой бобер
предлагаю обсуждать один отдельный паттерн в отдельном топике, тут все-таки другая тема
 
Сверху