SQL Server — отслеживание исторического атрибута с использованием даты вступления в силу, как забыть (больше не действительный) атрибут

#sql-server #database-design #triggers

Вопрос:

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

Следует рассмотреть два варианта: использование даты начала и даты окончания для отслеживания членства, хотя запрос проще, очень сложно обеспечить целостность данных (без перекрытия дат).

 CREATE TABLE dbo.TrackGroupMembership
(
PersonId int,
StartDate date,
EndDate date,
GroupName varchar(100)
)
 

таким образом, данные будут

 PersonId StartDate    EndDate       GroupName
101      1/1/2021     1/31/2021     Group1
101      2/1/2021     2/28/2021     Group2
101      3/1/2021     3/31/2021     Group3 
 

Еще один способ-использовать Дату вступления в силу для ее отслеживания. Это работает, но я не уверен, что происходит, когда человек не входит ни в какую группу, как хранить такую запись, может ли кто-нибудь посоветовать.

 CREATE TABLE dbo.TrackGroupMembership2
(
PersonId int,
EffectiveDate date,
GroupName varchar(100)
)
 

таким образом, данные будут

 PersonId EffectiveDate     GroupName
101      1/1/2021          Group1
101      2/1/2021          Group2
101      3/1/2021          Group3 
 

чтобы получить диапазон дат атрибута, будет работать представление

 CREATE VIEW dbo.vw_TrackGroupMembership2
AS
    SELECT 
        PersonId,
        EffectiveDate  AS StartDate,
        LEAD(DATEADD(D,-1,EffectiveDate),1,'12/31/9999') OVER (PARTITION BY PersonId ORDER BY EffectiveDate) AS EndDate,
        GroupName
    FROM
        dbo.TrackGroupMembership2
 

У меня есть 2 вопроса, используя второй подход, как представить, если человек не является частью какой-либо группы?

Если использовать первый подход, какое ограничение я могу добавить в таблицу, чтобы никто не мог вставить дубликаты данных (у меня уже есть начальная дата Если это невозможно с помощью ограничений, не могли бы вы предоставить код триггера о том, как предотвратить перекрытие диапазона дат?

Комментарии:

1. Сделайте GroupName nullable и сохраните значение null, если группы нет