MySQL последствия запроса «like» vs «join» - PullRequest
1 голос
/ 15 августа 2010

У меня есть две таблицы - видео и плейлисты

Обычно я бы создавал две соответствующие таблицы и таблицу с несколькими значениями для отношения 1-Много, например:

Videos = [pk, videoId, title и т. Д.]
Плейлисты = [pk, название и т. Д.]
Плейлисты_Видео = [VideosFK, ПлейлистFK]

В качестве альтернативы я думал о создании только двух таблиц и наличии поля в таблице списков воспроизведения, в котором есть строка VideoFK, разделенная запятыми. Мое приложение может «разделить» строку идентификатора, а затем извлечь элементы из кэша в соответствии с массивом идентификаторов, поэтому:

Videos = [pk, videoId, title и т. Д.]
Списки воспроизведения = [pk, videoIds, название и т. Д.]

где пример данных может выглядеть так:
Видео - 1, "abcd", заголовок, ...
Видео - 2, "Эфхх", другое название, ...
Видео - 3, "ijkl", и еще один, ...
Видео - 4, "MNOP", и еще один, ...

Плейлист - 1, "abcd, efgh, ijkl, mnop", ...

С этой структурой, если я хочу выполнить поиск по всем плейлистам, в которых есть видео, я мог бы настроить запрос, используя:

SELECT * 
 FROM Playlists 
WHERE videoIds like '%VideoID%';

и в противном случае я мог бы выполнить стандартный запрос соединения в традиционной модели:

SELECT * 
  FROM Playlists 
 WHERE pk in (SELECT PlaylistFK 
               FROM Playlists_Videos pv 
              WHERE VideoFK = '%videoPK%');

Хотя это работает, я хочу понять, во что я ввязываюсь, и мне любопытно, что MySQL делает на более низком уровне. Какие предостережения? Как это работает при масштабировании?

Спасибо

Редактировать - "videoIds" содержатся в varchar, который представляет собой строку с уникальными строковыми идентификаторами видео (идентификатор видео YouTube) через запятую

1 Ответ

2 голосов
/ 15 августа 2010

Подумайте об этом на мгновение:

WHERE videoIds like '%VideoID%';

Если значение videoid равно 1, это будет соответствовать:

  • 10
  • 11
  • 21
  • 31
  • и т.д ...

Для себя (и для нас) используйте настройку из трех таблиц:

  • Videos = [pk, videoId, title и т. Д.] *
  • Списки воспроизведения = [pk, название и т. Д.] *
  • Playlists_Videos = [VideosFK, PlaylistFK]
...