2009-06-02 36 views
0

我們有一個網站,左側導航有很多鏈接。這些鏈接是基於用戶的功能繪製的。有一個管理員用戶可以創建一個新功能並將其分配給某些用戶的屏幕。
問題是,一旦創建了新函數,我們的代碼就必須更改,因爲在我們的左側導航頁面中,我們有很多if/else子句,基於此我們繪製鏈接。用於管理用戶在網站上訪問的結構

以下是有關表的結構:

cmp_user_role [userid, role_id] 
cmp_function [function_id, function_name, url] 
cmp_function_role [role_id, function_id] 

樣本數據:

cmp_user_role [userid, role_id] 
M23423 18 
H23414 21 
G23431 44 

cmp_function [function_id, function_name, url] 
0 SystemAdmin Null 
1 Debt Access Null 
8 Audit Reports Null 

cmp_function_role [role_id, function_id] 
18 0 
18 1 
21 8 
44 1 

帶來相對的功能列表,用戶標識的查詢:

SELECT f.function_id, f.function_name 
FROM cmp_function f, cmp_function_role p 
WHERE p.role_id 
IN (SELECT DISTINCT role_id FROM cmp_user_role 
WHERE user_id = 'M23423') 
AND p.function_id=f.function_id 

並在我們的代碼中我們正在做(僞)

if (retrievedFunctionFromDB == "SystemAdmin") 
    show links pertaining to system Admin 
if (retrievedFunctionFromDB == "Debt Access") 
    show links pertaining to Debt Access 
... 

除了當用戶決定創建一個新功能並將該功能分配給某個用戶時,我認爲一切都可以。在這種情況下,我們的代碼沒有該函數名稱,因爲我們正在對其進行硬編碼。 ..

什麼是最好的策略,使這種動態w/out改變了很多表結構。

回答

1

我想你可以添加表

cmp_function_links [function_id, link_url, link_text] 

而僞代碼(用於打印鏈接)應

fetch all roles where user is 
for each role 
    print all links 

我想你的鏈接是靜態的,不是動態的(如鏈接到最新的用戶等)。