শূন্য-বা-এক থেকে শূন্য-বা-এক


9

আমি কীভাবে সিকিওএল সার্ভারে সবচেয়ে প্রাকৃতিক উপায়ে শূন্য-বা-একের সাথে শূন্য-বা-ওয়ান সম্পর্কের মডেল করব?

একটি 'হ্যাজার্ড' টেবিল রয়েছে যা কোনও সাইটে বিপত্তিগুলি তালিকা করে। কাজের জন্য একটি 'টাস্ক' সারণী রয়েছে যা কোনও সাইটে করা দরকার। কিছু টাস্ক একটি বিপত্তি ঠিক করতে হয়, কোনও কাজ একাধিক বিপদ মোকাবেলা করতে পারে না। কিছু হ্যাজার্ডগুলির সেগুলি ঠিক করার একটি কাজ রয়েছে। কোনও বিপত্তি তাদের সাথে দুটি কাজ যুক্ত থাকতে পারে না।

নীচে আমি ভাবতে পারি সেরা:

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

আপনি কি অন্যভাবে এটি করবেন? এই সেট আপটি নিয়ে আমি সন্তুষ্ট না হওয়ার কারণটি হ'ল যে কাজগুলি এবং বিপদগুলি একে অপরের দিকে নির্দেশ করে এবং অন্য কাজ ও বিপত্তিগুলির দিকে লক্ষ্য করে না এবং কোনও কার্য / বিপত্তি একই বিপদ / কার্যকে নির্দেশ করে না তা নিশ্চিত করার জন্য অ্যাপ্লিকেশন যুক্তি থাকা দরকার sure অন্য একটি কাজ / বিপত্তি নির্দেশ করে।

একটি ভাল উপায় আছে কি?

এখানে চিত্র বর্ণনা লিখুন


আপনি কি টাস্কআইডি-তে হ্যাজার্ড টেবিলে অনন্য সূচক এবং টাস্ক টেবিলে হাজার্ডআইডির একটি অনন্য সূচক তৈরি করতে না পারার কোনও কারণ আছে? এটি এটি তৈরি করবে যাতে আপনি কেবল তাদের মধ্যে একটি টেবিলের মধ্যে থাকতে পারেন, যা আমি মনে করি আপনি কী অর্জন করতে চাইছেন।
মিসকিনার 0

@ এসমিনার কিন্তু এগুলি অনন্য নয়, তাদের অনেকগুলিই হতে পারে null
অ্যান্ড্রু সাভিনিখ 20'15

আহ, গ্যাচা সেক্ষেত্রে মিঃ বেন- গানের কীভাবে একাধিক নালকে এখানে sqlmag.com/sql-server-2008/unique-constraint-m Multipleple- nulls অনুমোদনের জন্য সেই সীমাবদ্ধতা তৈরি করা যায় সে সম্পর্কে একটি দুর্দান্ত রচনা রয়েছে । আমি মনে করি এটি আপনার পক্ষে কাজ করবে। না হলে আমাকে জানাবেন।
মিসকিনার

এটির পার্শ্ব দ্রষ্টব্য হিসাবে, ফিল্টারড সূচকগুলি ব্যবহার করে বেশ কয়েকটি সমস্যা রয়েছে, তাই আপনি যদি পরিচিত না হন তবে সম্ভবত সেগুলি পড়তে হবে। এখানে এটি একটি ভাল ব্লগ। ব্লগস.এমএসএন / বি / এসকিএলপিগ্রোম্ম্যাবিলিটি / অর্চিভ / ২০০৯ / 6 / ২ / / ,, তবে এই নির্দিষ্ট দৃশ্যের জন্য এটি আপনার পক্ষে ভাল কাজ করতে পারে, ধরে নেওয়া অন্য বিষয়গুলি আপনাকে খুব বেশি দুঃখের কারণ না করে।
মিসকিনার 0

FWIW একটি অনন্য ফিল্টার সূচক শুধুমাত্র অ নাল সারি, যেমন করতে স্বতন্ত্রতা আবেদন করতে পারেনCREATE UNIQUE INDEX x ON dbo.Hazards(TaskID) WHERE TaskID IS NOT NULL;
হারুন বারট্রান্ড

উত্তর:


9

