我有this guy的相反问题。
我有一个过去经常使用这种模式的应用程序:
$rs->create({ foo => 'bar',
status => { label => 'Active' } });
在幕后DBIC将执行SELECT
以确定是否需要创建相应的状态对象,或者是否存在标记为“Active”的状态对象。如果确实存在,则其ID将用作我正在创建的对象中FK的值。
问题是,状态表几乎永远不会改变,并且状态不是很多,因此99.99%的时间基本上是对数据库的浪费查询。我们考虑使用ENUM,但是应用程序的早期阶段,所以我们必须在最初的几周内弹出一些新的状态。 INSERT比*** ALTER TABLE status CHANGE label label ENUM(...)
更少痛苦。将它们放在表格中意味着我们可以轻松地列出可能的值,以便UI构建下拉列表。
所以现在我们有一堆get_THING_id
函数,它们采用THING
标签并返回一个ID。 get_THING_id
函数为memoized,我们这样做:
$rs->create({ foo => 'bar',
status_id => get_status_id('Active') });
感觉不太像DBIC-y而且不得不将它们全部导入到那里。
我们应该咬紧牙关并使用ENUM吗?人们为这种小桌子做了什么?
答案 0 :(得分:1)
我们在DBIC模式中有一个:: Constants类(包),它包含所有这些静态内容的常量。 因为如果这些表的内容发生变化,通常需要调整模式甚至应用程序逻辑,添加/更改常量不是问题。