Wie modelliere ich die Null-oder-Eins-zu-Null-oder-Eins-Beziehung in SQL Server auf natürlichste Weise?
Es gibt eine 'Hazard'-Tabelle, in der die Gefahren auf einer Site aufgelistet sind. Es gibt eine Aufgabentabelle für Arbeiten, die an einer Site ausgeführt werden müssen. Einige Aufgaben dienen dazu, eine Gefahr zu beheben. Keine Aufgabe kann mehrere Gefahren bewältigen. Einige Gefahren haben die Aufgabe, sie zu beheben. Mit keiner Gefahr können zwei Aufgaben verbunden sein.
Das Folgende ist das Beste, was ich mir vorstellen kann:
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
Würden Sie das anders machen? Der Grund, warum ich mit dieser Einrichtung nicht zufrieden bin, ist, dass es eine Anwendungslogik geben muss, um sicherzustellen, dass Aufgaben und Gefahren aufeinander und nicht auf andere Aufgaben und Gefahren verweisen und dass keine Aufgabe / Gefahr auf dieselbe Gefahr / Aufgabe verweist eine andere Aufgabe / Gefahr weist auf.
Gibt es einen besseren Weg?
null
.
CREATE UNIQUE INDEX x ON dbo.Hazards(TaskID) WHERE TaskID IS NOT NULL;