Як я моделюю відносини нуль або один до нуля або один на Sql Server найбільш природним способом?
Існує таблиця "небезпеки", яка містить перелік небезпек на сайті. Існує таблиця "Завдання" для роботи, яку потрібно виконати на сайті. Деякі завдання - виправити небезпеку, жодне завдання не може боротися з кількома небезпеками. Деякі небезпеки мають завдання їх усунути. Без небезпеки не може бути пов'язано з ними два завдання.
Нижче - найкраще, про що я міг придумати:
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
Ви зробили б це по-іншому? Причиною, що я не задоволений цим налаштуванням, є те, що потрібно застосувати логіку програми, щоб переконатися, що завдання та небезпеки вказують один на одного, а не на інші завдання та небезпеки, і що жодне завдання / небезпека не вказує на однакову небезпеку / завдання інше завдання / небезпека вказує на.
Чи є кращий спосіб?
null
.
CREATE UNIQUE INDEX x ON dbo.Hazards(TaskID) WHERE TaskID IS NOT NULL;