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

Oracle 具有许多空列的发票表的数据库设计

ASKTOM 2018-12-17
311

问题描述

你好,问一下汤姆团队。

我有一个70列表存储有效发票。在某些情况下,由于业务规则,发票被拒绝。当发票被拒绝时,只填写几列 (最多5列),那么剩下的65列都是空的。稍后,用户将检索所有发票 (有效和拒绝)。

我应该吗...

1.在此表中存储拒绝的发票,并在一个表中选择

或者

2.创建一个新的仅用于存储所需的5列,避免null并使用联接来检索数据?

提前感谢。

问候,

专家解答

假设被拒绝的发票是您需要在审计、财务报告等中包括的文件,您应该有一个单一的发票表。

但是,如果拒绝的发票永远不会为接受的发票设置60列的值,那么我会将表一分为二。并将所有接受的唯一列放在这里。

如果您想要一种简单的方法来获取所有发票,并在适当的情况下使用可接受的值,请创建一个视图。这个外部连接两个表。

例如:

create table invoices (
  invoice_id int not null primary key,
  customer_id int not null,
  ...
);

create table invoice_details (
  invoice_id int not null primary key
    references invoices ( invoice_id ),
  ...
);

create or replace view all_invoices as 
  select i.*, d.*
  from   invoices i
  join   invoice_details d
  on     i.invoice_id = d.invoice_id;


如果要确保仅接受的发票在子表中具有条目 (将子列设置为not null),则可以:

-在发票中添加状态列
-唯一约束 (invoice_id,状态)
-将状态复制到孩子
-为child添加一个检查约束。status = 'ACCEPTED'
-上的外键 (invoice_id,状态)

例如:

create table invoices (
  invoice_id int not null primary key,
  customer_id int not null,
  status     varchar2(10) not null,
  unique ( invoice_id, status ) 
);

create table invoice_details (
  invoice_id int not null primary key
    references invoices ( invoice_id ),
  status     varchar2(10) not null
    check ( status = 'ACCEPTED' ),
  constraint id_accepted_invoices_fk 
    foreign key ( invoice_id, status )
    references invoices ( invoice_id, status )
);

文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论