Как я должен обрабатывать обновления, которые происходят ежечасно? - PullRequest
0 голосов
/ 12 февраля 2009

У меня есть стол:

CA

  • ca_id
  • PLACEMENT_ID
  • ли
  • ли

Эта таблица обновляется новыми уникальными местами размещения каждый час из хранилища данных. Теперь конечный пользователь хочет отслеживать статусы для этих мест размещения.

Я думал о добавлении новой таблицы, которая также будет обновляться ежечасно:

CA_Status

  • PLACEMENT_ID
  • record_status
  • last_updated_on

ВАРИАНТ 1:

Добавить уникальное ограничение для place_id. Реализуйте некоторый механизм (возможно, триггер?), Где, если размещение существует, обновите поля record_status и last_updated_on. Если нет, создайте новую запись. Затем я могу соединить это с таблицей CA по Place_id и получить последний статус каждого места размещения.

ВАРИАНТ 2

Я могу сбросить уникальное ограничение для place_id. Это позволит таблице расти с последним record_status для любого размещения. Когда я присоединяюсь, я могу получить MAX(last_updated_on), чтобы получить последний record_status.

ВАРИАНТ 3:

Дамп таблицы CA_Status все вместе. Добавьте новые атрибуты в таблицу CA и выполните что-то вроде опции 1

Если ВАРИАНТ 1 - это триггеры?

Если из-за ВАРИАНТА 2 мой стол не обязательно будет большим.


обновление: я думаю, с Вариантом 1 мне действительно не нужна таблица CA_Status. Я мог бы включить эти поля в таблицу CA и соответственно обновить.

Ответы [ 3 ]

0 голосов
/ 12 февраля 2009

В 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)

Это вставит место размещения, если его еще нет, обновит его, если оно есть - и все еще не будет ошибок.

0 голосов
/ 28 апреля 2009

Поскольку у вас есть полный контроль над процессом, вариант 3 кажется мне наиболее простым.

record_status и last_updated_on в таблицу CA и включите эти поля в оператор INSERT.

Если ваше требование состоит в том, чтобы изменять record_status и last_updated_on каждый раз, когда вносятся изменения в таблицу CA, то можно использовать триггер ONDATE.

Однако вы говорите, что имеете полный контроль над уровнем бизнес-логики. Таким образом, изменение операторов UPDATE для обновления этих полей также является самым простым способом.

Если вам не нужно отслеживать почасовые изменения статуса с течением времени. Затем для хранения этих изменений требуется отдельная таблица.

0 голосов
/ 12 февраля 2009

Мой голос за вариант 1. Просто убедитесь, что если вы делаете много обновлений о часовом исполнении, это не сильно ударит по триггерам.

Что отправляет обновления в БД? Если это написанная программа, потребуется еще несколько обращений к базе данных, чтобы выстроить в линию всех ваших уток, чтобы вставить / обновить CA_Status таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...