-
Notifications
You must be signed in to change notification settings - Fork 0
Datastruct
В данном проекте мы не будем использовать традиционные SQL базы, считаю их слишком громоздкими для нашего случая. Таким образом, все данные, которые мы будем хранить, должны укладываться в схему ключ-значение. Ключом будет некоторая строка, значением будет JSON-структура. Как вариант тут была бы интересен XML, но если мы не будем применять все его описания схем, валидацию и прочее, то смысла в нём нет.
Каждый ключ представляет собой запись в доменном стиле или в имейл-стиле. Начальным доменом всегда выступает собственный домен сервера. Например, наш сервер называется mat.im, тогда все внутренние ключи имеют ".mat.im" в качестве суффикса. По крайней мере в логическом плане, в практическом, конечно, не стоит "мусорить", в базе этот суффикс можно смело опустить. Но, когда в какой-то записи встречается какое-то поле, значением которого является ключ в базе, то там должен присутствовать полный домен. Например, если у нас есть описание какой-то группы и в ней встречаются пользователи как с нашего, так и с других серверов, то они указываются полной доменной записью.
$word.domain.im -- ключ, возвращающий список
$record@$word.domain.im -- ключ, возвращающий одну запись
users[.domain.im] -- список всех пользователей. Необходимо право "администратор" или "видеть всех пользователей".
open_profile@$user.users[.domain.im] -- открытый профиль пользователя, что он пожелал опубликовать для всех
roster@$user.users[.domain.im] -- ростер, доступен только пользователю
Константная часть .domain.im не хранится в базе в наборе ключей. Далее буду опускать её в записях.
groups -- список групп. Обычные пользователи видят только открытые группы и те, в которых они являются членами, чтобы видеть все, необходимо право "администратор".
$group@groups -- аттрибуты группы. Открытая/закрытая и прочие. Необходимо право "администратор" или "владелец".
$group.groups -- список участников группы. У группы могут быть подгруппы. Необходимо право "администратор" или "участник".
Use Case: Есть группа "разработчики", они разбиты на подгруппы "проект1", "проект2" и прочие. Один разработчик увольняется -- автоматически удаляется из всех подгрупп.
$subgroup.$group.groups
rooms
$room@rooms -- аттрибуты комнаты. Необходимо право "администратор" или "владелец".
$room.rooms -- список участников. Возможны перечисления как отдельных пользователей, так и групп. Участники могут быть как с одного сервера так и с нескольких. Необходимо право "администратор" или "участник".
Файлы могут принадлежать пользователею, группе или Руму.
rooms.files
groups.files
users.files