SQL Server - логический вопрос - PullRequest
1 голос
/ 30 июля 2010

У меня есть следующая таблица:

Id INT/PK
UserId INT/FK
CreatedDate DATETIME
ActivityMarker INT/FK

Таблица может быть записана (включая обновления записей) и удалена из (например, сегодня я могу удалить запись с 01.01.2010). CreatedDate содержит дату, когда была создана запись. ActivityMarker и UserId могут быть обновлены.

Что мне нужно сделать, так это вести хронологический учет того, сколько записей ежедневно для заданного UserId X имел ActivityMarker Y. Мне нужна эта информация, чтобы составить график для пользователя, сколько элементов для данного маркера было у него за время .

Я понимаю, что текущая структура таблицы не поддерживает такого рода историческую информацию; как только кто-то изменит значение ActivitiyMarker или UserId, предыдущее значение исчезнет навсегда, и я не знаю, когда это изменение также произошло.

Может ли кто-нибудь предложить лучший способ сохранить эту информацию, чтобы я мог, в конце концов, получить количество записей для данного UserId и ActivityMarker, как это было в определенный день?

Ответы [ 3 ]

3 голосов
/ 30 июля 2010

Ведите учет изменений, используя эффективные знакомства.

или

Использование триггера для аудита другой таблицы

или

Взгляните на функцию аудита SQL 2008 (возможно, у вас есть что-то для вас, но я не уверен, что она будет в удобной функции).

Эффективные знакомства - это когда вы храните все свои записи и помечаете одну как текущую активную либо с помощью какой-либо логики дат, либо с помощью флага. Вот статья, объясняющая концепцию - http://www.simple -talk.com / sql / администрирование базы данных / архитектура базы данных на определенный момент времени / .

Аудит с помощью триггеров довольно распространен, и вы сможете найти множество информации об этом.

Аудит SQL - это новая функция в 2008 году, которая, похоже, создает дамп взаимодействий с объектом в журнал - может просто хранить операторы t-sql и идентификатор пользователя, а не фактические значения столбцов.

0 голосов
/ 30 июля 2010

Как насчет записи снимков записей в таблицу истории?Если вы работаете прямо в SQL Server, вы можете использовать триггеры.Если вы работаете с инструментом ORM, у некоторых есть возможность перехватывать изменения.

0 голосов
/ 30 июля 2010

Вам потребуется таблица, подобная этой

Id INT/PK   -- alternately UserId + Rundate could be the PK
UserId INT/FK
RunDate DATETIME
AMCount INT

Затем выполняйте ежедневно:

INSERT INTO HistoricalActivityMarkers( UserId, RunDate, AMCount)
   SELECT UserId, GETDATE(), count(*)
   FROM ActivityMarkerTbl
   GROUP BY UserId, GETDATE()

Поскольку вам нужна только ежедневная запись, нет необходимости в триггерах, которые бызаписывать каждое изменение, а также не сможет дать вам ежедневную запись, если не сделать пометки хотя бы раз в день.

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