2014-09-20 47 views
2

在涉及多於兩個級別的數據庫中存儲權限的最佳方式是什麼?目前,只有2級別的權限和它們存儲在一個橋樑實體表是這樣的:在數據庫中保存三個級別的權限

UID | Buildings | Floor 
------------------------ 
1 | A, B, C | F9 

還有有這表明,用戶不應該有權對這些相同的結構稱爲異常另一個表:

UID | Buildings | Floor 
------------------------ 
1 | null | C4 

所以在我上面的例子中,用戶1將權限9樓在建築樓所有的房間建築物A,B和C,而不是地板4 C.

的新要求,是添加更加細化的權限級別,房間在地板上。所以代碼看起來像A1A,A1B等。建築物和房間總是字母,樓號總是數字。 我無法更改這些代碼的格式,因爲它們來自外部來源。

處理這種情況的最佳方法是什麼?我知道Linux使用一些字符串處理組和用戶的文件權限,但是在我的情況下,有數千個房間聽起來不太可行,而且用戶/組的事情只有兩個級別。

我考慮過只是添加一個名爲Rooms的新列,並繼續用逗號分隔的字符串,但是有沒有更好的方法?如果有關係,我使用MySQL。

+0

你看過外部授權和使用像XACML這樣的框架嗎? – 2014-09-21 14:00:48

+0

[路徑枚舉和封閉模式](http:// stackoverflow。/ 23224653#23224653/data-structure-for-many-to-many-hierarchies-in-sql-server/23224653)可以幫助你。 – 2014-09-21 16:35:07

+0

@DavidBrossard我剛剛對XACML進行了簡要的研究,它似乎1)對於項目的範圍而言是過分的,2)開發團隊只由少數人組成,沒有任何人有過這方面的經驗,這是我們必須花時間學習。 – 2014-09-22 02:50:22

回答

0

如果我必須實現這個,我會使用一個包含三列的表 - uid,type和element。 Uid引用用戶,類型(建築物,樓層,房間)和元素代碼的建築物或地板或房間。 我通常會爲每個訪問元素的每個人插入一行。

我也可以變得更加大膽,如果我確信元素的格式遵循嚴格的模式。例如

建築將有代碼只信

樓層都會有像letter.number代碼

客房將有一個像letter.number.letter

碼在上述情況下,你可以使用一個表只有列uid和元素,因爲根據數據的格式可以提取元素的類型(如果它是建築物,地板或房間)。您還可以更進一步,使用通配符存儲訪問:

訪問所有樓層和C樓的房間:C *

進入B棟6樓的所有房間:B6 *

甚至

訪問所有的C客房的所有地面和建築物:**ç

訪問所有的二樓:* 2 *

希望它可以幫助

+0

感謝您的回覆。這也是一個有趣的解決方案,但現在我們決定對數據進行規範化處理,並將每個表格分爲兩列。 – 2014-10-23 12:54:33