Учитывая ElasticSearch NoSQL db, я пытаюсь выяснить, как наилучшим образом моделировать данные социальных отношений (да, график db будет лучшим инструментом для работы, но в моей текущей ситуации этот выбор может быть навязан мне) ,Как смоделировать социальные соединения в ElasticSearch?
Я новичок в ElasticSearch и рассматриваю способы моделирования отношений, но они, похоже, не подходят для использования в социальных сетях, или, по крайней мере, мне не ясно, как они будут моделироваться.
Значительно упрощенная версия моих требований заключается в следующем:
- Люди имеют идентификаторы, имена и места работы (они не могли бы иметь место работы)
- Люди могут иметь дружеские отношения с другими людьми (и дата создания дружбы)
- Люди могут блокировать других людей, разговаривать с ними (вопросы направленность, так как только тот, кто блокировал может разблокировать)
- Люди могут работать на том же рабочем месте
вещей, которые мы, скорее всего, запрос:
- Дайте мне все люди, которых я дружу с (учитывая мой ID)
- Дайте мне все люди, с которыми я работаю (учитывая мой ID)
- Дайте мне союз из вышеперечисленных 2, а также имена и идентификаторы их рабочих мест, но не те, кого я заблокировал или кто заблокировал меня.
- Дайте мне всех друзей, у которых есть рабочее место в городе, где я работаю.
В то время как запросы кажутся сложными, меня больше интересует просто моделирование людей, рабочих мест и отношений между ними в ElasticSearch таким образом, что это имеет смысл, является ремонтопригодным и которые могут поддерживать такие запросы.
Документация говорит мне, что ElasticSearch не имеет объединений. Он имеет вложенные объекты и отношения родитель-ребенок, но ни одна из них не кажется подходящей для дружеских отношений между людьми; оба вложенных объекта и родитель-ребенок имеют скрытую концепцию единоличного владения ... если я не начну дублировать данные людей повсюду, как в объектах других людей (для друзей и для заблокированных), так и на рабочих местах. Это, конечно же, вводит проблему сохранения данных в соответствии с тем, что изменяющиеся данные людей должны изменять их дублированные данные повсюду, и удаление отношений дружбы должно удалить другую сторону этих отношений с другим человеком. Это также вызывает проблему транзакций, поскольку я слышал, что поддержка транзакций по различным документам не поддерживается.
Помимо денормализации и дублирования или соединения на стороне приложения, отличного от db, существуют ли какие-либо лучшие способы (помимо использования другой БД), чтобы моделировать это разумным способом, который проще запросить?