Рекомендуется ли применять несколько идентификаторов внешнего ключа в одном столбце

#sql #sql-server #sql-server-2012

Вопрос:

У меня есть таблица, в которой я храню разные документы из разных источников следующим образом

 CREATE TABLE [dbo].[Document](
    [DocumentId] [int] IDENTITY(1,1) NOT NULL,
    [EntityId] [int] NOT NULL,
    [DocumentGuid] [uniqueidentifier] NOT NULL,
    [DocumentTypeCdId] [int] NOT NULL,
    [DocumentName] [nvarchar](500) NOT NULL,
    [DocumentType] [nvarchar](500) NOT NULL,
    [DocumentData] [nvarchar](max) NOT NULL,
    [IsSuppressed] [bit] NULL,
    [CreatedBy] [nvarchar](200) NULL,
    [CreatedDt] [datetime] NULL,
    [UpdatedBy] [nvarchar](200) NULL,
    [UpdatedDt] [datetime] NULL,
 CONSTRAINT [PK_Document] PRIMARY KEY CLUSTERED 
(
    [DocumentId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

ALTER TABLE [dbo].[Document]  WITH CHECK ADD  CONSTRAINT [FK_Document_DocumentTypeCd] FOREIGN KEY([DocumentTypeCdId])
REFERENCES [dbo].[DocumentTypeCd] ([DocumentTypeCdId])
GO

ALTER TABLE [dbo].[Document] CHECK CONSTRAINT [FK_Document_DocumentTypeCd]
GO
 

EntityId будет из разных исходных таблиц, поэтому я могу добавить этот столбец, чтобы он был FK всех этих исходных таблиц. В настоящее время у меня есть почти 10 исходных таблиц. Если нет, то каков лучший подход к решению этого сценария

Комментарии:

1. Столбец не может быть внешним ключом разных столбцов из нескольких таблиц, это просто не сработает. Как бы он узнал, с какой таблицей нужно проверить ее действительность?

2. У меня есть главная таблица DocumentTypeCd, в которой указано, к чему она относится

3. Так в чем же тогда проблема?

4. Я просто хочу знать, хорошая ли это практика

5. Различные источники-это ваша главная проблема.

Ответ №1:

У вас проблема с дизайном вашей базы данных. В таком случае вам нужна родительская таблица предков, в которой хранятся ключи всех типов документов, а затем несколько дочерних таблиц, каждая из которых предназначена для определенного типа документа.

Это называется наследованием, и дочерние элементы не должны иметь одно и то же значение ключа (таблица дочерних элементов с идентификаторами исключений…)