2013-08-22 173 views
0

我正在研究一個必須管理權限的應用程序,並且我想出了一個我想要的反饋意見。我不確定這是不是正確的地方發佈它,但我想我們會看到。將枚舉綁定到靜態數據

我的應用程序中的用戶可以被分配權限。他們可以擁有個人級別的權限,也可以擁有羣組成員的權限。因此,我有如下表(我想的名字是相對不言自明的,但如果需要,可以添加更多的信息):

  • 用戶
  • 權限
  • User_Permissions
  • User_Groups
  • User_Group_Permissions

The design of權限表是這樣的:

  • ID INT(許可ID,主鍵)
  • 名稱VARCHAR(255)(許可的名稱,如 「管理」)
  • 描述VARCHAR(1000)(許可的簡短說明)
  • DEFAULT_VALUE TINYINT(默認值分配給用戶(是/否/不))

然而,當我檢查代碼中的權限,我不想使用「魔術字符串」,所以我創建了一個枚舉在我的權限表的權限,然後使用它像這樣:

public enum EPermission 
{ 
    ADMINISTRATION = 1, 
    LOGIN = 2 
} 

public bool HasPermission(EPermission permission) 
{ 
    int permission_id = (int)permission; 
    //look up the permission in the database based on permission_id 
} 

在我的權限表中的編號相符,我在我的枚舉分配數值。該應用程序無法改變這些。權限表中的權限作爲安裝的一部分使用這些ID插入,不應更改。

這種連接可以接受嗎?我不希望數據發生變化,但它總是可能的,而且我只是想知道在我深入研究之前是否有更好的方法來做事。

回答

1

是的,它是「可接受的」,是一種相當普遍的做法。

編輯:如果你想真正減少你的數據庫和枚舉不同步的機會,你可以反映枚舉在部署期間用數據爲你的表種子。

+0

有趣 - 沒有想到反思的想法。它只會被部署一次(或者至少在一個地方),所以也許這對我的情況有點過分,但是謝謝。 – Mansfield

1

由於您不更改權限,因此您也可以脫離權限表並僅使用枚舉。然後,您可以將枚舉的值作爲int存儲在User_Permissions和User_Group_Permissions表中。

從數據庫中檢索數據時,可以將值反序列化爲枚舉值。這樣可以減少數據庫中的數據被破壞並且不再與您的枚舉相匹配的可能性。

0

我懷疑它不會幫助長期運行。什麼如果一個用戶可以擁有一個或多個權限。那麼你需要切換標誌枚舉?

+0

該枚舉只代表一個權限。一個用戶可以擁有多少個 - 我只關心枚舉和權限表之間的耦合。 – Mansfield