আপনি বর্তমান সেট আপ থেকে বিদেশী কীগুলির একটি অপসারণ করে, বা বিষয়গুলিকে প্রতিসাম্য রাখতে, আপনার উভয় বিদেশী কী সরিয়ে এবং প্রতিটি রেফারেন্সে একটি অনন্য বাধা সহ একটি জংশন টেবিল প্রবর্তন করতে আপনি একটি অসমিত্মীয় স্কিমার নিজস্ব ধারণার সাথে যেতে পারেন ।

সুতরাং, এটি এই মত হবে:

CREATE TABLE dbo.Hazard
(
  HazardId int IDENTITY(1,1) NOT NULL CONSTRAINT PK_Hazard PRIMARY KEY CLUSTERED,
  Details varchar(max) NULL
);

CREATE TABLE dbo.Task
(
  TaskId int IDENTITY(1,1) NOT NULL CONSTRAINT PK_Task PRIMARY KEY CLUSTERED,
  Details varchar(max) NULL,
);

CREATE TABLE dbo.HazardTask
(
  HazardId int NOT NULL
    CONSTRAINT FK_HazardTask_Hazard FOREIGN KEY REFERENCES dbo.Hazard (HazardId)
    CONSTRAINT UQ_HazardTask_Hazard UNIQUE,
  TaskId int NOT NULL
    CONSTRAINT FK_HazardTask_Task FOREIGN KEY REFERENCES dbo.Task (TaskId)
    CONSTRAINT UQ_HazardTask_Task UNIQUE
);

(HazardId, TaskId)যদি আপনাকে অন্য টেবিল থেকে এই সংমিশ্রণগুলি উল্লেখ করতে হয় তবে আপনি প্রাথমিক কী হিসাবে ঘোষণা করতে পারেন। জোড়গুলি অনন্য রাখার উদ্দেশ্যে, তবে প্রাথমিক কীটি অপ্রয়োজনীয়, এটি প্রতিটি আইডি অনন্য।


1
+1 আমি মনে করি যে এই ধরনের সম্পর্ক বাস্তবায়নের সবচেয়ে প্রাকৃতিক উপায়। তবে সাধারনত কেউ প্রাথমিকভাবে কেবল একটি টুপল নির্বাচন করেন যদি এটি ন্যূনতম হয় তবে টিপলের (HazardId, TaskId)টিপল থাকে (HazardId)এবং (TaskId)উভয়ই এই টেবিলের একটি সারি স্বতন্ত্রভাবে চিহ্নিত করে identify এর মধ্যে একটিতে প্রাথমিক কী হিসাবে নির্বাচন করা উচিত।
चमत्कार 173

2

সংক্ষেপে:

  • বিপদের একটি বা শূন্য কার্য রয়েছে
  • কার্যগুলির মধ্যে একটি বা শূন্য বিপদ রয়েছে

যদি টাস্ক এবং হ্যাজার্ড সারণীগুলি অন্য কোনও কিছুর জন্য ব্যবহার করা হয় (যেমন কাজগুলি এবং / বা বিপত্তিগুলির সাথে সম্পর্কিত অন্যান্য ডেটা রয়েছে এবং আপনি যে মডেলটি আমাদের দেখিয়েছেন কেবলমাত্র প্রাসঙ্গিক ক্ষেত্রগুলি দেখানোর জন্য সরল করা হয়েছে) আমি বলব যে আপনার সমাধানটি সঠিক।

অন্যথায়, যদি কেবলমাত্র কার্য এবং বিপদগুলি একে অপরের সাথে মিলিত হওয়ার জন্য উপস্থিত থাকে, আপনার দুটি টেবিলের প্রয়োজন হবে না; নিম্নলিখিত ক্ষেত্রগুলির সাথে আপনি তাদের সম্পর্কের জন্য একটি টেবিল তৈরি করতে পারেন:

ID            int, PK
TaskID        int, (filtered) unique index  
TaskDetails   varchar
HazardID      int, (filtered) unique index
HazardDetails varchar

1
আমি স্পষ্ট করে বলার স্বাধীনতা নিয়েছি যে এটি প্রতিটি ক্ষেত্রেই একটি ফিল্টার সূচক হওয়া উচিত, (যদিও এটি সমস্যার বর্ণনা থেকে অনুমান করা যেতে পারে, এটি সম্পূর্ণ সুস্পষ্ট বলে মনে হচ্ছে না)। আপনি যদি অপ্রয়োজনীয় বোধ করেন বা ধারণাটি অন্যভাবে জানান দিতে চান তবে দয়া করে আরও সম্পাদনা করুন to
অ্যান্ড্রি এম

