জ্যাঙ্গো মডেলিংয়ের প্রশ্নের দ্বারা অনুপ্রাণিত: জাজানোতে একাধিক বহু-বহু সম্পর্কের সাথে ডেটাবেস মডেলিং । ডিবি-ডিজাইন এমন কিছু:
CREATE TABLE Book
( BookID INT NOT NULL
, BookTitle VARCHAR(200) NOT NULL
, PRIMARY KEY (BookID)
) ;
CREATE TABLE Tag
( TagID INT NOT NULL
, TagName VARCHAR(50) NOT NULL
, PRIMARY KEY (TagID)
) ;
CREATE TABLE BookTag
( BookID INT NOT NULL
, TagID INT NOT NULL
, PRIMARY KEY (BookID, TagID)
, FOREIGN KEY (BookID) REFERENCES Book (BookID)
, FOREIGN KEY (TagID) REFERENCES Tag (TagID)
) ;
CREATE TABLE Aspect
( AspectID INT NOT NULL
, AspectName VARCHAR(50) NOT NULL
, PRIMARY KEY (AspectID)
) ;
CREATE TABLE TagAspect
( TagID INT NOT NULL
, AspectID INT NOT NULL
, PRIMARY KEY (TagID, AspectID)
, FOREIGN KEY (TagID) REFERENCES Tag (TagID)
, FOREIGN KEY (AspectID) REFERENCES Aspect (AspectID)
) ;
এবং বিষয়টি হ'ল কীভাবে BookAspectRating
টেবিলটি সংজ্ঞায়িত করা যায় এবং রেফারেন্সিয়াল অখণ্ডতা প্রয়োগ করা যায়, তাই কেউ (Book, Aspect)
অবৈধ সংমিশ্রণের জন্য কোনও রেটিং যুক্ত করতে পারে না ।
আফাইক, জটিল CHECK
সীমাবদ্ধতা (বা ASSERTIONS
) যা সাবকিউরিজগুলিতে জড়িত এবং একাধিক টেবিল, সম্ভবত এটি সমাধান করতে পারে, কোনও ডিবিএমএস-তে উপলব্ধ নয়।
আরেকটি ধারণা হ'ল (সিউডোকোড) একটি ভিউ ব্যবহার করা:
CREATE VIEW BookAspect_view
AS
SELECT DISTINCT
bt.BookId
, ta.AspectId
FROM
BookTag AS bt
JOIN
Tag AS t ON t.TagID = bt.TagID
JOIN
TagAspect AS ta ON ta.TagID = bt.TagID
WITH PRIMARY KEY (BookId, AspectId) ;
এবং একটি সারণী যা উপরের দেখুনটির জন্য একটি বিদেশী কী রয়েছে:
CREATE TABLE BookAspectRating
( BookID INT NOT NULL
, AspectID INT NOT NULL
, PersonID INT NOT NULL
, Rating INT NOT NULL
, PRIMARY KEY (BookID, AspectID, PersonID)
, FOREIGN KEY (PersonID) REFERENCES Person (PersonID)
, FOREIGN KEY (BookID, AspectID)
REFERENCES BookAspect_view (BookID, AspectID)
) ;
তিনটি প্রশ্ন:
সেখানে DBMS করে একটি (সম্ভবত রূপায়িত) অনুমতি দেয়
VIEW
একটি সঙ্গেPRIMARY KEY
?সেখানে DBMS করে একটি অনুমতি দেয়
FOREIGN KEY
যেREFERENCES
একটিVIEW
(এবং না শুধুমাত্র একটি বেসTABLE
)?এই সততা সমস্যার অন্যথায় সমাধান করা যাবে - উপলব্ধ ডিবিএমএস বৈশিষ্ট্য সহ?
ব্যাখ্যা:
যেহেতু সম্ভবত কোনও 100% সন্তোষজনক সমাধান নেই - এবং জ্যাঙ্গো প্রশ্নটি আমারও নয়! - আমি সমস্যার উপর সম্ভাব্য আক্রমণ সম্পর্কিত একটি সাধারণ কৌশল সম্পর্কে আরও আগ্রহী, বিস্তারিত সমাধান নয়। সুতরাং, "ডিবিএমএস-এক্স এ এটি টেবিল এ ট্রিগার দিয়ে করা যেতে পারে" এর মতো উত্তর পুরোপুরি গ্রহণযোগ্য।