Como modelar o relacionamento zero ou um para zero ou um no Sql Server da maneira mais natural?
Existe uma tabela 'Perigos' que lista os perigos em um site. Há uma tabela 'Tarefa' para o trabalho que precisa ser realizado em um site. Algumas tarefas são para corrigir um risco, nenhuma tarefa pode lidar com vários riscos. Alguns perigos têm uma tarefa para corrigi-los. Nenhum risco pode ter duas tarefas associadas a eles.
O abaixo é o melhor que eu poderia pensar:
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
Você faria isso de maneira diferente? O motivo pelo qual não estou satisfeito com essa configuração é que é preciso haver uma lógica de aplicativo para garantir que as tarefas e os perigos apontem um para o outro e não para outras tarefas e perigos e que nenhuma tarefa / perigo aponte para o mesmo perigo / tarefa outra tarefa / perigo aponta para.
Existe uma maneira melhor?
null
.
CREATE UNIQUE INDEX x ON dbo.Hazards(TaskID) WHERE TaskID IS NOT NULL;