Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.11.2010, 14:56   #21
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

to Виталий Желтяков:
Хотелось бы поподробнее про "быдлокодерство" - какая связь между этим термином,и моим вариантом решения?
Надеюсь - не только из-за того,что моя реализация без ENUM?

Вообще вам совет - вы за словами своими следите!!!

В последнее время ваши посты содержат слишком много резких высказываний и неуместного сарказма.
Уж не знаю,что ,по-вашему, даёт вам право общаться с окружающими в таком тоне - но ваша наглость не делает вас профессионалом.

Цитата:
Написать системную функцию которая меняла бы структуру.
И чем это лучше удобного веб-интерфейса?
Цитата:
В чем преимущество использования ENUM:
- Значительно меньше кода,
- Надо делать 1 простой запрос (!),
- Никаких проблем с select-ми на форме;
Пустые слова - моё решение не подраумевает никаких сложностей ни с запросами,ни с select-ами,насчёт "значительно меньше кода" - врядли уж так значительно.

Кстати,насчет скорости запросов:
Гипотетический вариант - каждая статья имеет 10 категорий.
Задача - выбрать ID статей,относящихся к категории с ID 22.
Мой вариант:
Цитата:
SELECT `article_id` FROM `article_categories` WHERE `category_id` = '22'
Ваш вариант (имеем для каждой статьи 10 ENUM-полей с категориями - даже писать такое смешно....):
Цитата:
SELECT `article_id` FROM `articles`
WHERE `category_1` = '22'
OR `category_2` = '22'
OR `category_3` = '22'
OR `category_4` = '22'
OR `category_5` = '22'
OR `category_6` = '22'
OR `category_7` = '22'
OR `category_8` = '22'
OR `category_9` = '22'
OR `category_10` = '22'
Я очень-очень-очень сильно сомневаюсь,что ваш запрос будет работать значительно быстрее.

Цитата:
Под капотом много поддерживающего кода (например, вывод select в форме).
В вашем случае для редактирования категорий к определённой статье select-ы не понадобятся???
Само будет всё редактироваться???
Уличная магия???

Цитата:
Почитайте документацию по MySQL.
Почитаем,не гордые..)))
7.1.2.1 Характеристики статической таблицы (с фиксированной длиной)
Цитата:
Это формат, принятый по умолчанию. Он используется, когда таблица не содержит столбцов VARCHAR, BLOB или TEXT.
7.1.2.2 Характеристики динамических таблиц
Цитата:
Данный формат используется для таблиц, которые содержат столбцы VARCHAR, BLOB или TEXT, а также если таблица была создана с параметром ROW_FORMAT=dynamic.
И с какого боку тут ваш ENUM ,и с чего моя таблица,имеющая типы полей INT(другие тут просто не нужны) вдруг стала ДИНАМИЧЕСКОЙ???

Читайте больше хороших книг по программированию - это должно помочь.
Andkorol вне форума Ответить с цитированием
Старый 17.11.2010, 15:21   #22
Nikolai_
Пользователь
 
Регистрация: 27.08.2010
Сообщений: 16
По умолчанию

Да, Andkorol, Вы правы. Я изначально спроектировал слишком громоздкий и недружественный пользователю интерфейс для выбора категорий. Предполагалось, что будет текстовое поле и ниже выпадающий список категорий. При выборе категории по событию онклик в текстовое поле вставлялся бы id очередной категории через запятую, а потом все это обрабатывалось бы как мы с Вами разбирали выше. Но мне нигде не попадалось решение подобной проблемы или хотя бы пример, поэтому пришлось придумывать самому и так извращаться.

Предложенный Вами вариант интерфейса очень хорош и весьма дружественен для пользователя. Его я использую в своем проекте. Правда придется решить некоторые задачи, с которыми ранее я никогда не сталкивался. Надеюсь, мне помогут советами.

А пока хотел бы попросить Вас, Andkorol, пояснить в общих словах некоторые пункты в предложенном Вами решении. А конкретней:

Что имелось ввиду под словами «также можно удаление реализовать при помощи checkbox-ов»? В смысле при редактировании будут выводиться имеющиеся категории, а напротив них чекбоксы, отметив которые можно удалить соотв. категории?

