В этой статье мы рассмотрим концепцию графовых таблиц в SQL Server и сравним их с реляционными аналогами. Графовые таблицы предназначены для решения конкретных запросов, что делает их ценным инструментом в сценарии базы данных фильмов.
Запрос актеров в фильме
Давайте начнем с ответа на вопрос: “Кто является актерами в этом фильме?” В реляционной базе данных мы обычно используем простое объединение двух таблиц:
SELECT c.actor_name
FROM movies a, moviesactor b, actor c
WHERE a.MovieId = b.movieid
AND b.actorid = c.ActorID
AND a.Movie_Title = 'Jurassic Park'
Однако с графовыми таблицами запрос становится более простым:
SELECT p.personname
FROM dbo.personnode p, movienode m, moviesactorlink a
WHERE MATCH(m-(a)->p)
AND m.movietitle = 'Jurassic Park'
Поиск самого продуктивного актера
Затем давайте определим самого продуктивного актера согласно набору данных. В реляционной базе данных мы бы использовали следующий запрос:
SELECT TOP 10 c.actor_name, COUNT(1) AS moviesactedin
FROM movies a, moviesactor b, actor c
WHERE a.MovieId = b.movieid
AND b.actorid = c.ActorID
GROUP BY c.actor_name
ORDER BY moviesactedin DESC
С графовыми таблицами запрос упрощается:
SELECT TOP 10 p.personname, COUNT(1) AS moviesactedin
FROM dbo.personnode p, movienode m, moviesactorlink a
WHERE MATCH(m-(a)->p)
GROUP BY p.personname
ORDER BY moviesactedin DESC
Актеры, которые являются режиссерами
Теперь давайте найдем актеров, которые также являются режиссерами. В реляционной базе данных мы бы использовали следующий запрос:
SELECT c.actor_name, a.Movie_Title
FROM movies a
INNER JOIN moviesactor b ON a.MovieId = b.movieid
INNER JOIN actor c ON b.actorid = c.ActorID
INNER JOIN MoviesDirector d ON a.MovieId = d.movieid
INNER JOIN director e ON d.directorid = e.directorid
AND e.director_name = c.actor_name
С графовыми таблицами запрос становится:
SELECT p1.personname, m.movietitle
FROM personnode p1, movienode m, moviesactorlink a, moviesdirectorlink d
WHERE MATCH(m-(d)->p1 AND m-(a)->p1)
Преимущества графовых таблиц
Графовые таблицы предлагают несколько преимуществ по сравнению с традиционными реляционными таблицами:
- Меньшее количество таблиц
- Легко писать запросы с меньшим количеством объединений
В то время как таблицы узлов обычно имеют оператор поиска, таблицы ребер сканируются, так как в настоящее время невозможно создать индекс на идентификаторе ребра.
В следующей статье мы рассмотрим наиболее полезную функцию графовых таблиц – кратчайший путь. Следите за обновлениями!
Спасибо за чтение!