Если сами коды являются большими / громоздкими, то вы все равно можете использовать суррогаты там, где они доступны.
Так как вы хотите только обеспечить соответствие классов, тогда ваша таблица сопоставления может быть
ClauseID,
GroupClauseID,
Class (or possibly ClassID)
Для ваших основных таблиц у вас все еще будет PK (ClauseID) и уникальное ограничение (ClauseID, Class).Затем вы можете решить, следует ли просто FK (ClauseID, Class) или иметь два FK между таблицей сопоставления и каждой главной таблицей (фактически, вы бы тогда сказали, что один FK является ссылкой на внешний ключ, а другой предназначен дляприменять ваши правила).
У меня есть похожая настройка в одной из моих баз данных (например, система опроса):
CREATE TABLE [dbo].[DataItems](
[DataItemID] [uniqueidentifier] ROWGUIDCOL NOT NULL,
[TypeRequired] [varchar](10) NOT NULL,
[Name] [varchar](50) NOT NULL,
/* Other Columns */
CONSTRAINT [PK_DataItems] PRIMARY KEY NONCLUSTERED
(
[DataItemID] ASC
),
CONSTRAINT [UX_DataItems_ClientAnswerFKTarget] UNIQUE CLUSTERED
(
[DataItemID] ASC,
[TypeRequired] ASC
),
CONSTRAINT [UX_DataItems_Name] UNIQUE NONCLUSTERED
(
[Name] ASC
)
)
CREATE TABLE [dbo].[ClientAnswers](
[ClientAnswersID] [uniqueidentifier] ROWGUIDCOL NOT NULL,
[ClientID] [uniqueidentifier] NOT NULL,
[DataItemID] [uniqueidentifier] NOT NULL,
[TypeRequired] [varchar](10) NOT NULL,
[BoolValue] [bit] NULL,
[IntValue] [int] NULL,
[CharValue] [varchar](6500) NULL,
[CurrencyValue] [int] NULL,
[DateValue] [datetime] NULL,
/* Other Columns */
CONSTRAINT [PK_ClientAnswers] PRIMARY KEY CLUSTERED
(
[ClientID] ASC,
[DataItemID] ASC
)
)
GO
ALTER TABLE [dbo].[ClientAnswers] ADD CONSTRAINT [FK_ClientAnswers_DataItems] FOREIGN KEY([DataItemID],)
REFERENCES [dbo].[DataItems] ([DataItemID])
ON UPDATE CASCADE
GO
ALTER TABLE [dbo].[ClientAnswers] ADD CONSTRAINT [FK_ClientAnswers_DataItems_TypesMatch] FOREIGN KEY([DataItemID],TypeRequired)
REFERENCES [dbo].[DataItems] ([DataItemID],TypeRequired)
GO
А потом я иду дальше и имею больше ограничений, гарантирующихстолбец типа соответствует ненулевому значению * Столбец значения