Должен ли я обрабатывать эту конструкцию строки HTML с помощью пользовательской функции Oracle или PHP? - PullRequest
0 голосов
/ 07 декабря 2010

Реализуя код из этого вопроса в своем проекте, я понял, что есть 3 способа добиться чего-то, но я понятия не имею, какой из них лучше.Есть ли снова исполнение с использованием одного над другим?Стоит ли эта производительность более сложной реализации?Это то, что я хочу знать.

Хотя я не уточнил, этот вопрос касался выбора информации о фильме из таблицы и объединения каждого жанра в один столбец, разделенный запятыми.Теперь мне нужно, чтобы эти жанры были кликабельны в моем коде, чтобы я мог фильтровать по жанру, по которому щелкнули.

Я думал о трех способах сделать это:

Решение 1)

Используйте 1 запрос SELECT и функцию по этому другому вопросу, кроме использования PHP для построения строки HTML.Примерно так:

$genres = explode(',', $info['GENRES']);
$count = count($genres);

for($i = 0; $i < $count; $i++) {
    $genres[$i] = '<a href="#">'.$genres[$i].'</a>';
}

$info['GENRES'] = implode(' | ', $genres);

Затем я понял, что мне не хватает идентификатора жанра, поэтому я могу легко создать ссылку для фильтрации по этому жанру, и я подумал об изменении функции Oracle, чтобы включить ее.Как?Создавая строку JSON (т. Е. {"1":"Action","2":"Crime","5":"Thriller"}, функция может быть легко изменена для этого), можно легко адаптировать приведенный выше код соответствующим образом.

Решение 2)

Используйте 2 оператора SELECT и полностью игнорируйте функцию по этому другому вопросу.Один запрос для выбора информации о фильме, другой для выбора всех жанров (идентификатор и имя), связанных с этим фильмом.Тогда PHP сделает все остальное для построения строки кода HTML.

Решение 3)

Просто используйте 1 запрос SELECT и функцию Oracle, адаптированную для построения всей строки путемсам.Это значит, что PHP-код будет таким же простым, как выполнение оператора SQL.Функция Oracle подготовила бы всю строку HTML.

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

Тем не менее, давайте предположим, что это возможно, я верю, что это так.

Какое решение мне выбрать?

Есть ли в этой ситуации какая-либо причина, чтобы функция Oracle выполняла всю работу (или наоборот)?Учитывая это, я должен пойти с решением 3 или решением 1/2?

Если решение 1/2 - лучший путь, какой путь я должен пойти?Решение 1 имеет 1 SELECT в коде PHP, но другой в функции Oracle.Решение 2 имеет 2 SELECT в коде PHP.Есть ли прирост производительности одного над другим или они в основном одинаковы?Если да, какой из них лучше?

Решение 1 имеет более простой код PHP, но вводит немного более сложный код для функции Oracle.С другой стороны, решение 2 вообще не имеет кода функции Oracle, и код PHP будет увеличиваться в размере / сложности, хотя и ненамного.

Я склонен к решению 1, но хотел бы услышать вашемысли.

Ответы [ 2 ]

1 голос
/ 08 декабря 2010

Могу ли я предложить другой вариант полностью?

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

SELECT MOVIE_ID, CURSOR( 
    SELECT  MOVIE_TO_GENRE_TABLE.GENRE_ID 
    FROM    MOVIE_TO_GENRE_TABLE 
    WHERE   MOVIE_TO_GENRE_TABLE.MOVIE_ID = MOVIE_TABLE.MOVIE_ID
  ) as genre_cursor
FROM MOVIE_TABLE
WHERE ....

Делая это, вы получаете один запрос (одно попадание в базу данных), который возвращает все необходимые вам данные. Тогда вы можете сделать так, чтобы PHP генерировал HTML, что он действительно должен делать. Нет функций PL / SQL (которые могут серьезно повлиять на производительность), а также вы не нормализуете и не нормализуете данные.

1 голос
/ 08 декабря 2010

Мой голос за решение № 2.Да, у вас будет больше фактического поиска данных, но ваши данные используются гораздо более нормализованным способом.Ничто не мешает вам создать массив из второго поиска и создать список Comma-Sep с explode().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...