devilsD
@devilsD

Как лучше спроектировать базу данных для лучшей производительности?

Вопрос по части производительности и использование индексов.
Есть таблица FILMS (id, title, rating)
У фильмов есть 2 типа фильтров: жанр и страна; Соостветсвенно фильм может иметь несколько жанров и несклько стран. При фильтрации должно искать фильмы где есть хоть одно совпадение по паре жанр и страна.
Отсюда 2 варианта реализации структуры:
1) Создать 2 таблицы GENRE и COUNTRY и 2 промежуточные таблицы. Если задавать поиск зная ИД стран и жанров, и искать только по промежуточной таблице:
SELECT * FORM films f 
JOIN genre_film g ON(g.film_id = f.id ) WHERE g.genre_id IN(1,2,3)
JOIN country_film c ON(c.film_id = f.id ) WHERE c.country_id IN(1,2,3)


2) Сделать одну таблицу PARAMS со столбцом TYPE в котором будет указан какого рода это параметр (страна или жанр) и 1й промежуточной таблицей. Тут возможно еще будет уместным составной индекс по полям film_id и type.
Тут тоже поиск только про промежуточной таблице.
SELECT * FORM films f 
JOIN param_film p ON(p.film_id = f.id ) 
WHERE (p.param_id IN(1,2,3) AND p.type = `country`) AND (p.param_id IN(4,5,6) AND p.type = `genre`)

колонка TYPE будет не в промежуточной таблице, указал ее в запросе для упрощения примера, т.к фильтре вероятно будет задействована основная таблица с параметрами.
  • Вопрос задан
  • 193 просмотра
Пригласить эксперта
Ответы на вопрос 2
Stalker_RED
@Stalker_RED
Первый будет быстрее почти наверняка.
Но в идеале надо бы провести тесты на данных примерно такого объема, какой будет у вас в итоге.
Ответ написан
Комментировать
@res2001
Developer, ex-admin
Варианты суть одно и то же, а по тому и производительность будет примерно одинакова.
Только во втором варианте, надо использовать, конечно, не текстовое сравнение - используйте справочник стран и жанров, и ищите по ID стран и жанров.
Я бы выбрал второй вариант, т.к. таблиц меньше. Но в первом варианте, запросы будут более понятными.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы