এমন কি ডিবিএমএস রয়েছে যা একটি বিদেশী কীকে অনুমতি দেয় যা একটি দর্শনকে উল্লেখ করে (এবং কেবল বেস টেবিলগুলিই নয়)?


22

জ্যাঙ্গো মডেলিংয়ের প্রশ্নের দ্বারা অনুপ্রাণিত: জাজানোতে একাধিক বহু-বহু সম্পর্কের সাথে ডেটাবেস মডেলিং । ডিবি-ডিজাইন এমন কিছু:

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% সন্তোষজনক সমাধান নেই - এবং জ্যাঙ্গো প্রশ্নটি আমারও নয়! - আমি সমস্যার উপর সম্ভাব্য আক্রমণ সম্পর্কিত একটি সাধারণ কৌশল সম্পর্কে আরও আগ্রহী, বিস্তারিত সমাধান নয়। সুতরাং, "ডিবিএমএস-এক্স এ এটি টেবিল এ ট্রিগার দিয়ে করা যেতে পারে" এর মতো উত্তর পুরোপুরি গ্রহণযোগ্য।


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

@ অ্যারন: হ্যাঁ, আপনাকে ধন্যবাদ আমি পড়েছি যে ওরাকল ভিউগুলিতে পিকে পোশাকের জন্য সমর্থন করে। তবে এটি নিশ্চিত নয় যে এটি এই পরিস্থিতিতে কাজ করবে কিনা। এবং ২ য় প্রশ্নের উত্তর (দর্শনে এফকে সম্পর্কে) সম্ভবত ওরাকলে নেতিবাচক।
ypercubeᵀᴹ

তবে আমি শিখতে আগ্রহী অন্য কোনও সমাধান আছে কিনা (ট্রিগার, কস্টেরেন্টগুলি বা অন্যান্য কম্বো)
ypercubeᵀᴹ

উত্তর:


9

এই ব্যবসায়ের নিয়মটি কেবল সীমাবদ্ধতা ব্যবহার করে মডেলটিতে প্রয়োগ করা যেতে পারে। নিম্নলিখিত সমস্যাটি আপনার সমস্যার সমাধান করা উচিত। আপনার দেখার পরিবর্তে এটি ব্যবহার করুন:

    CREATE TABLE BookAspectCommonTagLink
    (  BookID INT NOT NULL
    , AspectID INT NOT NULL
    , TagID INT NOT NULL
--TagID is deliberately left out of PK
    , PRIMARY KEY (BookID, AspectID)
    , FOREIGN KEY (BookID, TagID) 
        REFERENCES BookTag (BookID, TagID)
    , FOREIGN KEY (AspectID, TagID) 
        REFERENCES AspectTag (AspectID, TagID)
    ) ;

ওহ্ দারুণ. আমি কেবল ভাবতে পারি যে বুকট্যাগগুলি এবং ট্যাগএস্পেক্টস সন্নিবেশ / মোছার ক্ষেত্রে প্রবর্তিত জটিলতা। প্রতিবার যেমন একটি নতুন বুকট্যাগ (বা ট্যাগআস্পেক্ট) মুছে ফেলা হয়, এই টেবিলের সাথে সম্পর্কিত সারিগুলি সরিয়ে এবং / অথবা TagIDএকই বুকস্পেক্ট সংমিশ্রণের সাথে সম্পর্কিত অন্য কোনও ট্যাগে পরিবর্তন করতে একটি অনুসন্ধান করতে হবে ।
ypercubeᵀᴹ

এবং সেই 2 টি টেবিলের মধ্যে সন্নিবেশ করানোর জন্য অনুরূপ অনুসন্ধান করতে হবে। তবে জটিল বিধিগুলির জন্য জটিল পদ্ধতিগুলির প্রয়োজন হয়, সুতরাং এটি সত্যিই দুর্দান্ত দেখাচ্ছে।
ypercubeᵀᴹ

@ টাইপ्यूब আপনি যখন কোনও ট্যাগ মুছে ফেলেন তখন আপনাকে একই বুক এবং দিকটি যুক্ত করে অন্য কোনও ট্যাগে চেক করা এবং সম্ভবত স্যুইচ করতে হবে। আপনি যখন নতুন ট্যাগ সন্নিবেশ করান, ততক্ষণ কোনও রেটিং inোকানোর প্রয়োজন না হওয়া পর্যন্ত কোনও চেক করার দরকার নেই।
একে

1
যদি সমস্যা সমাধানকারী এবং ডেটা এন্ট্রি ব্যক্তি একই ব্যক্তি হয় বা আপনি যদি ত্রুটি বার্তাটি শেষ ব্যবহারকারীর কাছে প্রকাশ করেন তবে অবশ্যই। আপনি এক ব্যক্তির দোকান সম্পর্কে খুব বেশি চিন্তা করছেন যেখানে আপনি সবকিছু করছেন।
অ্যারন বারট্র্যান্ড

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

8

আমি মনে করি আপনি দেখতে পাবেন যে অনেক ক্ষেত্রে জটিল ব্যবসার বিধিগুলি কেবলমাত্র মডেলের মাধ্যমে প্রয়োগ করা যায় না। এটি সেই ক্ষেত্রে একটি যেখানে কমপক্ষে এসকিউএল সার্ভারে আমি মনে করি একটি ট্রিগার (সাধারণত ট্রিগার পরিবর্তে একটি) আপনার উদ্দেশ্যকে আরও ভালভাবে সরবরাহ করে।


