組織架構本質為樹狀結構,這是拋棄 DNN 原生「安全角色」(扁平化)另建架構的主因。兩者定位不同:安全角色管控系統權限(頁面/模組存取),組織架構管控業務數據權限與流程流轉。
兩者共用一張資料表,以 IsDept 位元欄位區分。允許任意巢狀(群組下掛部門、部門下掛群組),雖邏輯上可能怪異,但保留最大彈性由使用者決定。IsValid 欄位支援「停用」而非刪除,保留關聯資料與權限,亦可隱藏僅供管理員/流程引擎可見的功能性群組。
受 DNN 啟發,以最精簡結構實現最大擴展性:
-- 部門/群組表
CREATE TABLE {databaseOwner}[{objectQualifier}RedStart_Department] (
[DeptID] [int] NOT NULL IDENTITY(1,1),
[PortalID] [int] NOT NULL,
[ParentID] [int] NULL,
[DeptName] [nvarchar](50) NOT NULL,
[DeptDescribe] [nvarchar](200) NULL,
[DeptOrder] [int] NOT NULL,
[IsValid] [bit] NOT NULL DEFAULT(1),
[IsDept] [bit] NOT NULL DEFAULT(1),
[CreateDate] [datetime] NULL,
[CreateUser] [int] NULL,
CONSTRAINT PK_... PRIMARY KEY CLUSTERED (DeptID),
CONSTRAINT FK_... FOREIGN KEY (PortalID) REFERENCES {databaseOwner}[{objectQualifier}Portals](PortalID) ON DELETE CASCADE
)
-- 人員從屬表
CREATE TABLE {databaseOwner}[{objectQualifier}RedStart_DeptUser] (
[DeptID] [int] NOT NULL,
[UserID] [int] NOT NULL,
[UserPrio] [int] NOT NULL,
[IsLead] [bit] NOT NULL DEFAULT(0),
[IsValid] [bit] NOT NULL DEFAULT(1),
CONSTRAINT PK_... PRIMARY KEY CLUSTERED (DeptID, UserID),
CONSTRAINT FK_Dept FOREIGN KEY (DeptID) REFERENCES ... ON DELETE CASCADE,
CONSTRAINT FK_User FOREIGN KEY (UserID) REFERENCES {databaseOwner}[{objectQualifier}Users](UserID) ON DELETE CASCADE
)
用戶表直接複用 DNN Users 表,避免重複。剩餘編碼工作屬標準 CRUD,略過不贅述。