¿Cómo modelo la relación de cero o uno a cero o uno en Sql Server de la manera más natural?
Hay una tabla de 'Peligro' que enumera los peligros en un sitio. Hay una tabla de "Tareas" para el trabajo que debe hacerse en un sitio. Algunas tareas son para solucionar un peligro, ninguna tarea puede hacer frente a múltiples peligros. Algunos peligros tienen la tarea de solucionarlos. Ningún peligro puede tener dos tareas asociadas con ellos.
Lo siguiente es lo mejor que se me ocurre:
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
¿Harías eso de manera diferente? La razón por la que no estoy contento con esta configuración es que debe existir una lógica de aplicación para asegurarse de que las tareas y los peligros se señalen entre sí y no a otras tareas y peligros, y que ninguna tarea / peligro señale al mismo peligro / tarea otra tarea / puntos de peligro a.
¿Hay una mejor manera?
null
.
CREATE UNIQUE INDEX x ON dbo.Hazards(TaskID) WHERE TaskID IS NOT NULL;