2013-04-11 20 views
7

我一直在試圖找到解決這個問題幾天,現在我似乎無法想出有用的東西。問題如下:用於用戶和組訪問控制的MySQL數據庫模式

我目前正在開發一個統計工具,顯示一些圖形和數個應用程序的數據。顯然需要限制訪問這些數據,因爲用戶A擁有應用程序「一」和「兩」,並且不能看到「三」或「四」。

現在,每個用戶可以是多個組的成員並從這個組繼承權限,但也可以擁有單獨的權限。這些權限必須爲每個應用程序設置。

  • 用戶自己有權訪問這塊此應用程序的數據
  • 組用戶的成員的任何人有權限的權限:如果訪問一組一個應用程序的數據被授予訪問此片在本申請的數據的

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

的目標是具有存儲的實際權限的每個用戶目前對各種應用都有一個表,從組成員資格和我計算個人許可,並且由於與其他表格的關係,該信息始終保持一致。

我不知道如果這有助於找到解決的辦法,但這裏的SQL來獲取用戶的當前活動的權限ID爲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 2013-04-12 07:07:13

+0

然後你可以使用觸發器。 [MYSQLtriggers](http://dev.mysql.com/doc/refman/5.6/en/triggers.html)。當表更新影響權限時。使觸發器更新存儲所有權限的表。 – 2013-04-12 07:14:41

+0

你需要的是一個Materialized View,它是MySQL中不存在的一個特性。但是,您可以通過定義一個新表格並使用觸發器來確保它被精確地填充,從而[模擬一個](http://www.fromdual.com/mysql-materialized-views)。 – 2013-04-12 07:24:05