Риак ходил по ссылкам, как соединение? - PullRequest
7 голосов
/ 16 июня 2010

Я хочу сохранить изображения в базе данных NoSQL (<5 МБ) и связать их со статьями в другом сегменте.Какую скорость предлагает функция ходьбы по ссылкам Riak?Это как присоединение к СУРБД? </p>

Ответы [ 2 ]

11 голосов
/ 16 июня 2010

Ссылки совсем не похожи на JOIN (которые включают декартово произведение), но в некоторых смыслах их можно использовать для аналогичных целей.Они очень похожи на ссылки в HTML-документе.

При обходе ссылок вы либо начинаете с одного ключа, либо создаете задание сокращения карты, которое начинается с нескольких ключей.(Переход по ссылкам / обход является на самом деле особым случаем уменьшения карты.) Эти значения выбираются, их ссылки фильтруются по вашей спецификации (ведро, тег), а затем сопоставленные ссылки передаются на следующую фазу (или обратно наклиент).Конечно, все это выполняется параллельно (в отличие от JOIN) с высокой локальностью данных.

Кроме того, сокращение карты само по себе не медленное, у вас просто нет сложного планировщика запросов длясделать тяжелую работу за вас;вам нужно подумать о том, как вы будете запрашивать и организовывать ваши данные по мере необходимости.

7 голосов
/ 16 июня 2010

Подумайте об односторонних отношениях и так же быстро, как и обычные запросы.Не так медленно, как MapReduce.

From: http://seancribbs.com/tech/2010/02/06/why-riak-should-power-your-next-rails-app/

Первый способ, которым Riak справляется с этим, - это обход ссылок.Каждый элемент данных, хранящийся в Riak, может иметь односторонние отношения с другими данными через HTTP-заголовок Link.В каноническом примере вы знаете ключ группы, который вы сохранили в корзине «художников» (корзины Riak похожи на таблицы базы данных или корзины S3).Если этот исполнитель связан с его альбомами, которые, в свою очередь, связаны с треками в альбомах, вы можете найти все треки, созданные в одном запросе.Как я опишу в следующем разделе, это гораздо менее болезненно, чем JOIN в SQL, потому что каждый элемент обрабатывается независимо, а не таблица за раз.Вот как будет выглядеть этот запрос:

GET / raw / Artist / TheBeatles / album, , / дорожек, _, 1 «/ raw» является вершиной пространства имен URL, «художники »- это ведро,« TheBeatles »- исходный ключ объекта.Ниже приведены спецификации соответствия, по которым следует переходить по ссылкам, в виде сегмента, тега, троек, где подчеркивания соответствуют чему-либо.Третий параметр «keep» говорит, что возвращает результаты этого шага, то есть вы можете получить результаты любого шага в любой комбинации.Я не знаю о вас, но для меня это кажется более естественным, чем это:

ВЫБРАТЬ дорожки. * ИЗ дорожек INNER JOIN альбомы ON track.album_id = album.id INNER JOIN исполнители ON album.artist_id = исполнители.id WHERE Artist.name = "The Beatles" Предостережение ссылок заключается в том, что они по своей природе однонаправлены, но это может быть преодолено с небольшими трудностями в вашем приложении.Без ограничений ссылочной целостности в вашей базе данных SQL (которые ActiveRecord делала болезненными в прошлом), у вас нет надежной гарантии, что ваши DELETE или UPDATE в любом случае не приведут к тому, что строка станет осиротевшей.Мы в некотором роде избалованы, потому что ActiveRecord обрабатывает связывание ассоциаций автоматически.

Место, где действительно прослеживается функция перехода по ссылкам, - это самореференциальные и глубокие транзитивные отношения (представьте, что has_many: посредством большого текста).Поскольку вам не нужно создавать виртуальную таблицу с помощью JOIN и создавать псевдонимы разных версий одной и той же таблицы, вы можете легко выполнять такие операции, как графы социальных сетей (друзья друзей) и структуры данных, такие как деревья исписки.

...