А что имелось ввиду под этими словами «Дополнительно,при помощи JavaScript делаем возможность добавлять дополнительные списки(select-ы) - чтобы добавлять новые категории.»?
Nikolai_ вне форума Ответить с цитированием
Старый 17.11.2010, 16:31   #23
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Что имелось ввиду под словами «также можно удаление реализовать при помощи checkbox-ов»? В смысле при редактировании будут выводиться имеющиеся категории, а напротив них чекбоксы, отметив которые можно удалить соотв. категории?
Например,у вас есть статья,она имеет 5 категорий.
Для редактирования этих категорий вы создаёте 5 списков select, в каждом из которых уже стоит нужная категория(SELECTED).
Рядом с каждым списком находится checkbox "Удалить".
Допустим,вам более не нужны 5 категорий для этой статьи,достаточно 4-х.
Вы отредактировали 4 из них,как вам нужно,а последнюю(например,на самом деле - не важно какую) помечаете checkbox-ом как "необходимо удалить".
После сабмита формы - проверяется массив значений checkbox-ов - и отмеченные ID категорий удаляются(только для данной статьи).
Альтернатива (чтоб не морочиться с checkbox-ами) - в списки добавить значение DELETE - и если для данной категории будет выбрано оно - эту категорию удаляем(только для данной статьи).

Цитата:
А что имелось ввиду под этими словами «Дополнительно,при помощи JavaScript делаем возможность добавлять дополнительные списки(select-ы) - чтобы добавлять новые категории.»?
Имелась ввиду возможность реализации при помощи JS добавления дополнительных select-ов в форму - чтобы увеличить количество категорий для определённой статьи.
Примеры реализации:
Добавление полей в форму
Добавление полей в форму 2
Альтернатива этому - если есть что-то типа "Настроек Сайта",где редактируются базовые настройки сайта(типа - кол-во статей на странице,кол-во результатов поиска на странице,кол-во комментариев и прочее) - так вот в таком месте можно сделать возможность задавать/изменять допустимое кол-во категорий для статей.
Вариант с JS - более сложный,зато и более гибкий.
Andkorol вне форума Ответить с цитированием
Старый 17.11.2010, 16:47   #24
Nikolai_
Пользователь
 
Регистрация: 27.08.2010
Сообщений: 16
По умолчанию

Цитата:
Сообщение от Andkorol Посмотреть сообщение
Имелась ввиду возможность реализации при помощи JS добавления дополнительных select-ов в форму - чтобы увеличить количество категорий для определённой статьи.
Примеры реализации:
Добавление полей в форму
Добавление полей в форму 2
Альтернатива этому - если есть что-то типа "Настроек Сайта",где редактируются базовые настройки сайта(типа - кол-во статей на странице,кол-во результатов поиска на странице,кол-во комментариев и прочее) - так вот в таком месте можно сделать возможность задавать/изменять допустимое кол-во категорий для статей.
Вариант с JS - более сложный,зато и более гибкий.
А... понял теперь. Я тоже сегодня думал над этим нюансом. Мне пришла в голову мысль использовать здесь аякс, тем более что у меня есть уже готовое решение. Принцип такой - есть выпадающий список, над ним надпись "Выберите категорию (не обязательно, максимум 5 шт.)". Выбираем категорию, ниже появляется еще один выпад. список, выбираем в нем категорию - ниже появляется еще список и т.д. до 5 списков. Как Вы думаете - это вполне приемлимое решение?
Nikolai_ вне форума Ответить с цитированием
Старый 17.11.2010, 17:08   #25
Виталий Желтяков
Старожил
 
Аватар для Виталий Желтяков
 
Регистрация: 19.04.2010
Сообщений: 2,702
По умолчанию

Цитата:
Вообще вам совет - вы за словами своими следите!!!

В последнее время ваши посты содержат слишком много резких высказываний и неуместного сарказма.
У меня неуместный сарказм вызывает тупоё забивательство на вещи, которые Вы просто не понимаете.
Цитата:
И чем это лучше удобного веб-интерфейса?
Выдёргивание значений из нескольких таблиц - это удобно?

