【问题标题】:Adding columns to database table dynamically?动态向数据库表添加列?
【发布时间】:2013-06-10 11:39:31
【问题描述】:

我正在使用 Java EE、Oracle db 和 JPA:

我需要在 oracle 中创建一个公用表。可以使用 ui 进行编辑,例如:

id|tax1|tax2|tax3
------------------
1 | 5  |  16|  9
2 | 7  |  1 |  8

用户必须能够添加新列;上一张表必须如下所示:

id|tax1|tax2|tax3|tax4    (the tax4 column was added)
-----------------------
1 | 5  |  16|  9 |  0
2 | 7  |  1 |  8 |  0

添加一个调用“更改表”指令的按钮似乎很容易,但我不想给用户那种权限。我正在考虑将每一列表示为另一个表中的行,并使用 Java 进程在 UI 中构建表。

我遇到的另一个不相关的问题是:表中的数据直接影响计算,如果添加任何列,计算必须考虑新列/列。

【问题讨论】:

  • 您确定需要新列吗?这对我来说似乎是糟糕的设计。
  • 为什么不拥有一个包含三列的表:Id、Tax# 和 ValueOfTax。这样,您可以将所有信息存储在一个表中而无需更改架构?
  • 能够添加新税值的用户要求仍将技术实施留给您。需求合规性测试永远不应依赖于实施方式。
  • 我从来没有想过您希望用户在您的数据库中创建新列的场景。我可以想象 DBA 把他们的头发拉出来!您的数据模型存在很大缺陷。而是解决这个问题。从长远来看,你会更快乐。
  • 这就是为什么当“用户需求”文档必须包含架构设计时我会畏缩的原因。

标签: java database oracle database-design


【解决方案1】:

“我遇到的另一个不相关的问题是:表中的数据影响 直接计算,如果添加任何列,计算必须 考虑新的列/列。”

您的意思是“另一个完全相关的问题是……”。因为此声明突出了您提议的实施的深远影响。动态添加一列很容易。

难点在于同时需要对代码库进行影响分析并评估引用该表的所有 SQL。毕竟,将新列包含在该计算中是不够的。可能还有其他 SELECT 需要修改(例如,报告)。当然,您需要将数据放入新列,这意味着要修改 UPDATE 和 INSERT 语句。这种事情对于一个负责的人来说已经够难的了。编写动态 SQL 来自动完成?疯狂。

我希望您不要为任何负责我自己的税务事务的组织编写申请。

无论如何,您的问题源于将新数据视为结构更改,而不是内容更改。很明显,声明为您的表具有重复列(TAX1、TAX2、TAX3),是不良数据模型的一部分,需要进一步规范化。

确实,这可能会使您的税收计算更加复杂,但这是一件好事。复杂性应该在业务规则实现而不是数据模型中。至少通过这种方式,复杂性被限制在单个程序单元中,而不是分散在应用程序的 CRUD 功能中。


为了完整起见,这里是通往疯狂山脉的路径:

create or replace procedure add_new_col as
    n pls_integer;
begin
    select count(*) into n
    from user_tab_columns
    where table_name = 'YOUR_TABLE'
    and column_name like 'TAX%'; 

    execute immediate 'alter table your_table add tax'||trim(to_char(n+1))||' number';
end;

您可以授予用户对此过程的执行权限,而无需授予他们对基础表的更广泛的权限。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 2016-08-07
    • 2010-10-01
    • 2018-05-17
    • 2013-07-24
    • 2019-05-30
    • 2012-12-29
    相关资源
    最近更新 更多