Jak w najbardziej naturalny sposób modelować relację zero-jedynka do zera jeden lub jeden w Sql Server?
Istnieje tabela „Zagrożenia”, która zawiera listę zagrożeń w witrynie. Istnieje tabela „Zadań” do pracy, którą należy wykonać na stronie. Niektóre zadania mają naprawić zagrożenie, żadne zadanie nie może poradzić sobie z wieloma zagrożeniami. Niektóre zagrożenia mają za zadanie je naprawić. Żadnemu zagrożeniu nie można przypisać dwóch zadań.
Poniżej jest najlepsze, o czym mogłem myśleć:
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
Czy zrobiłbyś to inaczej? Powodem, dla którego nie jestem zadowolony z tej konfiguracji jest to, że musi istnieć logika aplikacji, aby upewnić się, że zadania i zagrożenia wskazują na siebie nawzajem, a nie na inne zadania i zagrożenia, i że żadne zadanie / zagrożenie nie wskazuje na to samo zagrożenie / zadanie inne zadanie / zagrożenie wskazuje na.
Czy jest lepszy sposób?
null
.
CREATE UNIQUE INDEX x ON dbo.Hazards(TaskID) WHERE TaskID IS NOT NULL;