Я пишу приложение, которое имеет определенные функции, похожие на список друзей в Google Circle / FB.
- Пользователь может объединить в группу людей, которых он знает (семью, коллегу, друзей и т. Д.)....) (на данный момент группы не могут быть вложенными)
- Пользователь может отправлять сообщения в группы (группы), устанавливать настройки конфиденциальности для каждой группы и т. д.
- Когда сообщение публикуется в группепользователи этих групп могут комментировать и видеть комментарии других, независимо от их отношений с другими (внутри этой группы)
На данный момент мы используем реляционную базу данных (mysql) из-занекоторое ограничение со временем и ресурсом.В любом случае я пытаюсь найти лучший способ структурировать нашу базу данных, чтобы сбалансировать производительность и ясность.Вот что у нас сейчас:
users:
user_id
default_group_id
friend_group_id
groups:
group_id
groups_to_users:
user_id
group_id
messages:
message_id
messages_to_groups:
message_id
group_id
galleries_to_groups:
gallery_id
group_id
Когда пользователь создается впервые, у него / нее будет 2 базовые группы:
- группа по умолчанию, которая будет содержать только этот единственныйuser
- группа друзей, которая будет содержать всех, с кем он / она дружит
Мы просто будем использовать group_id для определения «разрешения» вместо использования user_id.Таким образом, мы можем пропустить сложность запроса 2 таблиц.
В то же время, с вышеописанной структурой мы также столкнемся с препятствиями при запросе всех сообщений, полученных пользователем, поскольку нам, возможно, придется запросить не менее 100 групп.если у этого пользователя 100 друзейИтак, прямо сейчас мы обходим это довольно хакерским методом:
, если пользователь отправляет сообщение группе, мы просматриваем список участников этой группы и сохраняем запись для каждого пользователя (message_id,(default_) group_id).Проблема в том, что, если в этой группе более 1000 участников, нам придется вставлять более 1000 записей для каждого нового сообщения, отправляемого в эту группу, а также когда этот пользователь вносит какие-либо изменения в члена группы, нам также необходимо обновитьогромное количество записей.
Интересно, есть ли лучший способ структурировать нашу базу данных для повышения производительности?