Отклоняет ли GraphQL необходимость в базах данных Graph? - PullRequest
0 голосов
/ 02 мая 2018

Большинство причин для использования графовой базы данных , по-видимому, заключаются в том, что реляционные базы данных работают медленно при выполнении запросов, подобных графу.

Однако, если я использую GraphQL с загрузчиком данных, все мои запросы сглаживаются и объединяются с использованием загрузчика данных, так что в итоге вы выполняете более простые запросы типа SELECT * FROM X вместо выполнения тяжелых соединений. Я мог бы даже использовать базу данных No-SQL, которая обычно довольно быстро справляется с такими плоскими запросами.

Если это так, то есть ли еще вариант использования баз данных Graph в сочетании с GraphQL? Neo4j, похоже, продвигает GraphQL. Я хотел бы понять преимущества, если таковые имеются.

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

GraphQL совсем не отменяет необходимость в базах данных графов, соединение очень мощное и делает GraphQL более производительным и мощным.

Вы упомянули:

Однако, если я использую GraphQL с загрузчиком данных, все мои запросы сглаживаются и объединяются с использованием загрузчика данных, так что в итоге вы выполняете более простые запросы типа SELECT * FROM X вместо каких-либо тяжелых объединений.

Это любопытный момент, потому что, если вы делаете много SELECT * FROM X и данные связаны с загрузчиком графиков, вы все еще выполняете объединения, вы просто делаете их в программном обеспечении вне базы данных, на другом уровне, с помощью других средств. Если даже этот программный уровень ничего не объединяет, то, что вы получаете, не делая объединения в базе данных, вы теряете, выполняя много запросов к базе данных, плюс накладные расходы дополнительного уровня. Посмотрите на профиль производительности последовательности этих отдельных "легко выбирает". Не выполняя эти объединения, вы, возможно, потеряли 30-летнюю ценность компьютерных исследований ... вместо того, чтобы позволить RDMBS оптимизировать путь выполнения запроса, программный уровень над ним форсирует конкретный путь, выбирая, какие из них выбираются для выполнения в каком порядке. , в это время.

Само собой разумеется, что если вам не нужно проходить какой-либо слой преобразования формализма (реляционный -> граф), вы окажетесь в лучшем положении. Поскольку этот перевод формализма - это цена, которую вы должны платить каждый раз, каждый запрос, без исключений. Это в некотором роде эквивалентно очевидному наблюдению, что базы данных XML будут лучше выполнять выражения XPath, чем реляционные базы данных, которые имеют некоторую абстракцию XPath сверху. Информатика этого проста; специализированные структуры данных для задачи обычно превосходят общие структуры данных, адаптированные к новой задаче.

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

Что если это не нативная графовая база данных? Если у вас есть абстракция графа поверх СУБД, а затем вы используете GraphQL для выполнения графовых запросов к , что , то вы сместились, где и как происходит обход графа, но вы все равно не можете получить вокруг того факта, что базовая структура данных (таблицы) не оптимизирована для этого, и вы переносите дополнительные затраты на перевод.

Так что по всем этим причинам нативная графовая база данных + GraphQL будет наиболее производительным вариантом, и в результате я пришел бы к выводу, что GraphQL не делает ненужными графические базы данных, напротив, он показывает, где они светятся.

Они как шоколад и арахисовое масло. Оба великолепны, но действительно фантастичны вместе. :)

0 голосов
/ 02 мая 2018

Да GraphQL позволяет вам выполнять какие-то графовые запросы, вы можете начать с одного объекта, а затем исследовать его окрестности и т. Д.

Но, если вам нужны показатели в графовых запросах, вам нужна база данных native .

С GraphQL вы даете много возможностей конечному пользователю. Он может сделать глубокий запрос к GraphQL.

Если у вас есть база данных SQL, у вас будет два варианта:

  • для вычисления большого SQL-запроса с большим количеством объединений (очень плохая идея)
  • делает много SQL-запросов, чтобы получить окрестности, ...

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

Более того, если вы используете GraphQL, вы рассматриваете свою модель данных как граф. Поэтому хранить его как график кажется очевидным и дает меньше головной боли :)

Я рекомендую вам прочитать этот пост: Мотивация для баз данных Native Graph


Ответ для Graph Loader

С Graph Loader вы будете выполнять множество небольших запросов (это второй вариант в моем ответе выше), но подождите, нет ... запись кэша есть.

Загрузчики графиков просто делают batch и cache.

Для сравнения:

  • вам нужно добавить другую библиотеку и реализовать логику (больше кода)
  • вам нужно управлять кешем. Есть много документации по этой теме. (больше памяти и сложности)
  • из-за SELECT * в загрузчиках вы всегда получите больше данных, чем необходимо. Пример: я хочу, чтобы id и name пользователя, а не его email, birthday, ... (меньше производительный)
  • ...
...