用于管理站点上的用户访问的结构

时间:2009-06-02 19:36:16

标签: database-design

我们有一个网站,左侧导航有很多链接。这些链接是根据用户的功能绘制的。管理员用户可以创建一个新功能并将其分配给某些用户 问题是,一旦创建了新函数,我们的代码就必须更改,因为在我们的左侧导航页面中我们有很多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 个答案:

答案 0 :(得分:1)

我认为你可以添加表格

cmp_function_links [function_id, link_url, link_text]

伪代码(用于打印链接)应为

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

我认为您的链接是静态的,而不是动态的(例如链接到最新用户等)。