【发布时间】:2013-07-23 01:04:35
【问题描述】:
我想知道计算列是否会破坏数据完整性,视图是解决方案,如果正确,为什么?
【问题讨论】:
-
定义“计算列”。您是指那些支持表中的声明性计算的数据库中的计算列吗?或者您的意思是您的应用程序存储您在代码中执行的计算的常规列?
标签: database-design database-schema
我想知道计算列是否会破坏数据完整性,视图是解决方案,如果正确,为什么?
【问题讨论】:
标签: database-design database-schema
计算列可能破坏数据完整性。如果你建一个这样的表
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”进行检查约束。但每次使用视图时,它都必须计算全部或部分“price_extended”值。
使用视图也会在一定程度上增加复杂性。您可能需要对单个表运行 SELECT、INSERT、UPDATE 和 DELETE 语句,而不是
【讨论】: