Если вы хотите предотвратить вставку «противоположной» строки, вам необходимо реализовать уникальное ограничение для пары столбцов, которым гарантировано определенное свойство (например, первое всегда ниже второго).
Для неориентированных графов простым подходом является проверка ограничения на таблицу, а затем обеспечение вставки данных в соответствии с ограничением.
Однако отношения, как правило, направлены отношения.Например, у меня будет таблица с FromID
, ToID
и Relationship
, где последний будет искать значения, такие как «Отец и дочь» (которые вы можете прочитать с неявным «От» в начале), которыепроясняет, что является FromID
, а что является ToID
.
Такая структура проясняет, что существует только один правильный путь для хранения этих отношений - но вы все равно не сможете гарантироватьчто, например, FromID
всегда ниже, чем ToID
и, возможно, пожелает предотвратить случайные вставки, которые являются неправильными (не допускайте, чтобы кто-то был одновременно и матерью, и дочерью другого)
Поэтому мы вводим индексированное представление , который синтезирует пару столбцов с этим отношением, а затем накладывает на него уникальное ограничение.
CREATE VIEW dbo.Relationships_DRI_Unique
WITH SCHEMABINDING
AS
SELECT
CASE WHEN FromID < ToID THEN FromID ELSE ToID END as Col1,
CASE WHEN FromID < ToID THEN ToID ELSE FromID END as Col2
FROM
dbo.Relationships
GO
CREATE UNIQUE INDEX IX_Relationships_DRI_Unique on dbo.Relationships_DRI_Unique (Col1,Col2)
(DRI
= Декларативная ссылочная целостность. Я использую эти буквы в именовании объектов.которые существуют исключительно для обеспечения ограничения. Я не ожидаю, что кто-нибудь когда-либо запросит это представление)