2010-10-07 5 views
0

Я думаю, что мой вопрос лучше всего объяснить с помощью примера: Предположим, я хочу написать веб-сервер для потоковой передачи музыки. У меня есть следующие столбцы в таблице songs: |song_id|song_name|song_genre|song_length|artistmysql: как написать таблицу просмотров

Я хотел бы, чтобы позволить своим пользователям, чтобы сохранить плейлист, но я не хочу, чтобы мои плейлисты, которые будут определен в явном виде указать песни, которые находятся в списке воспроизведения, а что-то вроде «всех песен ringo starr», что означало бы, что когда новые композиции ringo starr добавляются в таблицу, плейлист будет автоматически их иметь. Фактически, что я хочу, это таблица под названием playlists, которая содержит список представлений mysql.

Самого наивный подход был бы просто иметь таблицу с именем playlists, и один из его столбцов будут называться playlist_query, который будет хранить для приведенного выше примера что-то вроде строки "select song_id from songs where artist='ringo starr'.

Это, конечно, невероятно неуверенно, но этого было бы достаточно, если бы не было лучшего решения, так как это приложение используется только внутри внутри нашей компании несколькими сотрудниками, которые являются хорошими программистами, которые знают свой путь вокруг mysql.

Итак, что вы предлагаете? пойти с этим уродливым решением, или есть какой-то более простой способ сделать это?

+0

Я не вижу ничего плохого в этом подходе. Что небезопасно? –

+0

@Jan - для общего использования, позволяя пользователям вставлять запросы, которые будут использоваться вашей БД, считается довольно неуверенным, я считаю: http://en.wikipedia.org/wiki/Sql_injection Предполагая, что мы знаем, что всем пользователям доверяют пользователей, кто-то может по-прежнему совершать ошибку, например, неправильно выполнить соединение (с условием объединения, которое всегда выполняется), в результате чего вы можете выбрать 1000 000 000 000 песен. – olamundo

+0

Просто сохраните «ringo starr» в таблице. Постройте остаток своего запроса в своем коде. Сделайте некоторое ускорение в поисковом запросе, и вы настроены –

ответ

1

Вы можете сохранить имя вида в таблице playlists вместо самого запроса.

Вам все равно придется создавать требуемые представления, и я не знаю, как это помогает вашей «проблеме безопасности».

Не могли бы вы рассказать о какой безопасности требуется?

1

Я бы определил список воспроизведения как список фильтров, в которых фильтр мог бы быть идентификатором песни, идентификатором исполнителя, названием песни, жанром ... Затем я вынул все песни для каждого фильтра, либо в один запрос, объединяющий файлы с простыми OR или используя UNION, если вы хотите, чтобы список воспроизведения находился в том же порядке, что и фильтры. Обратите внимание, что для получения результатов от UNION требуется порядка дополнительных запросов в порядке запросов, см. this answer.

Преимущества этого подхода:

  • не миллионы просмотров, чтобы управлять
  • нет запросов SQL, хранящихся в БД
  • довольно гибкая фильтрация

Правда, я не могу сказать, о производительности этого решения. Не должно быть слишком плохо.

Смежные вопросы