আরে হারুন, আপনি কি দয়া করে ব্যাখ্যা করতে পারেন যে এই ক্ষেত্রে কেন একটি সত্তা এবং কয়েকটি সীমাবদ্ধতার চেয়ে ট্রিগার সবচেয়ে ভাল পছন্দ?
একে

2
@ অ্যালেক্সকুজনেটসভ অবশ্যই, একাধিক মাল্টি-কলাম-বিদেশী কীগুলি কীভাবে এটি প্রয়োগ করতে হবে সে সম্পর্কে ভেবে আমি 17 ঘন্টা ব্যয় করি নি, এবং যাইহোক বৈধতা এবং ত্রুটি পরিচালনার ক্ষেত্রে যে সমস্ত অতিরিক্ত যুক্তি প্রয়োজন হতে পারে তা বিবেচনা করে?
অ্যারন বারট্র্যান্ড

2
ট্রিগারগুলির একটি নিখুঁত বাস্তবায়ন প্রবর্তন করতে পারে এমন জাতি শর্ত সম্পর্কে সতর্ক থাকুন। উদাহরণস্বরূপ, একটি লেনদেন ট্যাগ থেকে একটি বই সংযোগ বিচ্ছিন্ন করতে পারে এবং অন্যটি এখনও সংশ্লিষ্ট দিকের সাথে সংযোগ স্থাপন করা ঠিক বলে মনে করে, কারণ প্রথম লেনদেনটি এখনও প্রতিশ্রুতিবদ্ধ হয়নি। @ অ্যালেক্সকুজনসভ উত্তর দ্বারা প্রবর্তিত জটিলতাগুলি সম্ভবত আইএমএইচওর ক্ষেত্রে জাতিগত অবস্থা রোধ করতে প্রয়োজনীয় "প্রোটোকল" লকিংয়ের জটিলতা এবং ভঙ্গুরতার চেয়ে কম are
ব্র্যাঙ্কো দিমিত্রিজেভিচ

8

ওরাকল-এ, ঘোষিত ফ্যাশনে এই ধরণের বাধা প্রয়োগের একটি উপায় হ'ল এমন একটি বস্তুগত দৃষ্টি তৈরি করা যা প্রতিশ্রুতিবদ্ধতার উপর দ্রুত রিফ্রেশ করার জন্য সেট করা হয় যার প্রশ্নের সাথে সমস্ত অবৈধ সারিগুলি সনাক্ত করে (অর্থাত্ BookAspectRatingসারিগুলির কোনও মিল নেই BookAspect_view)। তারপরে আপনি সেই বৈষয়িক দৃশ্যে একটি তুচ্ছ বাধা তৈরি করতে পারেন যা ভৌতিক দৃষ্টিভঙ্গিতে কোনও সারি থাকলে লঙ্ঘন করা হবে। বস্তুগত দৃশ্যে আপনাকে নকল করতে হবে এমন পরিমাণের পরিমাণ হ্রাস করার এতে সুবিধা রয়েছে। এটি সমস্যার সৃষ্টি করতে পারে, যেহেতু সীমাবদ্ধতা কেবলমাত্র এই স্থানে কার্যকর করা হয় যে আপনি লেনদেন করছেন - অনেকগুলি অ্যাপ্লিকেশন এমন কোনও প্রত্যাশার জন্য লেখা হয়নি যা কোনও কমিট অপারেশন ব্যর্থ হতে পারে - এবং কারণ সীমাবদ্ধতা লঙ্ঘন কিছুটা শক্ত হতে পারে একটি নির্দিষ্ট সারি বা একটি নির্দিষ্ট টেবিলের সাথে সংযুক্ত করতে।


4

SIRA_PRISE এটি অনুমতি দেয়।

যদিও এফকে আর "এফকে" বলা হয় না, তবে কেবল "ডাটাবেস সীমাবদ্ধতা", এবং "ভিউ" আসলে একটি ভিউ হিসাবে সংজ্ঞায়িতও করতে হয় না, আপনি কেবলমাত্র ঘোষণার ভিতরে অভিব্যক্তির সংজ্ঞা সংশোধন করতে পারেন ডাটাবেস সীমাবদ্ধতা।

আপনার সীমাবদ্ধতা দেখতে এমন কিছু লাগবে

SEMIMINUS(BOOKASPECT , JOIN(BOOKTAG , TAGASPECT))

এবং তুমি করে ফেলেছ.

তবে বেশিরভাগ এসকিউএল ডিবিএমএস-এ, আপনাকে নিজের সীমাবদ্ধতার উপর বিশ্লেষণের কাজটি করতে হবে, এটি কীভাবে লঙ্ঘন করা যায় তা নির্ধারণ করুন এবং প্রয়োজনীয় ট্রিগারগুলি কার্যকর করতে পারেন।


আমি জানি. এটি লেখার সময় আমার কী গুরুত্বপূর্ণ মনে হয়েছিল তা প্রতিফলিত করে।
এরউইন স্মাউট

3

পোস্টগ্র্যাসকিউএল-তে, আমি ট্রিগারগুলি জড়িত না করেই কোনও সমাধানের কল্পনা করতে পারি না তবে এটি অবশ্যই সেভাবেই সমাধান করা যেতে পারে (এটি কোনও ধরণের অবলম্বন দৃষ্টিভঙ্গি বজায় রাখা বা ট্রিগার হওয়ার আগে BookAspectRating)। কোনও ভিউ ( ERROR: referenced relation "v_munkalap" is not a table) উল্লেখ করে কোনও বিদেশী কী নেই , প্রাথমিক কীটি ছেড়ে দিন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.