Perl 如何在不重新蚀刻相关对象的情况下创建行?

Perl 如何在不重新蚀刻相关对象的情况下创建行?,perl,dbix-class,Perl,Dbix Class,我的问题正好相反 我有一个应用程序经常使用这种模式: $rs->create({ foo => 'bar', status => { label => 'Active' } }); 后台DBIC将执行选择,以确定是否需要创建相应的状态对象,或者是否存在标签为“Active”的状态对象。如果它确实存在,则其ID将用作我正在创建的对象中FK的值 问题是,状态表几乎永远不会改变,并且状态也不多,因此99.99%的时间基本上都是对数据库的浪费查询。我

我的问题正好相反

我有一个应用程序经常使用这种模式:

$rs->create({ foo => 'bar',
              status => { label => 'Active' } });
后台DBIC将执行
选择
,以确定是否需要创建相应的状态对象,或者是否存在标签为“Active”的状态对象。如果它确实存在,则其ID将用作我正在创建的对象中FK的值

问题是,状态表几乎永远不会改变,并且状态也不多,因此99.99%的时间基本上都是对数据库的浪费查询。我们曾考虑改用enum,但现在应用程序还处于早期阶段,因此在最初的几周内,我们肯定会出现一些新的状态。INSERT在***中的痛苦小于
更改表状态更改标签ENUM(…)
。另外,将它们放在一个表中意味着我们可以很容易地列出可能的值,以便UI构建下拉列表

因此,现在我们有一组
get\u THING\u id
函数,它们使用
THING
标签并返回一个id。
get\u THING\u id
函数是:

$rs->create({ foo => 'bar',
              status_id => get_status_id('Active') });
感觉DBIC-y不太好,而且到处都要进口这些东西很尴尬


我们应该咬紧牙关,只使用枚举吗?人们对这种类型的小表做了什么?

我们的DBIC模式中有一个::Constants类(包),它包含所有这些静态内容的常量。
由于如果这些表的内容发生变化,通常需要调整模式甚至应用程序逻辑,因此添加/更改常量不是问题。

是否可以使用第一个代码块的语法将结果对象作为
状态传递?@simbabque我没有,因此这意味着保持类似
的映射处于活动状态=>$active\u status
around,这基本上又是一次记忆。所以你根本不用一个单独的
status
表,只使用常量?我可以看到它的优点,但这是否意味着你的字段上没有FK约束,所以你可以在其中放入随机值?我们确实有那个表,可以使用约束强制执行有效值。