#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, если группы нет