问题描述
你好,问一下汤姆团队。
我有一个70列表存储有效发票。在某些情况下,由于业务规则,发票被拒绝。当发票被拒绝时,只填写几列 (最多5列),那么剩下的65列都是空的。稍后,用户将检索所有发票 (有效和拒绝)。
我应该吗...
1.在此表中存储拒绝的发票,并在一个表中选择
或者
2.创建一个新的仅用于存储所需的5列,避免null并使用联接来检索数据?
提前感谢。
问候,
我有一个70列表存储有效发票。在某些情况下,由于业务规则,发票被拒绝。当发票被拒绝时,只填写几列 (最多5列),那么剩下的65列都是空的。稍后,用户将检索所有发票 (有效和拒绝)。
我应该吗...
1.在此表中存储拒绝的发票,并在一个表中选择
或者
2.创建一个新的仅用于存储所需的5列,避免null并使用联接来检索数据?
提前感谢。
问候,
专家解答
假设被拒绝的发票是您需要在审计、财务报告等中包括的文件,您应该有一个单一的发票表。
但是,如果拒绝的发票永远不会为接受的发票设置60列的值,那么我会将表一分为二。并将所有接受的唯一列放在这里。
如果您想要一种简单的方法来获取所有发票,并在适当的情况下使用可接受的值,请创建一个视图。这个外部连接两个表。
例如:
如果要确保仅接受的发票在子表中具有条目 (将子列设置为not null),则可以:
-在发票中添加状态列
-唯一约束 (invoice_id,状态)
-将状态复制到孩子
-为child添加一个检查约束。status = 'ACCEPTED'
-上的外键 (invoice_id,状态)
例如:
但是,如果拒绝的发票永远不会为接受的发票设置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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