Вся проблема в том, что Вы не понимаете суть типа поля ENUM и не знаете преимущество статических таблиц. К документации как Я понимаю Вас посылать бесполезно.
ENUM - хранит значение в виде tiny - числа, но выводит и записывает значение в виде строки (или другого простого типа).
От сюда:
- Проблемы с select просто нет, т.к. можно сразу выводить и вводить название категорий.
- Нет дополнительных запросов дабы узнать, что за категория.

Цитата:
Ваш вариант (имеем для каждой статьи 10 ENUM-полей с категориями - даже писать такое смешно....):
А запрос, то один... А у Вас должно быть два запроса. Чтобы узнать номер категории и выдернуть данные по номеру категории.
Цитата:
И с какого боку тут ваш ENUM ,и с чего моя таблица,имеющая типы полей INT(другие тут просто не нужны) вдруг стала ДИНАМИЧЕСКОЙ???
У Вас две таблицы - одна статическая, а другая динамическая. Для вашей схемы надо использовать 2 таблицы - что менее оптимально.

В догонку:
- Проблема получения списка категорий для моего варианта может легко решаться при помощи сериальзованного массива из файла.

Последний раз редактировалось Виталий Желтяков; 17.11.2010 в 17:12. Причина: Добавление информации
Виталий Желтяков вне форума Ответить с цитированием
Старый 17.11.2010, 17:38   #26
ssdm
Форумчанин
 
Регистрация: 20.05.2009
Сообщений: 506
По умолчанию

to Виталий Желтяков
На мой вопрос ответите ?
Цитата:
Теперь давайте поподробнее, то есть вы предлагаете сделать таблицу articles такой структуры : id,cat_id_1,cat_id_2,cat_id_3,cat_i d_4,cat_id_5,<any_other_fields> (тут мы учтем что автор указал что одна статья может принадлежать максимум пяти категориям)
Вот приведите мне пример запроса который найдет статьи принадлежащий категории ну например 4 , 6 , 1 ?
ssdm вне форума Ответить с цитированием
Старый 17.11.2010, 18:55   #27
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от Nikolai_ Посмотреть сообщение
Как Вы думаете - это вполне приемлимое решение?
Вполне - в этом случае приемлимо любое решение,предоставляющее нужных функционал.


Цитата:
Сообщение от Виталий Желтяков Посмотреть сообщение
У меня неуместный сарказм вызывает тупоё забивательство на вещи, которые Вы просто не понимаете.
Советом моим всё-таки воспользуйтесь,потому что когда-нибудь вы вот так по привычке нахамите кому-то лично,от чего и пострадаете.
Вы можете любым способом тешить своё ЧСВ - только помните,что всегда есть разница между тем,кем вы себя считаете - и тем,кем вы являетесь на самом деле.
Цитата:
Выдёргивание значений из нескольких таблиц - это удобно?
Да так уж прямо и говорите - "аж из целых двух таблиц"...

Цитата:
Вся проблема в том, что Вы не понимаете суть типа поля ENUM и не знаете преимущество статических таблиц. К документации как Я понимаю Вас посылать бесполезно.
Я привёл вам выдержки из документации по поводу статических/динамических таблиц - и задал вопрос по этому поводу.Вы отвечаете только на "удобные" вопросы?
По поводу "преимущества статических таблиц" - в вашем-то случае это при чём?
Вы же прямо в `articles` свои ENUM-ы собрались лепить,а она явно динамическая...
Цитата:
В догонку:
- Проблема получения списка категорий для моего варианта может легко решаться при помощи сериальзованного массива из файла.
В догонку : не вижу ни одной причины,по которой этот вариант не подошел бы для моего варианта...

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

Пока же от вас сколь-либо окончательно оформленного варианта не поступило,ну или хотя бы фрагмента реализации - дабы не быть голословным.
Только "белый шум"...
Andkorol вне форума Ответить с цитированием
Старый 18.11.2010, 13:35   #28
Виталий Желтяков
Старожил
 
Аватар для Виталий Желтяков
 
Регистрация: 19.04.2010
Сообщений: 2,702
По умолчанию