আমার অবশ্যই বলতে হবে আমি এখনও এই ধারণার সাথে সত্যই সন্তুষ্ট নই। বিষয়টি হ'ল আমাকে নিজেই টাস্কআইডি এবং হ্যাজার্ডআইডি উত্পন্ন করতে হবে। এটি যদি 2012 হয় তবে এর জন্য সিক্যুয়েন্সগুলি ব্যবহার করা সম্ভব হবে তবে তারপরেও এটি আমার কাছে সঠিক মনে হবে না। আমি অনুমান করি কারণ এটি দুটি কারণ, কাজ এবং বিপদগুলি সম্পূর্ণ পৃথক সত্তা এবং তাই এগুলি একক টেবিলে সংরক্ষণের ধারণার সাথে পুনর্মিলন করা শক্ত।
অ্যান্ড্রি এম

যদি এই নকশাটি চয়ন করা হয় তবে আমাদের কেন TaskIDএবং প্রয়োজন HazardID? আপনি 2 বিআইটি কলাম, থাকতে পারে IsTask, IsHazardএবং একটি বাধ্যতা যে তাদের উভয়ের মিথ্যা। তারপরে Hazardটেবিলটি কেবল একটি দৃশ্য: CRAETE VIEW Hazard SELECT HazardID = ID, HazardDetails, ... FROM ThisTable WHERE IsHazard = 1;এবং যথাক্রমে টাস্ক।
ypercubeᵀᴹ

@ ইপারকিউব আপনি একটি টেবিলের মধ্যে একটি নির্লজ্জ জিনিস সংরক্ষণ করবেন এবং তারপরে এটি একটি কার্য বা হ্যাজার্ড কিনা তা জানাতে একটি বাইনারি ক্ষেত্র ব্যবহার করবেন। এটি কুৎসিত ডাটাবেস মডেলিং।
dr_

@ অ্যান্ড্রিএম আমি বুঝতে পেরেছি এবং আমি সম্মত হই যে, বেশিরভাগ ক্ষেত্রে আমাদের একই ধরণের দুটি ধরণের আলাদা আলাদা সত্ত্বা সংরক্ষণ করা উচিত নয়। তবে, আমার সাবধানবাণীটি পড়ুন: যদি কাজগুলি এবং বিপদগুলি 1-থেকে -1 সম্পর্কের মধ্যে থাকে এবং কেবল এর জন্য উপস্থিত থাকে তবে এটি একটি একক সারণী ব্যবহার করা গ্রহণযোগ্য।
dr_

1

অন্য একটি পদ্ধতির যা এখনও উল্লেখ করা হয়নি বলে মনে হচ্ছে হ্যাজার্ডস এবং টাস্কগুলি একই আইডি স্পেস ব্যবহার করবে। যদি কোনও হ্যাজার্ডের কোনও টাস্ক থাকে তবে তার একই আইডি থাকবে। কোনও কাজ যদি হ্যাজার্ডের পক্ষে হয় তবে এটির একই আইডি থাকবে।

আপনি এই আইডিগুলি পপুলেশন করতে পরিচয় কলামগুলির চেয়ে একটি ক্রম ব্যবহার করবেন।

এই ধরণের ডেটা মডেলের প্রশ্নগুলি তাদের ফলাফলগুলি পুনরুদ্ধার করতে (পূর্ণ) বাইরের সাথে যোগদান করবে।

এই উত্তরটি @ অ্যান্ড্রিএম এর উত্তরের সাথে তার মিলের সাথে মিলে যায় তবে তার উত্তর আইডি আলাদা হওয়ার অনুমতি দেয় এবং এই সম্পর্কটি সংরক্ষণ করার জন্য একটি টেবিল।

আমি নিশ্চিত নই যে আপনি এই পদ্ধতিরটিকে দুটি টেবিলের দৃশ্যের জন্য ব্যবহার করতে চান তবে জড়িত সারণীর সংখ্যা বৃদ্ধি পেলে এটি ভাল কাজ করে।


অবদানের জন্য আপনাকে ধন্যবাদ, আমিও সেই পদ্ধতির বিষয়টি বিবেচনা করেছি। আমি শেষ পর্যন্ত এটির বিরুদ্ধে সিদ্ধান্ত নিয়েছি কারণ সিক্যুয়াল ২০০৮ সালে প্রয়োগ করার পক্ষে ক্রমটি বিশ্রী এবং আমি যতটা করতে চাই তার চেয়েও বেশি সমস্যা।
অ্যান্ড্রু সাভিনিখ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.