У меня есть проект движка приложения (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")
Хранение в виде набора помогло бы ускорить поиск, если бы я загрузил оба объекта пользователя, но я думаю, что и для списка, и для набора требуется дополнительное время для десериализации их при извлечении из хранилища данных, поэтому не уверен, что их Преимущества сводятся на нет. Может быть, это повредит больше, чем поможет?