【问题标题】:when should I use a static array instead of a new table in my database?什么时候应该在我的数据库中使用静态数组而不是新表?
【发布时间】:2012-07-27 11:16:35
【问题描述】:

我已经使用 2 个静态数组(用于角色和资源)实现了一个访问控制列表,但我在我的数据库中添加了一个新表来获取权限。

为角色使用静态数组的想法是我们不会一直创建新角色,因此数据不会一直更改。我对资源也是这么想的,也是因为我认为资源是只有开发人员才应该处理的东西,因为它们与代码的关系比与数据的关系更大。您知道为什么要使用静态数组而不是数据库表吗?何时/为什么?

【问题讨论】:

  • 我只是在数据库中做它并缓存结果。阵列将更快,数据库更易于管理。只需构建一个脚本,该脚本可以从数据库中写出数组或将结果集缓存在 APC 中,或类似的东西。
  • 其实这个选择并不是真的基于性能,而是更多是因为数据的类型,你懂我的意思吗?我不会有很多角色,我的资源一旦宣布,就会一直存在。另一方面,权限表是在数据库中创建的,因为我可以设置多种不同的角色、资源和操作组合,并且在数据库中,我还可以通过我设置的名为“is_allowed”的布尔变量撤销此权限'。我只需要将其设置为 0 并保留历史权限,我可以随时更改、授予或撤销

标签: php acl database-performance static-array


【解决方案1】:

将值硬编码到代码中的问题在于,与数据库更改相比,代码更改要昂贵

  • 通常需要创建一个新的包来部署。该软件包需要进行回归测试,以验证没有引入任何错误。提示:即使您只更改了一行代码,也需要进行回归测试以验证构建过程中没有出现任何问题(例如,未正确打包库导致模块失败)。

  • 更新代码可能意味着停机,这也增加了风险,因为如果更新失败怎么办,总是存在this的风险

  • 在企业环境中,批准数据库更新通常比更改代码要快得多。

所有这些都需要时间/精力/金钱。请注意,在我看来,在数据库中保存参考数据或静态数据并不意味着会影响性能,因为数据始终可以被缓存。

【讨论】:

    【解决方案2】:

    您的静态数组是将数据“硬编码”到程序中的一个示例,如果您从不想要更改它,这很好。

    根据我的经验,对于您的用例,这永远不会是真的,并且将您的数据硬编码到您的源中会导致您不断被要求更新您假设的那些内容永远不会改变。

    Protip:对于项目经理和/或客户来说,没有什么是一成不变的。

    【讨论】:

    • 我不会更改这些表中的数据。仅在权限表中,这就是我将此表保留在数据库中的原因。
    【解决方案3】:

    我认为这只是归结为您认为数据库将来将如何使用。如果您将数据保留在数组中,然后想要创建另一个与该数据库交互的应用程序,您将开始必须在两个代码库中维护角色/资源数据。但是,如果您将角色/资源放入数据库,则数据库将是它们的唯一权限。

    我建议将它们放入数据库中。您可以在启动时将表读入数组,并且您将获得相同的性能优势以及让其他应用程序能够获取此信息的灵活性。

    此外,当/如果您开始编写用户管理系统时,通过加入表格来显示用户的角色/资源比取回角色/资源 ID 并且必须查找数组中的漂亮名字。

    【讨论】:

      【解决方案4】:

      使用静态数组可以获得性能,考虑到你不需要一直访问数据库,但安全比性能更重要,所以我建议你在数据库中做权限控制。

      研究 RBAC。

      【讨论】:

      • 权限在数据库中被控制。只有我在静态数组中添加的角色和资源。权限可能一直在变化,但资源不会变化
      【解决方案5】:

      被认为是静态的东西应该被编码为静态的。也就是说,如果您真的 认为它们是静态的。

      但我建议使用类常量而不是静态数组值。

      【讨论】:

        猜你喜欢
        • 2018-05-12
        • 2019-05-09
        • 2016-09-13
        • 2018-04-03
        • 1970-01-01
        • 2016-02-15
        • 2016-08-09
        • 2011-12-26
        • 1970-01-01
        相关资源
        最近更新 更多