【问题标题】:ensure data integrity with computed column确保计算列的数据完整性
【发布时间】:2013-07-23 01:04:35
【问题描述】:

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

【问题讨论】:

  • 定义“计算列”。您是指那些支持表中的声明性计算的数据库中的计算列吗?或者您的意思是您的应用程序存储您在代码中执行的计算的常规列?

标签: database-design database-schema


【解决方案1】:

计算列可能破坏数据完整性。如果你建一个这样的表

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 语句,并针对基表运行所有其他语句,或者
  • 创建一个可更新的视图,这需要编写、测试和维护过程代码(通常是触发器)。

【讨论】:

  • 在大多数数据库中,单表视图是可更新的,无需过程代码。当然,视图中的计算列是不可更新的,但其他列是。
  • @LarryLustig:虽然这是真的,但在我的示例中——这可能与 OP 的真正问题完全没有关系——视图可能需要包含一个加入订单表。更少的 SQL 平台支持更新包含连接的视图。
  • 您的示例显示了计算列在单表视图中派生的情况,然后可以在必要时与其他关系连接。我经常使用这样的视图(以及非常相似的命名约定,将 Ex(用于扩展)附加到表名 - 诚然,在像 CustomersEx 这样的表名中不太好)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-10
  • 2012-05-11
  • 1970-01-01
  • 2014-02-09
相关资源
最近更新 更多