Bagaimana cara saya memodelkan hubungan nol atau satu ke nol atau satu di Sql Server dengan cara yang paling alami?
Ada tabel 'Bahaya' yang mencantumkan bahaya di situs. Ada tabel 'Tugas' untuk pekerjaan yang perlu dilakukan di situs. Beberapa Tugas adalah untuk memperbaiki bahaya, tidak ada tugas yang dapat menangani beberapa bahaya. Beberapa Bahaya memiliki tugas untuk memperbaikinya. Tidak ada bahaya yang dapat memiliki dua tugas yang terkait dengannya.
Di bawah ini adalah yang terbaik yang bisa saya pikirkan:
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
Apakah Anda akan melakukannya secara berbeda? Alasan saya tidak senang dengan pengaturan ini adalah bahwa harus ada logika aplikasi untuk memastikan bahwa tugas dan bahaya menunjuk satu sama lain dan tidak ke tugas dan bahaya lain dan bahwa tidak ada tugas / bahaya menunjuk ke bahaya / tugas yang sama tugas / bahaya lain menunjuk ke.
Apakah ada cara yang lebih baik?
null
.
CREATE UNIQUE INDEX x ON dbo.Hazards(TaskID) WHERE TaskID IS NOT NULL;