Как мне естественным образом смоделировать отношение «ноль или один к нулю или один» в Sql Server?
Существует таблица «Опасность», в которой перечислены опасности на сайте. Существует таблица «Задачи» для работы, которую необходимо выполнить на сайте. Некоторые задачи заключаются в устранении опасности, ни одна задача не может справиться с несколькими опасностями. У некоторых опасностей есть задача их исправить. Никакая опасность не может иметь две задачи, связанные с ними.
Ниже это лучшее, что я мог придумать:
CREATE TABLE [dbo].[Hazard](
[HazardId] [int] IDENTITY(1,1) NOT NULL,
[TaskId] [int] NULL,
[Details] [varchar](max) NULL,
CONSTRAINT [PK_Hazard] PRIMARY KEY CLUSTERED
(
[HazardId] ASC
))
GO
ALTER TABLE [dbo].[Hazard] WITH CHECK ADD CONSTRAINT [FK_Hazard_Task] FOREIGN KEY([TaskId])
REFERENCES [dbo].[Task] ([TaskId])
GO
CREATE TABLE [dbo].[Task](
[TaskId] [int] IDENTITY(1,1) NOT NULL,
[HazardId] [int] NULL,
[Details] [varchar](max) NULL,
CONSTRAINT [PK_Task] PRIMARY KEY CLUSTERED
(
[TaskId] ASC
))
GO
ALTER TABLE [dbo].[Task] WITH CHECK ADD CONSTRAINT [FK_Task_Hazard] FOREIGN KEY([HazardId])
REFERENCES [dbo].[Hazard] ([HazardId])
GO
Вы бы сделали это по-другому? Причина, по которой я не доволен этой настройкой, заключается в том, что должна существовать логика приложения, чтобы убедиться, что задачи и опасности указывают друг на друга, а не на другие задачи и опасности, и что ни одна задача / опасность не указывает на одну и ту же опасность / задачу другая задача / опасность указывает на.
Есть ли способ лучше?
null
.
CREATE UNIQUE INDEX x ON dbo.Hazards(TaskID) WHERE TaskID IS NOT NULL;