【问题标题】:Check My Database Design / PHP/MySQL检查我的数据库设计 / PHP/MySQL
【发布时间】:2009-10-06 19:16:21
【问题描述】:

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

如果我以最有效的方式执行此操作,我希望得到一些反馈:

 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

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

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

非常感谢!

【问题讨论】:

    标签: sql mysql database-design data-modeling


    【解决方案1】:

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

    • SQL 不需要匈牙利符号 - 通常被认为是不必要的/不好的(tblUsers -> 用户)。
    • 我不会在列名前加上表名...
    • ...除了“id”列,它应该始终包含您的表名(即 areaId)
    • 您的“first”和“last”列没有意义(提示:firstName)
    • 我将重命名 tblPermissions -> userAreas

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

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

    推理:

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

    或者如果你有重叠的动作怎么办?

    @brianpeiris:我想到了几件事:

    • 在 JOIN 中不需要列别名
    • 使搜索代码更容易(“foo_id”提供的结果比“id”少)
    • JOIN USING (foo_id) 而不是 JOIN ON (foo.id=bar.id)。

    【讨论】:

    • 我同意您的评价,除了:“我不会在列名前添加表名前缀”我发现以这种方式区分表名有助于区分列和多个连接。 - 在大多数 SQL 实现中,您不需要在列名前加上表名。
    • 我很好奇您为什么说 Id 列应始终包含表名。有什么合乎逻辑的原因还是只是一个强有力的约定?
    • @brianpeiris:更新了您问题的答案。
    • +1 感谢您的澄清,我没有考虑 JOIN 中的别名问题。
    【解决方案2】:

    架构看起来不错。

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-15
        • 1970-01-01
        • 1970-01-01
        • 2010-10-12
        • 1970-01-01
        • 2012-10-24
        相关资源
        最近更新 更多