Дешевый способ моделирования отношений с друзьями - PullRequest
2 голосов
/ 23 января 2012

У меня есть проект движка приложения (java), в котором есть класс User. Я хотел бы смоделировать дешевую систему отношений с друзьями. Каждый пользователь может иметь до 50 друзей. Я думаю сделать что-то сумасшедшее, как:

class User {
    String username;
    Text friends; // "joe,mary,frank,pete"
}

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


Получить мой полный список друзей

Просто найдите объект User и верните список друзей через запятую.


Добавить друга

Получить мой пользовательский объект, проверить, существует ли целевое имя в строке, если нет, добавить в конец. Сохранение измененного объекта User обратно в хранилище данных.


Удалить друга

Получить мой пользовательский объект, проверить, существует ли целевое имя в строке, если это так, удалить его из строки. Сохранение измененного объекта User обратно в хранилище данных.


Являются ли два пользователя общими друзьями

Получите оба пользовательских объекта, убедитесь, что имена пользователей отображаются в пользовательском объекте друг друга.


Получение полного списка друзей очень важно для моего приложения, и хранение каждого отношения как отдельной сущности кажется мне кошмарным (выбор каждой сущности из хранилища данных, когда пользователь должен увидеть список своих друзей, вероятно, обанкротит меня). Я надеюсь, что простое чтение из атрибута Text будет намного более легким.

Проверка на наличие сценария общих друзей кажется самым большим недостатком здесь, но это случается не так часто. Я не знаю, будет ли выборка двух пользовательских объектов из хранилища данных и сравнение строк иметь катастрофические последствия для производительности. Может быть в порядке? Я думаю, что, возможно, я также читал, что создание и удаление объектов из хранилища данных стоит больше, чем просто изменение существующего объекта. Таким образом, операции добавления / удаления друзей также могут быть лучше.

Буду рад услышать любые мысли об этом или более оптимальных способах решения этой проблемы.

Спасибо

-------------------------- Обновление -------------------- -

Согласно комментарию Адриана, я мог бы также сделать следующее:

class User {
    String username;
    List<String> friends;
      // or //
    Set<String> friends; 
}

Так что я думаю, что если я буду использовать Список, эти объекты будут проиндексированы по умолчанию. Я не уверен, смогу ли я выполнить запрос GQL, зная, что списки проиндексированы, чтобы получить совпадение, фактически не извлекая никаких сущностей. Что-то вроде:

SELECT COUNT FROM User WHERE 
    (username = "me" && friends = "bob") &&
    (username = "bob" && friends = "me")

Хранение в виде набора помогло бы ускорить поиск, если бы я загрузил оба объекта пользователя, но я думаю, что и для списка, и для набора требуется дополнительное время для десериализации их при извлечении из хранилища данных, поэтому не уверен, что их Преимущества сводятся на нет. Может быть, это повредит больше, чем поможет?

Ответы [ 2 ]

1 голос
/ 23 января 2012

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

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

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

1 голос
/ 23 января 2012

List<String> friends; - хорошее решение, которое я видел в профессиональном использовании. Если у друзей есть идентификаторы пользователей вашего приложения или Google, вы можете использовать этот тип данных вместо списка ключей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...