我们目前正在设计一个新的数据库,我不确定如何存储选项列表。
例如,如果您具有优先级列表:
1 High
2 Medium
3 Low
或键入:
1 email
2 phone
3 text
我应该如何存储这些?
从历史上看,我将它们放置在数据库表中(选项1):
优先级
id description
1 High
2 Medium
3 Low
其结果是,它们成为其他表中的外键。
另一种方法(选项2)是将它们存储在代码中,作为常量列表。
我错过了什么吗?什么是常见习俗?
欢呼
答案 0 :(得分:4)
我将基于以下因素做出决定:
1。可用值数:
如果它只是2或3个预定义值的集合,例如优先级High
,Medium
,Low
。。我希望将其作为常量保存在代码库中。因为极不可能添加任何新选项,例如very low
或very very low
等
如果值是预定义的但数量很大,例如员工的技能组。我肯定会将其放在数据库表中。
2。值改变的可能性:
如果这些值经常更改,并且您想通过管理面板来控制这些值,请务必将其存储在数据库表中。
3。使用频率:
如果这些值是系统的核心,因此几乎所有查询都使用它们来过滤结果,那么您还需要考虑性能:
例如:假设整个项目取决于High
,Medium
,Low
优先级。您需要使用优先级过滤几乎所有查询,然后:
具有常量的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::HIGH
或Priority::LOW
答案 1 :(得分:0)
我通常使用数据库和外键来实现。您已经在数据库中查找该信息,只需简单的操作即可获取正确的值而不是ID。
但是如果仅是这两个列表...我不确定,我尝试不使用硬编码值的
在我的代码中进行轻松更改,而无需更新生产服务器。
答案 2 :(得分:0)
我会选择选项2:
您可以将其放在代码外部的单独文件中的数组中,这样更易于管理,例如:
types.php
<?php
return ['type' => ['email','phone','text']];
并在需要的地方提供它:
需要'/types.php';
将数组存储在$ options之类的变量中 并在代码中使用$ options ['type']。
当然,您需要再次推送代码。其他选择是将其缓存。