मैं शून्य-या-एक-शून्य-या-एक-संबंध Sql सर्वर में सबसे प्राकृतिक तरीके से कैसे मॉडल करूं?
एक 'हेज़र्ड' तालिका है जो किसी साइट पर खतरों को सूचीबद्ध करती है। काम के लिए एक 'कार्य' तालिका है जिसे किसी साइट पर करने की आवश्यकता है। कुछ कार्य एक खतरे को ठीक करने के लिए हैं, कोई भी कार्य कई खतरों से नहीं निपट सकता है। कुछ खतरों को उन्हें ठीक करने का एक कार्य है। किसी भी खतरे से जुड़े दो कार्य नहीं हो सकते हैं।
नीचे सबसे अच्छा मैं के बारे में सोच सकता है:
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;