我有一张桌子:
CA
此表格每小时从数据仓库更新一次新的唯一展示位置。现在,最终用户想要跟踪这些展示位置的状态。
我在考虑添加一个新表,每小时也会更新一次:
CA_Status
选项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表中并相应地更新。
答案 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语句也是最简单的方法。
除非,您需要跟踪状态随时间的每小时变化。然后需要一个单独的表来保存这些更改。