2013-04-11 2 views
7

Я пытаюсь найти решение этой проблемы в течение нескольких дней, и я просто не могу придумать что-то, что работает. Проблема заключается в следующем:Схема базы данных MySQL для управления доступом пользователей и групп

В настоящее время я разрабатываю инструмент статистики, который показывает некоторые графики и данные для нескольких приложений. Доступ к этим данным, очевидно, должен быть ограничен, так как Пользователь А владеет приложениями «Один» и «Два» и не должен видеть «Три» или «Четыре».

Теперь каждый пользователь может быть членом нескольких групп и наследовать разрешения от этой группы, но также может иметь индивидуальные разрешения. Эти разрешения должны быть установлены для каждого приложения. Доступ к набору данных одного приложения предоставляется, если:

  • Пользователь сам имеет разрешение на доступ к этой части данных этого приложения
  • Любая одна из групп пользователь является членом имеет разрешение чтобы получить доступ к этой части данных этого приложения

http://i.stack.imgur.com/y4W6E.png

цель состоит в том, чтобы иметь таблицу, в которой хранятся фактические разрешения каждый пользователь в настоящее время имеет для каждого приложения, вычисленный из членства в группах, и я и обеспечить постоянную согласованность этой информации в любое время из-за отношений с другими таблицами.

Я не знаю, если это поможет найти решение, но вот 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 
); 

Это то, что я хочу, чтобы хранить в дополнительная таблица (только для всех пользователей).

ответ

3

Звучит для меня, вы должны использовать представление. У вас уже есть запрос, используйте запрос для создания представления.

+0

Спасибо за подсказку, я даже не знал, что такое представление до этого момента. Я сделаю это пока, однако это не * действительно * решает мою проблему, так как представление также собирает все данные из каждой соответствующей таблицы каждый раз, когда кто-то запрашивает у нее данные, что именно то, что я хочу избежать , Я хочу сохранить эту информацию в таблице и ** только ** обновить ее, если на самом деле произошли изменения в отношении того, что влияет на разрешения (например, удаляемая группа). – Anpan

+0

Тогда вы можете использовать триггеры. [MYSQLtriggers] (http://dev.mysql.com/doc/refman/5.6/en/triggers.html). Когда таблица обновляется, что влияет на разрешения. Сделайте триггер обновить таблицу, где хранятся все разрешения. –

+0

Что вам нужно - это материализованный вид, который не существует в MySQL. Но да, вы можете [имитировать один] (http://www.fromdual.com/mysql-materialized-views), определяя новую таблицу и используя триггеры, чтобы убедиться, что она заполнена точно. –