У меня есть две таблицы базы данных, которые связаны между собой:
CREATE TABLE [dbo].[TopicKeyword]
(
[Id] SMALLINT NOT NULL,
[Keyword] VARCHAR(100) NOT NULL,
[Volume] INT NOT NULL,
[PageId] SMALLINT NOT NULL,
CONSTRAINT [PK_TopicKeyword] PRIMARY KEY CLUSTERED ([Id] ASC)
);
CREATE TABLE [dbo].[TopicCluster]
(
[KeywordId] SMALLINT NOT NULL,
CONSTRAINT [PK_TopicCluster] PRIMARY KEY CLUSTERED ([KeywordId] ASC),
CONSTRAINT [FK_TopicCluster_TopicKeyword]
FOREIGN KEY ([KeywordId]) REFERENCES [dbo].[TopicKeyword] ([Id])
);
Как видите TopicCluster
ссылки TopicKeyword
с использованием KeywordId
.
Однако мне нужно обеспечить дополнительную целостность таблицы TopicCluster
.
PageID
в таблице TopicKeyword
может повторяться несколько раз, но в таблице TopicCluster
должно быть разрешено только одно ключевое слово на *1015*.
Например:
TopicKeyword
Id, PageId
- 1, 5
- 2, 6
- 3, 5 // 5 повторяется
TopicCluster
KeywordId
- 1
- 2
- 3 // не должно быть разрешено, потому что 1 уже ссылается на PageId: 5
Я создал решение, но я не специалист по SQL, поэтому я не уверен, что в данном случае это правильный подход. Вот снова таблицы, переработанные, чтобы включить новые ограничения:
CREATE TABLE [dbo].[TopicKeyword]
(
[Id] SMALLINT NOT NULL,
[Keyword] VARCHAR(100) NOT NULL,
[Volume] INT NOT NULL,
[PageId] SMALLINT NOT NULL,
CONSTRAINT [PK_TopicKeyword] PRIMARY KEY CLUSTERED ([Id] ASC)
);
GO
// New
CREATE UNIQUE NONCLUSTERED INDEX [IX_TopicKeyword_Id_PageId]
ON [dbo].[TopicKeyword]([Id] ASC, [PageId] ASC);
CREATE TABLE [dbo].[TopicCluster]
(
[KeywordId] SMALLINT NOT NULL,
[PageId] SMALLINT NOT NULL,
CONSTRAINT [PK_TopicCluster] PRIMARY KEY CLUSTERED ([KeywordId] ASC),
CONSTRAINT [AK_TopicCluster_PageId] UNIQUE NONCLUSTERED ([PageId] ASC), // New
CONSTRAINT [FK_TopicCluster_TopicKeyword] FOREIGN KEY ([KeywordId]) REFERENCES [dbo].[TopicKeyword] ([Id]),
CONSTRAINT [FK_TopicCluster_TopicKeyword2] FOREIGN KEY ([KeywordId], [PageId]) REFERENCES [dbo].[TopicKeyword] ([Id], [PageId]) // New
);
GO
// New
CREATE NONCLUSTERED INDEX [IX_TopicCluster_KeywordId_PageId]
ON [dbo]
Любой совет приветствуется.