如何在Web应用程序中存储选项列表

时间:2019-02-21 09:24:12

标签: php database laravel

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

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

1  High
2  Medium
3  Low

或键入:

1 email
2 phone
3 text

我应该如何存储这些?

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

优先级

id description
1  High
2  Medium
3  Low

其结果是,它们成为其他表中的外键。

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

优点和缺点

选项1

  • 易于维护,无需推送代码。您只需添加维护页面即可编辑表。
  • 每次您想要检索列表时,数据库点击量都会增加。

选项2

  • 数据库命中率降低。
  • 如果需要修改列表,则需要更改代码,然后推送代码。

我错过了什么吗?什么是常见习俗?

欢呼

3 个答案:

答案 0 :(得分:4)

我将基于以下因素做出决定:

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表中保存任务的同时从tasks表中获取该优先级的ID,以将其另存为外键。 (虽然确实没什么大不了,但值得一提)

如果您有常量,则可以直接保存该值。

每种方法都有优点和缺点,我会在上面的第1点和第2点中做出选择。

此外,如果要创建常量,我建议制作一个别名为n的laravel facade,然后在其中定义常量。因此您可以像在整个项目中一样使用它

Priority::HIGHPriority::LOW

答案 1 :(得分:0)

我通常使用数据库和外键来实现。您已经在数据库中查找该信息,只需简单的操作即可获取正确的值而不是ID。

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

答案 2 :(得分:0)

我会选择选项2:

您可以将其放在代码外部的单独文件中的数组中,这样更易​​于管理,例如:

types.php

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

并在需要的地方提供它:

需要'/types.php';

将数组存储在$ options之类的变量中 并在代码中使用$ options ['type']。

当然,您需要再次推送代码。其他选择是将其缓存。