【问题标题】:Want to create tables based on the below requirement想根据以下要求创建表
【发布时间】:2021-09-16 14:13:45
【问题描述】:
  1. 表格列详细信息如下:

    id - number,
    Description - varchar 2,
    partition_0_to_5 - varchar2,
    partition_6_to_10 - varchar2,
    partition_11_to_15 - varchar2,
    status - varcha2
    

但是 partition_0_to_5 、 partition_6_to_10 和 partition_11_to_15 中的值来自一个主表,并且可以有多个值。假设 ID 号 1 属于两个分区,即 1. Build 和 6. C,那么这些值应该放在 partition_0_to_5 和 partition_6_to_10 列中。

  1. 分区阶段的主表包含 id 和任务列。
  1. 开始
  2. 构建
  3. 测试
  4. 注册测试
  5. 一个
  6. B
  7. C
  8. D
  9. E
  10. F
  11. G
  12. H
  13. J
  14. K
  15. L

【问题讨论】:

    标签: database oracle data-modeling


    【解决方案1】:

    在我看来,这是一个错误的数据模型。为了将来的缘故,您应该对其进行规范化,因为 - 创建新分区时您会做什么(16 - 20)?改变表?修改您已编写的所有代码以包含新分区?祝你好运!

    (此外,您的问题不是关于建模,而是在插入期间“解决”,即在应用程序代码中 - 而不是数据模型中。正如我所说的那样,这是错误的,在我的意见)。


    这是我的建议;考虑一下。

    这是“主”表;在您当前的模型中,它包含 3 个附加列(分区):

    SQL> create table table_1
      2    (id_tab      number primary key,
      3     description varchar2(20),
      4     status      varchar2(2)
      5    );
    
    Table created.
    

    分区列表。如果创建了新分区(16 - 20),您只需在该表中插入一个新行 - 不应更改任何代码,也不应更改任何表。

    SQL> create table part
      2    (id_part     number primary key,
      3     description varchar2(20)
      4    );
    
    Table created.
    
    SQL> insert into part (id_part, description)
      2    select 1, ' 0 -  5' from dual union all
      3    select 2, ' 6 - 10' from dual union all
      4    select 3, '11 - 15' from dual;
    
    3 rows created.
    

    分区阶段:

    SQL> create table part_stage
      2    (id_part_stage number primary key,
      3     id_part       number references part (id_part),
      4     task          varchar2(20)
      5    );
    
    Table created.
    
    SQL> insert into part_stage (id_part_stage, id_part, task)
      2    select  0, 1, 'start'    from dual union all
      3    select  1, 1, 'build'    from dual union all
      4    select  2, 1, 'test'     from dual union all
      5    select  3, 1, 'reg test' from dual union all
      6    select  4, 1, 'A'        from dual union all
      7    select  5, 1, 'B'        from dual union all
      8    select  6, 2, 'C'        from dual union all
      9    select  7, 2, 'D'        from dual union all
     10    select  8, 2, 'E'        from dual union all
     11    select  9, 2, 'F'        from dual union all
     12    select 10, 2, 'G'        from dual union all
     13    select 11, 3, 'H'        from dual union all
     14    select 12, 3, 'I'        from dual union all
     15    select 13, 3, 'J'        from dual union all
     16    select 14, 3, 'K'        from dual union all
     17    select 15, 3, 'L'        from dual;
    
    16 rows created.
    

    此表用于将主表 (table_1) “映射”到分区阶段 (part_stage)。这样做很灵活,因此您可以根据需要为每个主记录添加任意数量的分区阶段。如果创建了新分区,也没有问题 - 它(再次)只是tmap 表中的另一行。

    SQL> create table tmap
      2    (id_map        number primary key,
      3     id_tab        number references table_1 (id_tab),
      4     id_part_stage number references part_stage (id_part_stage)
      5    );
    
    Table created.
    

    序列(用于主键):

    SQL> create sequence seqmap;
    
    Sequence created.
    

    插入会是什么样子?

    SQL> declare
      2    l_id_tab number := seqmap.nextval;
      3  begin
      4    -- parent record
      5    insert into table_1 (id_tab, description, status)
      6      values (l_id_tab, 'Test insert', 'A1');
      7
      8    -- child record (build)
      9    insert into tmap (id_map, id_tab, id_part_stage)
     10      values (seqmap.nextval, l_id_tab, 1);
     11
     12    -- child record (C)
     13    insert into tmap (id_map, id_tab, id_part_stage)
     14      values (seqmap.nextval, l_id_tab, 6);
     15  end;
     16  /
    
    PL/SQL procedure successfully completed.
    

    要插入什么?

    SQL> select * from table_1;
    
        ID_TAB DESCRIPTION          ST
    ---------- -------------------- --
             1 Test insert          A1
    
    SQL> select * from tmap;
    
        ID_MAP     ID_TAB ID_PART_STAGE
    ---------- ---------- -------------
             2          1             1
             3          1             6
    

    “报告”显示什么属于什么:

    SQL> select a.id_tab, a.description, a.status, p.description, ps.task
      2  from table_1 a join tmap  t on t.id_tab = a.id_tab
      3                 join part_stage ps on ps.id_part_stage = t.id_part_stage
      4                 join part p on p.id_part = ps.id_part
      5  where a.id_tab = 1;
    
        ID_TAB DESCRIPTION          ST DESCRIPTION          TASK
    ---------- -------------------- -- -------------------- --------------------
             1 Test insert          A1  0 -  5              build
             1 Test insert          A1  6 - 10              C
    
    SQL>
    

    创建新分区时会发生什么?没什么,只是一些插入:

    SQL> insert into part (id_part, description)
      2    select 4, '16 - 20' from dual;
    
    1 row created.
    
    SQL> insert into part_stage (id_part_stage, id_part, task)
      2    select 16, 4, 'M' from dual union all
      3    select 17, 4, 'N' from dual union all
      4    select 18, 4, 'O' from dual union all
      5    select 19, 4, 'P' from dual union all
      6    select 20, 4, 'Q' from dual;
    
    5 rows created.
    

    向现有的table_1 记录添加新的分区阶段:

    SQL> insert into tmap (id_map, id_tab, id_part_stage)
      2    values (seqmap.nextval, 1, 20);
    
    1 row created.
    

    结果:

    SQL> select a.id_tab, a.description, a.status, p.description, ps.task
      2  from table_1 a join tmap  t on t.id_tab = a.id_tab
      3                 join part_stage ps on ps.id_part_stage = t.id_part_stage
      4                 join part p on p.id_part = ps.id_part
      5  where a.id_tab = 1;
    
        ID_TAB DESCRIPTION          ST DESCRIPTION          TASK
    ---------- -------------------- -- -------------------- --------------------
             1 Test insert          A1  0 -  5              build
             1 Test insert          A1  6 - 10              C
             1 Test insert          A1 16 - 20              Q
    
    SQL>
    

    看到了吗?我没有更改任何代码,没有更改任何表格......什么都没有。一切都正常。在您的数据模型中,您还有很多工作要做。

    再一次考虑这样做。 正确的方式,在我看来。

    【讨论】:

      猜你喜欢
      • 2023-02-23
      • 1970-01-01
      • 2023-02-07
      • 1970-01-01
      • 2017-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-03
      相关资源
      最近更新 更多