3

我目前正在努力改进我的数据库,以便为增长腾出空间。就目前而言,不同的用户对网站的各个区域具有不同的“权限”。一些用户有权访问网站的多个区域。

如果我以最有效的方式执行此操作,我想要一些反馈:

 tblUsers:
    usrID       usrFirst       usrLast       phone    //etc....
      1            John          Doe 
      2            Jane          Smith
      3            Bill          Jones          


 tblAreas: 
    id      name   
     1       Marketing
     2       Support
     3       Human Resources
     4       Media Relations

 tblPermissions:

    id       usrID       areaID   
    1          1           2
    2          1           4
    3          2           1
    4          3           3

现在,对于每个“区域”,我都有单独的目录。但是,我想将所有这些目录最小化到一个主目录,然后根据用户的权限将登录的用户重定向到相应的“区域”。

听起来我做得对吗?我从来没有创建过具有不同权限和不同人群的多层网站,因此,我当然愿意更多地了解如何正确地做到这一点。

非常感谢!

4

3 回答 3

3

总体设计还可以。我突然想到的问题与命名有关。

  • SQL 不需要匈牙利符号——通常被认为是不必要的/不好的(tblUsers -> users)。
  • 我不会将表名添加到列名...
  • ...除了“id”列,它应该始终包含您的表名(即 areaId)
  • 您的“第一”和“最后”列没有意义(提示:名字)
  • 我会重命名 tblPermissions -> userAreas

根据您的编程语言和数据库,我还建议您对表/列名使用下划线而不是大写。

至于为不同的组使用单独的目录,我建议不要这样做。在代码中而不是目录布局中进行安全检查。

推理:

当有人决定支持也允许做一些营销工作时会发生什么?您应该更改代码,还是将记录添加到数据库中?

或者,如果您有重叠的操作怎么办?

@brianpeiris:我想到了几件事:

  • JOIN 中不需要列别名
  • 使搜索代码更容易(“foo_id”给出的结果比“id”少)
  • JOIN 使用 (foo_id) 而不是 JOIN ON (foo.id=bar.id)。
于 2009-09-12T17:10:11.173 回答
1

架构看起来不错。

我建议您将访问控制放在控制器中,并将其作为 URL 路径的基础,这样您就不会将其编码到每个部分中。

于 2009-09-12T15:42:44.907 回答
1

是的,这似乎从数据库方面完美地满足了您的需求。

挑战将是尽可能简单和声明性地使用数据。声明您所在的“区域”的正确位置在哪里?每个页面都这样做吗,或者是否有一个计算它的函数,或者你的控制器可以做到吗?正如有人建议的那样。第二部分是针对此评估当前用户。理想情况下,您最终会得到一个像“security_check_for_area(4)”这样的函数来完成所有工作。

于 2009-09-16T05:42:52.763 回答