-1

我想知道计算列是否会破坏数据完整性,而视图是解决方案,如果正确,为什么?

4

1 回答 1

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”进行检查约束。但每次使用视图时,它都必须计算全部或部分“price_extended”值。

使用视图也会在一定程度上增加复杂性。而不是对单个表运行 SELECT、INSERT、UPDATE 和 DELETE 语句,您可能需要

  • 针对视图运行 SELECT 语句,并针对基表运行所有其他语句,或者
  • 创建一个可更新的视图,这需要编写、测试和维护过程代码(通常是触发器)。
于 2013-07-23T01:40:35.567 回答