Надоели вы мене все...
Ну, так по порядку:
- Создаем таблицу:
+ id - int(9) - auto_increment
+ name - char(30)
+ author - char(20)
+ link - char(20)
+ category1 - enum('Категория 1', 'Категория 2', 'Категория 3', 'Категория 4', 'Категория 5')
+ category2 - enum('Категория 1', 'Категория 2', 'Категория 3', 'Категория 4', 'Категория 5')
+ category3 - enum('Категория 1', 'Категория 2', 'Категория 3', 'Категория 4', 'Категория 5')
+ category4 - enum('Категория 1', 'Категория 2', 'Категория 3', 'Категория 4', 'Категория 5')
+ category5 - enum('Категория 1', 'Категория 2', 'Категория 3', 'Категория 4', 'Категория 5')
Она статическая.
- Запрос на выбор одной категории:
Код:
$query = "SELECT * FROM `articles` WHERE `name`='{$id}' LIMIT 1";
$sql = mysql_query($query);
if (mysql_num_rows($sql) == 1) {
$row = mysql_fetch_assoc($sql);
if (file_exists('articles/'.$row['link'].'.html')) {
$content =  file_get_contents('articles/'.$row['link'].'.html');
// Удаляем окончание строк и файла
$content = ereg_replace("\n","",$content);
// Вывод статьи
echo $content;
// Вывод категорий
$cat = '';
for ($i=1; $i<=5; ++$i) {
if ($row['category'+i] != '') {
$cat .= $row['category'+i] + ' ';
}
}
echo $cat;
}
}
- Поиск статьи по трём категориям:
Код:
$query = "SELECT * FROM `articles` 
WHERE (`category1` IN ('{$id1}','{$id2}','{$id3}')) 
OR (`category2` IN ('{$id1}','{$id2}','{$id3}')) 
OR (`category3` IN ('{$id1}','{$id2}','{$id3}')) 
OR (`category4` IN ('{$id1}','{$id2}','{$id3}')) 
OR (`category5` IN ('{$id1}','{$id2}','{$id3}'))";
$sql = mysql_query($query);
if (mysql_num_rows($sql) == 1) {
$row = mysql_fetch_assoc($sql);
if (file_exists('articles/'.$row['link'].'.html')) {
$content =  file_get_contents('articles/'.$row['link'].'.html');
// Удаляем окончание строк и файла
$content = ereg_replace("\n","",$content);
// Вывод статьи
echo $content;
// Вывод категорий
$cat = '';
for ($i=1; $i<=5; ++$i) {
if ($row['category'+i] != '') {
$cat .= $row['category'+i] + ' ';
}
}
echo $cat;
}
}
- Прошу отметить два важных момента:
+ Выполняется один запрос;
+ Нет никаких проблем с select-ами. В моём случаи можно даже использовать Like запросы напрямую.

Теперь по комментариям:
Цитата:
Вы можете любым способом тешить своё ЧСВ - только помните,что всегда есть разница между тем,кем вы себя считаете - и тем,кем вы являетесь на самом деле.
Если Я вижу плохой код, то Я его называю плохим кодом. Вы же вместо того, что бы задуматься о правильности чужого кода начинаете яростно доказывать правоту своего кода. Поэтому Вам и хамят.
Цитата:
Да так уж прямо и говорите - "аж из целых двух таблиц"...
А давайте поговорим о цифрах? Мой код с ростом числа статей и количества категорий будет выдавать примерно одно и тоже время. Ваш же код с ростом количества категорий будет увеличиваться на время поиска этой категории. Если категорий штук 5 разницы будет никакой, а при 100 разница во времени будет большая.
Цитата:
Вы же прямо в `articles` свои ENUM-ы собрались лепить,а она явно динамическая...
Цитата:
не вижу ни одной причины,по которой этот вариант не подошел бы для моего варианта...
Спорить не буду, это прекрасно применимо и к вашему случаю. По поводу таблицы см. код выше.
Цитата:
Отказ от простого и удобного функционала в угоду "гипотетической" экономии ресурсов сервера - это лично ваше дело,в своих проектах поступайте как вам угодно.
Возня с select-ами и двойные запросы - это удобный функционал?
Мой вариант даже на порядок легче редактировать через phpmyadmin, т.к. категории обозначаются не в виде цифр, значения которых надо смотреть в другой таблице, а в виде списка.
Да, это личное дело каждого как программировать, но надо программировать оптимально и красиво, а не в лоб, как Вы это делаете.
Да, ваш пример полностью подходит под третью нормальную форму, логичен и достаточно прост для понимания, но он не использует ресурсы и возможности системы на полную. Это как ездить на велосипеде, только из-за того, что вы на нём научились ездить. А машины называть "отродьми зла".
Тут самое противное, что Вы даже не хотите менять точку зрения, если вам указали ваши ошибки.
Цитата:
На мой вопрос ответите ?
Пример в кодах.

