我该如何处理每小时发生的更新?

时间:2009-02-12 19:14:39

标签: sql-server database-design

我有一张桌子:

CA

  • ca_id
  • PLACEMENT_ID
  • 嗒嗒
  • 嗒嗒

此表格每小时从数据仓库更新一次新的唯一展示位置。现在,最终用户想要跟踪这些展示位置的状态。

我在考虑添加一个新表,每小时也会更新一次:

CA_Status

  • PLACEMENT_ID
  • record_status
  • last_updated_on

选项1:

为placement_id添加唯一约束。实现一些机制(可能触发?),如果存在,则更新record_status和last_updated_on字段。如果没有创建新记录。然后,我可以通过placement_id将其加入CA表,并获取每个展示位置的最新状态。

选项2

我可以在placement_id上转储唯一约束。这将使表格与最新的record_status一起增长,适用于任何展示位置。当我加入时,我可以MAX(last_updated_on)获取最新的record_status。

选项3:

将CA_Status表全部转储。将新属性添加到CA表并执行类似选项1

的操作

如果OPTION 1是触发器的方式吗?

如果OPTION 2会使我的桌子不一定很大。


更新:我猜选项1我真的不需要CA_Status表。我可以将这些字段合并到CA表中并相应地更新。

3 个答案:

答案 0 :(得分:0)

我对选项1的投票。只要确保如果你对小时表现做了很多更新,那么触发器就不会受到太大影响。

什么是向DB发送更新?如果它是一个书面程序,它将需要更多的数据库调用来排队所有的鸭子以这种方式插入/更新CA_Status。

答案 1 :(得分:0)

在MS SQL 2005及更高版本中,您可以扩展表并选择如下:

SELECT placement_id, update_time, anything_else
FROM (
  SELECT m.*, ROW_NUMBER() OVER (PARTITION BY placement_id ORDER BY update_time) AS rn
  FROM mytable m
  ) mo
WHERE rn = 1

这是最有效的,因为这将使用索引扫描,没有连接和没有触发器。

当然,您使用MS SQL 2008并且不想保留历史记录,您可以添加以下数据:

MERGE
INTO mytable
USING VALUES(@new_id, @new_time, @new_data)
ON placement_id = @new_id
WHEN MATCHED THEN
 UPDATE
 SET update_time = @new_time,
     anything_else = @new_data
WHEN NOT MATCHED THEN
 INSERT (placement_id, update_time, anything_else)
 VALUES(@new_id, @new_time, @new_data)

这将插入展示位置,如果它尚未存在,请更新它 - 如果它是 - 并且仍然没有tirggers。

答案 2 :(得分:0)

由于您可以完全控制该过程,因此对我来说OPTION 3似乎最简单。

record_status和last_updated_on进入CA表,并在INSERT语句中包含这些字段。

如果您的要求是每次更改CA表时更改record_status和last_updated_on,则可以使用on UPDATE触发器。

但是,您说您可以完全控制业务逻辑层。因此,更改UPDATE语句也是最简单的方法。

除非,您需要跟踪状态随时间的每小时变化。然后需要一个单独的表来保存这些更改。