暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 存储在数据库中的应用参数

askTom 2018-07-18
235

问题描述

嗨!
通常,我们需要存储某种应用程序参数或应用程序用户设置。
自然,每个参数都有自己的类型、尺寸等。

我们可以使用一个直表,每个参数都有单独的列,但是如果我们需要添加下一个参数,我们必须更改表 (并为它准备get \ set方法)。

另一种方法是使用EAV表 (实体属性值)。在这种情况下,我们需要自己控制类型和尺寸 (这更危险)。
但是这种方法允许我们使用通用的 \ 重载getter \ setter。

另外,当我们准备setter时,很容易为许多类型的数据制作一个setter。但是吸气剂有点棘手。

我们不能调用具有不同返回类型的重载函数。

function get_val(p_param_name in varchar2) return number;
function get_val(p_param_name in varchar2) return date; -- too many declarations ....


我们还可以为每种数据类型准备单独的方法,例如

function get_date_val(p_param_name in varchar2) return date;
function get_num_val(p_param_name in varchar2) return number;



哪种是存储这种数据的最佳方法?
是否可以使用第一种方法准备没有列名映射的通用方法?
哪种访问方式更灵活、清晰?

专家解答

根据我的经验,每个应用程序都需要某种形式的配置/设置表。虽然理论上你应该有单独的列来强制执行数据类型等,但实际上这太过分了。一个简单的键/值表通常会完成以下工作:

create table app_config (
  config_parameter varchar2(100) not null primary key,
  config_value     varchar2(1000) not null
);


由于这些值很少发生变化,通常由开发团队控制,如果错误,整个应用程序会中断,因此将错误数据类型的通常风险降至最低。

但你确实需要小心。我看到人们陷入的最大陷阱是将其用作任何东西的通用查找表。避免这个!根据需要为新实体创建新表。

我看到的关键错误是在逗号分隔的列表中为几个值使用一个参数。例如:

insert into app_config values ( 'param', 'val1,val2,val3,...' );


这使得这些值更难操纵。在这种情况下,您可以:

为每个值创建单独的参数:

insert into app_config values ( 'param1', 'val1' );
insert into app_config values ( 'param2', 'val2' );
insert into app_config values ( 'param3', 'val3' );
...


或者有简单的亲子关系:

create table app_config_parameters (
  config_parameter varchar2(100) not null primary key
);

create table app_config_values (
  config_parameter varchar2(100) not null 
    references app_config_parameters ( config_parameter ),
  config_value     varchar2(1000) not null,
  primary key ( config_parameter, config_value )
);

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论