আমি প্রায়শই ডাটাবেসের এমন পরিস্থিতিটি দেখতে পাই যেখানে প্রদত্ত টেবিলটি বিভিন্ন প্যারেন্ট টেবিলগুলির মধ্যে একটিতে এফকে করতে পারে। আমি সমস্যার দুটি সমাধান দেখেছি, তবে উভয়ই ব্যক্তিগতভাবে সন্তুষ্ট নয়। আমি কৌতূহল করছি আপনি সেখানে অন্যান্য কোন নিদর্শনগুলি দেখেছেন? এটা করতে একটি ভাল উপায় আছে কি?
একটি কন্ট্রিবিউড উদাহরণ
যাক আমার সিস্টেমটি রয়েছে Alerts
। সতর্কতা বিভিন্ন অবজেক্টের জন্য গ্রাহক, সংবাদ এবং পণ্যগুলির জন্য প্রাপ্ত হতে পারে। প্রদত্ত সতর্কতা এক এবং একমাত্র এক আইটেমের জন্য হতে পারে। গ্রাহকগণ, নিবন্ধগুলি এবং পণ্যগুলি যে কোনও কারণে দ্রুত চলমান (বা স্থানীয়করণ করা) যাতে সতর্কতা তৈরি হওয়ার পরে প্রয়োজনীয় পাঠ্য / ডেটা সতর্কতার সাথে টানা যায় না। এই সেটআপ দেওয়া আমি দুটি সমাধান দেখেছি।
দ্রষ্টব্য: ডিডিএলের নীচে এসকিউএল সার্ভারের জন্য তবে আমার প্রশ্নটি কোনও ডিবিএমএসের ক্ষেত্রে প্রযোজ্য।
সমাধান 1 - একাধিক নুলযোগ্য এফকেস
এই সমাধানটিতে যে টেবিলগুলির মধ্যে একটির মধ্যে একাধিক সারণীর লিঙ্ক রয়েছে তাতে একাধিক এফকে কলাম রয়েছে (ব্রেভিটির জন্য নীচে ডিডিএল এফকে তৈরি দেখায় না)। ভাল - এই সমাধানটিতে আমার কাছে বিদেশী চাবি আছে তা খুব ভাল। এফকে'র নাল-অপ্টিনালিটি সঠিক ডেটা যুক্ত করতে এটি সুবিধাজনক এবং তুলনামূলকভাবে সহজ করে তোলে। খারাপ জিজ্ঞাসাবাদ দুর্দান্ত নয় কারণ এর সাথে সম্পর্কিত ডেটা পেতে N বাম জয়েন্টস বা এন ইউনিয়ন বিবৃতি প্রয়োজন। এসকিউএল সার্ভারে, বিশেষত বাম জয়েন্টগুলি একটি সূচীকরণ ভিউ তৈরি করা থেকে বিরত থাকে।
CREATE TABLE Product (
ProductID int identity(1,1) not null,
CreateUTC datetime2(7) not null,
Name varchar(100) not null
CONSTRAINT PK_Product Primary Key CLUSTERED (ProductID)
)
CREATE TABLE Customer (
CustomerID int identity(1,1) not null,
CreateUTC datetime2(7) not null,
Name varchar(100) not null
CONSTRAINT PK_Customer Primary Key CLUSTERED (CustomerID)
)
CREATE TABLE News (
NewsID int identity(1,1) not null,
CreateUTC datetime2(7) not null,
Name varchar(100) not null
CONSTRAINT PK_News Primary Key CLUSTERED (NewsID)
)
CREATE TABLE Alert (
AlertID int identity(1,1) not null,
CreateUTC datetime2(7) not null,
ProductID int null,
NewsID int null,
CustomerID int null,
CONSTRAINT PK_Alert Primary Key CLUSTERED (AlertID)
)
ALTER TABLE Alert WITH CHECK ADD CONSTRAINT CK_OnlyOneFKAllowed
CHECK (
(ProductID is not null AND NewsID is null and CustomerID is null) OR
(ProductID is null AND NewsID is not null and CustomerID is null) OR
(ProductID is null AND NewsID is null and CustomerID is not null)
)
সমাধান 2 - প্রতিটি পিতামাতার সারণীতে একটি এফকে
এই সমাধানে প্রতিটি 'পিতামাতার' সারণিতে সতর্কতার সারণিতে একটি এফকে থাকে। এটি পিতামাতার সাথে সম্পর্কিত সতর্কতাগুলি পুনরুদ্ধার করা সহজ করে তোলে। নীচের দিকে, সতর্কতা থেকে কে রেফারেন্সের কোনও সত্যিকারের চেইন নেই। তদতিরিক্ত, ডেটা মডেল এতিম সতর্কতার জন্য অনুমতি দেয় - যেখানে কোনও পণ্য, সংবাদ বা গ্রাহকের সাথে কোনও সতর্কতা জড়িত থাকে না। আবার, সমিতিটি বের করার জন্য একাধিক বাম জোনে যোগ দিন।
CREATE TABLE Product (
ProductID int identity(1,1) not null,
CreateUTC datetime2(7) not null,
Name varchar(100) not null
AlertID int null,
CONSTRAINT PK_Product Primary Key CLUSTERED (ProductID)
)
CREATE TABLE Customer (
CustomerID int identity(1,1) not null,
CreateUTC datetime2(7) not null,
Name varchar(100) not null
AlertID int null,
CONSTRAINT PK_Customer Primary Key CLUSTERED (CustomerID)
)
CREATE TABLE News (
NewsID int identity(1,1) not null,
CreateUTC datetime2(7) not null,
Name varchar(100) not null
AlertID int null,
CONSTRAINT PK_News Primary Key CLUSTERED (NewsID)
)
CREATE TABLE Alert (
AlertID int identity(1,1) not null,
CreateUTC datetime2(7) not null,
CONSTRAINT PK_Alert Primary Key CLUSTERED (AlertID)
)
এটি কি একটি সম্পর্কের ডাটাবেসে কেবল জীবন? আপনি কি আরও সন্তুষ্টিজনক বিকল্প বিকল্প আছে?
Alertable
। কোন মানে?