У меня есть следующая (упрощенная) структура, которая позволяет мне отслеживать оборудование, назначенное ячейке. Поскольку оборудование может быть в ячейке только один раз в таблице, я создал ограничение, которое говорит, что idEquipment и idCell должны быть уникальными в таблице.
CREATE TABLE [dbo].[CellEquipment](
[idEquipment] [int] NOT NULL,
[idCell] [int] NULL,
CONSTRAINT [PK_CellEquipment] UNIQUE NONCLUSTERED
(
[idEquipment] ASC,
[idCell] ASC
)
Это ограничение гарантирует, что я никогда не добавлю одно и то же оборудование в ячейку дважды.
Итак, теперь мне поручили хранить информацию об истории. Мне нужно иметь возможность получить заказ на работу, увидеть его дату, а затем найти, какое оборудование использовалось для этого заказа на работу. Решение состоит в том, чтобы добавить информацию о дате в таблицу следующим образом:
CREATE TABLE [dbo].[CellEquipment](
[idEquipment] [int] NOT NULL,
[idCell] [int] NULL,
[DateAdded] [datetime] NULL,
[DateRemoved] [datetime] NULL,
)
Теперь мое ограничение сверху нарушено. idCell/idEquipment
больше не уникальны, так как снаряжение можно удалять и снова добавлять в ячейку. Теперь у меня есть некоторые сложные проблемы с датами, с которыми нужно бороться. Чтобы обеспечить целостность данных, для изменений в базе данных должно выполняться следующее:
idCell/idEquipment are unique (like before) OR
idCell/idEquipment's new DateAdded doesn't fall between a DateAdded/Removed OR
idCell/idEquipment's new DateRemoved doesn't fall between a DateAdd/Removed or
idCell/idEquipment's doesn't have a record with DateRemoved=NULL
Ограничения Check не могут этого сделать, и ограничения уникального индекса тоже не могут этого сделать. Кстати, контрольное ограничение может быть создано, чтобы гарантировать, что DateAdded < DateRemoved
(наряду с другими отношениями ограничений NULL/NOT NULL)
Нужно ли мне навязывать эти отношения из кода, транзакции, другой модели?
Возможно, есть шаблон проектирования, о котором я не знаю, который может помочь с хранением таких исторических данных?