Я пытаюсь найти решение этой проблемы в течение нескольких дней, и я просто не могу придумать что-то, что работает. Проблема заключается в следующем:Схема базы данных MySQL для управления доступом пользователей и групп
В настоящее время я разрабатываю инструмент статистики, который показывает некоторые графики и данные для нескольких приложений. Доступ к этим данным, очевидно, должен быть ограничен, так как Пользователь А владеет приложениями «Один» и «Два» и не должен видеть «Три» или «Четыре».
Теперь каждый пользователь может быть членом нескольких групп и наследовать разрешения от этой группы, но также может иметь индивидуальные разрешения. Эти разрешения должны быть установлены для каждого приложения. Доступ к набору данных одного приложения предоставляется, если:
- Пользователь сам имеет разрешение на доступ к этой части данных этого приложения
- Любая одна из групп пользователь является членом имеет разрешение чтобы получить доступ к этой части данных этого приложения
цель состоит в том, чтобы иметь таблицу, в которой хранятся фактические разрешения каждый пользователь в настоящее время имеет для каждого приложения, вычисленный из членства в группах, и я и обеспечить постоянную согласованность этой информации в любое время из-за отношений с другими таблицами.
Я не знаю, если это поможет найти решение, но вот SQL, чтобы получить активные в данный момент разрешения пользователя с идентификатором 1:
(
SELECT u.perm_id AS perm, u.user_id AS uid, u.app_id AS app
FROM daUsers_has_daPermissions AS u
WHERE u.user_id = 1
)
UNION
(
SELECT g.perm_id AS perm, u.user_id AS uid, g.app_id AS app
FROM daUsers_has_daPermissions AS u, daUsergroup_has_daPermissions AS g, daUsergroup_has_daUsers AS g_has_u
WHERE u.user_id = 1
AND u.user_id = g_has_u.user_id
AND g.group_id = g_has_u.group_id
);
Это то, что я хочу, чтобы хранить в дополнительная таблица (только для всех пользователей).
Спасибо за подсказку, я даже не знал, что такое представление до этого момента. Я сделаю это пока, однако это не * действительно * решает мою проблему, так как представление также собирает все данные из каждой соответствующей таблицы каждый раз, когда кто-то запрашивает у нее данные, что именно то, что я хочу избежать , Я хочу сохранить эту информацию в таблице и ** только ** обновить ее, если на самом деле произошли изменения в отношении того, что влияет на разрешения (например, удаляемая группа). – Anpan
Тогда вы можете использовать триггеры. [MYSQLtriggers] (http://dev.mysql.com/doc/refman/5.6/en/triggers.html). Когда таблица обновляется, что влияет на разрешения. Сделайте триггер обновить таблицу, где хранятся все разрешения. –
Что вам нужно - это материализованный вид, который не существует в MySQL. Но да, вы можете [имитировать один] (http://www.fromdual.com/mysql-materialized-views), определяя новую таблицу и используя триггеры, чтобы убедиться, что она заполнена точно. –