【问题标题】:How to store lists of options in a web application如何在 Web 应用程序中存储选项列表
【发布时间】:2019-02-21 18:12:38
【问题描述】:

我们目前正在设计一个新数据库,但我不确定我想如何存储我的选项列表。

例如,如果您有一个优先级列表:

1  High
2  Medium
3  Low

或输入:

1 email
2 phone
3 text

我应该如何存储这些?

从历史上看,我将它们放在数据库表中(选项 1):

优先级

id description
1  High
2  Medium
3  Low

这样做的结果是它们成为其他表中的外键。

另一种选择(选项 2)是将它们存储在代码中,作为常量列表。

优点和缺点

选项 1

  • 更容易维护,无需推送代码。您只需添加维护页面来编辑表格。
  • 每次您想要检索列表时都会点击更多的数据库。

选项 2

  • db 上的点击次数减少。
  • 如果列表需要修改,需要修改代码后再推送代码。

我错过了什么吗?什么是常见的做法?

干杯

【问题讨论】:

    标签: php database laravel


    【解决方案1】:

    我会根据以下因素来决定:

    1.可用值的数量:

    如果它只是一组 2 或 3 个预定义值,例如优先级 HighMediumLow.. 我更愿意将其作为常量放在代码库中。因为极不可能添加任何新选项,例如 very lowvery very low

    如果值是预定义的,但数量很大,比如员工的技能集。我肯定会把它放在数据库表中。

    2 。值变化的可能性:

    如果这些值经常变化,并且您想通过管理面板将控制权交给用户来管理这些值,请务必将这些值存储在数据库表中。

    3.使用频率:

    如果这些值是您系统的核心,因此几乎所有查询都使用它来过滤结果,那么您还需要考虑性能:

    例如:假设整个项目取决于HighMediumLow 优先级。您需要使用优先级过滤几乎每个查询:

    拥有常量将使priority 存储在tasks 表中:

    $tasks = Task::whereIn('priority', [high_constant, low_constant])->get();
    

    拥有一个单独的表 priorities 并与 tasks 使用 priority_id 外键有关系:

    $task = Task::whereHas('priority', function($q){
        return $q->whereIn('priority_name', ['high', 'low']);
    })->get();
    

    根据您拥有的数据数量和您执行的频繁查询,您可以检查影响性能的因素。如果差异非常小,我更喜欢考虑第 1 点和第 2 点的常量。

    4.获取 ID 等附加功能:

    假设您有一个页面来创建具有优先级下拉列表的新任务。

    如果您有一个单独的表,则必须从priorities 表中获取该优先级的ID,以将其保存为外键,同时将任务保存在tasks 表中。 (虽然真的不是什么大不了的事,但值得一提)

    如果你有常量,你可以直接保存那个值。

    各有优缺点,我会在上面的第 1 点和第 2 点中做出选择。

    另外,如果您要制作常量,我建议您制作一个带有 n 别名的 laravel facade,然后在其中定义常量。所以你可以在整个项目中使用它

    Priority::HIGHPriority::LOW

    【讨论】:

      【解决方案2】:

      我通常用数据库和外键来做。您已经在数据库中获取信息,您可以通过简单的方式获取正确的值而不是 id。

      但如果只是这两个列表...我不确定,我尽量不使用硬编码值的
      在我的代码中进行轻松更改而无需更新生产服务器。

      【讨论】:

        【解决方案3】:

        我会选择选项 2:

        您可以将它放在一个单独文件中的数组中,在您的代码之外,这样会更容易管理,例如:

        types.php

        <?php
        return ['type' => ['email','phone','text']];
        

        并在需要的地方使用它:

        需要'/types.php';

        将数组存储在像 $options 这样的变量中 并在您的代码中使用 $options['type']。

        当然,您需要再次推送您的代码。其他选项是缓存它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-02
          • 1970-01-01
          • 1970-01-01
          • 2010-11-11
          • 2012-11-13
          相关资源
          最近更新 更多