Sql Server'da sıfır veya bir ile sıfır veya bir ilişkisini en doğal şekilde nasıl modelleyebilirim?
Bir sitedeki tehlikeleri listeleyen bir 'Tehlike' tablosu vardır. Bir sitede yapılması gereken işler için bir 'Görev' tablosu vardır. Bazı Görevler bir tehlikeyi düzeltmek içindir, hiçbir görev birden fazla tehlikeyle başa çıkamaz. Bazı Tehlikelerin bunları düzeltmek gibi bir görevi vardır. Hiçbir tehlikenin kendisiyle ilişkili iki görevi olamaz.
Aşağıda aklıma gelen en iyisi var:
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
Bunu farklı yapar mısın? Bu kurulumdan memnun olmamamın nedeni, görevlerin ve tehlikelerin diğer görev ve tehlikeleri değil, birbirlerini işaret ettiğinden ve aynı tehlike / görevi gösteren hiçbir görev / tehlikenin olmadığından emin olmak için uygulama mantığının bulunması gerektiğidir. başka bir görev / tehlike işaret eder.
Daha iyi bir yol var mı?
null
.
CREATE UNIQUE INDEX x ON dbo.Hazards(TaskID) WHERE TaskID IS NOT NULL;