Comment modéliser la relation zéro ou un à zéro ou un dans Sql Server de la manière la plus naturelle?
Il existe un tableau des «dangers» qui répertorie les dangers sur un site. Il existe une table «Tâche» pour le travail qui doit être effectué sur un site. Certaines tâches consistent à corriger un danger, aucune tâche ne peut faire face à plusieurs dangers. Certains dangers ont pour tâche de les résoudre. Aucun danger ne peut être associé à deux tâches.
Ce qui suit est le meilleur auquel j'ai pu penser:
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
Le feriez-vous différemment? La raison pour laquelle je ne suis pas satisfait de cette configuration est qu'il doit y avoir une logique d'application pour s'assurer que les tâches et les dangers pointent les uns vers les autres et non vers d'autres tâches et dangers et qu'aucune tâche / danger ne pointe vers le même danger / tâche. une autre tâche / un danger indique.
Y a-t-il une meilleure façon?
null
.
CREATE UNIQUE INDEX x ON dbo.Hazards(TaskID) WHERE TaskID IS NOT NULL;