我想知道计算列是否可以破坏数据完整性,而视图是解决方案,如果它是正确的那么为什么呢?
答案 0 :(得分:0)
计算列可以打破数据完整性。如果您构建一个这样的表
create table line_items (
order_num integer primary key references orders (order_num),
line_item_num integer not null,
qty integer not null,
price_each decimal (13, 2) not null,
price_extended decimal (13, 2) not null
);
dbms不保证扩展价格始终是“qty”和“price_each”的乘积。但可以保证使用CHECK约束。
price_extended decimal (13, 2) not null
check (price_extended = qty * price_each)
在制作中,你 对“line_item_num”,“qty”和“price_each”都有CHECK约束。可能没有一个应该是负面的,并且每个都应该有一个合理的上限。
您可以在不使用“price_extended”列的情况下构建该表,而是在视图中计算它。
create view line_items_extended as
select order_num, line_item_num, qty, price_each,
qty * price_each as price_extended
权衡取决于绩效。视图保证“price_extended”的正确值,而不需要对“price_extended”进行CHECK约束。但是每次使用视图时都必须计算全部或部分“price_extended”值。
使用视图也会增加复杂性。而不是针对单个表运行SELECT,INSERT,UPDATE和DELETE语句,可能需要