Come modellare la relazione da zero a uno a zero o uno in SQL Server nel modo più naturale?
Esiste una tabella "Hazard" che elenca i pericoli in un sito. Esiste una tabella "Attività" per il lavoro che deve essere svolto su un sito. Alcune attività consistono nel correggere un pericolo, nessuna attività può gestire più pericoli. Alcuni pericoli hanno il compito di risolverli. A nessun pericolo possono essere associati due compiti.
Di seguito è il migliore che mi viene in mente:
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
Lo faresti diversamente? Il motivo per cui non sono soddisfatto di questa configurazione è che è necessario disporre di una logica applicativa per assicurarsi che le attività e i pericoli puntino l'una verso l'altra e non verso altre attività e pericoli e che nessuna attività / pericolosità indichi la stessa pericolosità / attività un'altra attività / pericolo indica.
Esiste un modo migliore?
null
.
CREATE UNIQUE INDEX x ON dbo.Hazards(TaskID) WHERE TaskID IS NOT NULL;