Я предлагаю вам добавить отметку времени «last_update» и столбец «last_updated_by_user», чтобы у вас была надежда отслеживать изменения в этой таблице в вашей работающей системе.
Вы можете рассмотреть возможность добавления разрешения.Пользователь, имеющий разрешение на предоставление объекта, сможет предоставить доступ другим пользователям к рассматриваемому объекту.
Будьте осторожны с «необходимостью быстро масштабироваться».Без реального производственного опыта трудно угадать, в чем действительно нуждается масштабная система.
Кроме того, будьте осторожны, чтобы не чрезмерно усложнить систему разрешений, потому что слишком сложную систему будет сложно проверить и, следовательно, будет легче взломать.Простая система будет гораздо проще реорганизовать для масштабирования, чем более сложная.
Кажется, ваша схема связывает пользователей с объектами.Вы хотите, чтобы ваш первичный ключ и ваш уникальный индекс были (user_id, object_id)?То есть вы хотите, чтобы у каждого пользователя была либо ноль, либо одна запись разрешения для каждого объекта?Если это так, используйте первичный ключ для обеспечения этого, а не предлагаемый суррогатный ключmission_id.
Для ваших объектов, которые существуют в иерархиях, вы должны сделать один из двух вариантов в масштабе всей системы:
предоставление объекту с подобъектами неявно предоставляет доступ только к объекту, или ...
это также предоставляет доступ ко всем подобъектам.
Второй вариант уменьшает бремя явного предоставления разрешений при создании новых подобъектов.Первый вариант является более безопасным.
Второй вариант затрудняет определение того, имеет ли пользователь доступ к определенному объекту, потому что вам нужно пройти иерархию объектов к корню дерева в поисках разрешений на доступ.родительские объекты при проверке, есть ли у пользователя доступ.Эта проблема производительности должна доминировать в принятии решений.Будут ли ваши пользователи создавать несколько объектов и часто получать к ним доступ?Или они создадут много объектов и подобъектов и получат к ним доступ редко?Если доступ чаще, чем создание, вам нужен первый выбор.Возьмите удар по предоставлению разрешений во время создания объекта, а не по поиску разрешений во время доступа к объекту.
Я думаю, что первый выбор, вероятно, лучше.Я предлагаю этот макет таблицы:
user_id (int)
object_id (int)
type (varchar) (not sure what you have this column for)
admin (bool)
read (bool)
write (bool)
edit (bool)
grant (bool)
delete (bool)
last_update (timestamp)
last_updated_by_user_id (int)
primary key = user_id, object_id.
Вы также можете использовать этот макет таблицы и иметь строку в таблице для каждого отдельного разрешения, предоставленного каждому пользователю для каждого объекта.Эта функция легче масштабируется, если вы добавляете больше типов разрешений.
user_id (int)
object_id (int)
permission_enum (admin/read/write/edit/grant/delete)
type (varchar) (not sure what you have this column for)
last_update (timestamp)
last_updated_by_user_id (int)
primary key = user_id, object_id, permission_enum