В догонку:
- Оба наших примера можно сильно ускорить при использовании memcached, но это отдельный разговор.

Последний раз редактировалось Виталий Желтяков; 18.11.2010 в 13:39.
Виталий Желтяков вне форума Ответить с цитированием
Старый 18.11.2010, 13:44   #29
ssdm
Форумчанин
 
Регистрация: 20.05.2009
Сообщений: 506
По умолчанию

Цитата:
$query = "SELECT * FROM `articles`
WHERE (`category1` IN ('{$id1}','{$id2}','{$id3}'))
OR (`category2` IN ('{$id1}','{$id2}','{$id3}'))
OR (`category3` IN ('{$id1}','{$id2}','{$id3}'))
OR (`category4` IN ('{$id1}','{$id2}','{$id3}'))
OR (`category5` IN ('{$id1}','{$id2}','{$id3}'))";
Неправильно.
Нужно найти статьи , где каждая статья принадлежит категории трем определённым категориям.
Вы наверное недоконца поняли что я от вас просил.
А потом я вам приведу пример такого запроса для схемы БД ,что Androkol привел. Тогда и сравнить можно чей запрос быстрее выполнится.

Цитата:
Запрос на выбор одной категории:
Код:


$query = "SELECT * FROM `articles` WHERE `name`='{$id}' LIMIT 1";
$sql = mysql_query($query);
if (mysql_num_rows($sql) == 1) {
$row = mysql_fetch_assoc($sql);
if (file_exists('articles/'.$row['link'].'.html')) {
$content = file_get_contents('articles/'.$row['link'].'.html');
// Удаляем окончание строк и файла
$content = ereg_replace("\n","",$content);
// Вывод статьи
echo $content;
// Вывод категорий
$cat = '';
for ($i=1; $i<=5; ++$i) {
if ($row['category'+i] != '') {
$cat .= $row['category'+i] + ' ';
}
}
echo $cat;
}
}
Это бред какой-то.
Цитата:
Она статическая.
- ведь уже выяснили что не статическая.
Цитата:
Выполняется один запрос;
-
Цитата:
select * from articles where id in (select aticle_id from cat_at where cat_id in (<cat_id_1>,..,<cat_id_n> ) )
<cat_id_i> - айдишки нужных категорий.
Тоже один запрос.

Последний раз редактировалось ssdm; 18.11.2010 в 14:07. Причина: UPD
ssdm вне форума Ответить с цитированием
Старый 18.11.2010, 14:51   #30
Виталий Желтяков
Старожил
 
Аватар для Виталий Желтяков
 
Регистрация: 19.04.2010
Сообщений: 2,702
По умолчанию

Цитата:
Нужно найти статьи , где каждая статья принадлежит категории трем определённым категориям.
Вы наверное недоконца поняли что я от вас просил.
Этот вопрос решается заменой OR на AND и добавлением жесткой упорядочености категорий при добавлении статьи.
Цитата:
Это бред какой-то.
По чему? Выбор статьи по её названию и вывод её из файла. Или Вы делаете как-то по другому?
Цитата:
ведь уже выяснили что не статическая.
Посмотрите снова приведённую мной таблицу.
Цитата:
<cat_id_i> - айдишки нужных категорий.
Тоже один запрос.
А откуда id категорий возьмём? Или это "уличная магия"...
Сначала получаем id, потом саму статью - два запроса.
Виталий Желтяков вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
переход статей timon777777 PHP 9 27.06.2010 23:16