使用计算列确保数据完整性

时间:2013-07-23 01:04:35

标签: database-design database-schema

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

1 个答案:

答案 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语句,可能需要

  • 针对视图运行SELECT语句,并针对基表运行所有其他语句,或
  • 创建可更新视图,该视图需要编写,测试和维护过程代码(通常是触发器)。