2016-07-09 7 views
0

Учитывая ElasticSearch NoSQL db, я пытаюсь выяснить, как наилучшим образом моделировать данные социальных отношений (да, график db будет лучшим инструментом для работы, но в моей текущей ситуации этот выбор может быть навязан мне) ,Как смоделировать социальные соединения в ElasticSearch?

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

Значительно упрощенная версия моих требований заключается в следующем:

  • Люди имеют идентификаторы, имена и места работы (они не могли бы иметь место работы)
  • Люди могут иметь дружеские отношения с другими людьми (и дата создания дружбы)
  • Люди могут блокировать других людей, разговаривать с ними (вопросы направленность, так как только тот, кто блокировал может разблокировать)
  • Люди могут работать на том же рабочем месте

вещей, которые мы, скорее всего, запрос:

  • Дайте мне все люди, которых я дружу с (учитывая мой ID)
  • Дайте мне все люди, с которыми я работаю (учитывая мой ID)
  • Дайте мне союз из вышеперечисленных 2, а также имена и идентификаторы их рабочих мест, но не те, кого я заблокировал или кто заблокировал меня.
  • Дайте мне всех друзей, у которых есть рабочее место в городе, где я работаю.

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

Документация говорит мне, что ElasticSearch не имеет объединений. Он имеет вложенные объекты и отношения родитель-ребенок, но ни одна из них не кажется подходящей для дружеских отношений между людьми; оба вложенных объекта и родитель-ребенок имеют скрытую концепцию единоличного владения ... если я не начну дублировать данные людей повсюду, как в объектах других людей (для друзей и для заблокированных), так и на рабочих местах. Это, конечно же, вводит проблему сохранения данных в соответствии с тем, что изменяющиеся данные людей должны изменять их дублированные данные повсюду, и удаление отношений дружбы должно удалить другую сторону этих отношений с другим человеком. Это также вызывает проблему транзакций, поскольку я слышал, что поддержка транзакций по различным документам не поддерживается.

Помимо денормализации и дублирования или соединения на стороне приложения, отличного от db, существуют ли какие-либо лучшие способы (помимо использования другой БД), чтобы моделировать это разумным способом, который проще запросить?

ответ

1

Пример упрощенной JSON с некоторыми пояснениями после нее:

{ "типа": "человек", "идентификатор": 1, "название" : "InverseFalcon", "рабочее место": "StackOverflow" , "friend_ids": [3,4,19], "blocked_ids": [45,24], "blocked_by_ids": [5] }

Это должно быть молниеносно, как вы можете получить документ , работайте с вашими наборами (объединение, пересечение и т. д.), а затем выполните multi-get (mget), чтобы получить имена и рабочие места. Не использовать базу данных графа - это рекурсивные призывы, чтобы подружиться с друзьями и т. Д.