ডাটাবেস ডিজাইন: একই টেবিলের সাথে অনেকের 2 টির অনেক সম্পর্ক


20

আমাকে এমন একটি পরিস্থিতি মডেল করতে হবে যেখানে আমার একটি টেবিল রয়েছে চেকিং_একাউন্ট (যার মধ্যে বাজেট, ইবান নম্বর এবং অ্যাকাউন্টের অন্যান্য বিবরণ রয়েছে) যা দুটি পৃথক টেবিল ব্যক্তি এবং কর্পোরেশনের সাথে সম্পর্কিত হতে পারে যার উভয়টিতে 0, 1 বা অনেকগুলি চেকিং অ্যাকাউন্ট থাকতে পারে।

অন্য কথায় একই টেবিলে চেকিং অ্যাকাউন্টের সাথে আমার দুটি 1 টির বহু সম্পর্ক রয়েছে

আমি এই সমস্যার সমাধানগুলি শুনতে চাই যা সাধারণীকরণের প্রয়োজনীয়তাগুলিকে সম্মান করে। আমি প্রায় সমাধান শুনেছি:

1) একটি সাধারণ সত্তা খুঁজে নিন যার মধ্যে ব্যক্তি এবং কর্পোরেশন উভয়ই অন্তর্ভুক্ত এবং এটি এবং চেকিং_ অ্যাকাউন্ট অ্যাকাউন্টের টেবিলের মধ্যে একটি লিঙ্ক টেবিল তৈরি করে, এটি আমার ক্ষেত্রে সম্ভব নয় এবং এমনকি যদি আমি সাধারণ সমস্যাটি সমাধান করতে চাই তবে এই নির্দিষ্ট উদাহরণটি নয়।

2) দুটি লিঙ্ক টেবিল তৈরি করুন পার্সোনটোচেকিংএকাউন্ট এবং কর্পোরেশন টোচেকিংএকউন্ট যা চেকিং অ্যাকাউন্টগুলির সাথে দুটি সত্তাকে সম্পর্কিত করে। তবে আমি চাই না যে দু'জন ব্যক্তির একই চেকিং অ্যাকাউন্ট থাকুক এবং আমি চেকিং অ্যাকাউন্টটি ভাগ করার জন্য কোনও প্রাকৃতিক ব্যক্তি এবং কর্পোরেশন চাই না! এই চিত্রটি দেখুন

http://i41.tinypic.com/35i6kbk.png

৩) চেকিং অ্যাকাউন্টে দুটি বিদেশী কী তৈরি করুন যা কর্পোরেশন এবং প্রাকৃতিক ব্যক্তির দিকে নির্দেশ করে, তবে আমি এইভাবে প্রয়োগ করব যে একজন ব্যক্তি এবং একটি সংস্থার অনেকগুলি চেকিং অ্যাকাউন্ট থাকতে পারে তবে আমি নিজে নিজেই নিশ্চিত করতে হবে যে প্রতিটি চেকিং অ্যাকাউন্টের জন্য উভয় সম্পর্কের দিকে নির্দেশ করে না কর্পোরেশন এবং প্রাকৃতিক ব্যক্তি কারণ একটি চেকিং অ্যাকাউন্টটি কর্পোরেশনের বা কোনও প্রাকৃতিক ব্যক্তির। এই চিত্রটি দেখুন

http://i40.tinypic.com/1rpv9z.png

এই সমস্যার আর কোনও ক্লিনার সমাধান আছে কি?


আপনি যেমন একটি জন্য থাকার বিষয়ে চিন্তা করেছেন OwnerTypeIDমধ্যে ChecquingAccountটেবিলের সঙ্গে 1=Corporationএবং 2=NaturalPerson? এইভাবে আপনার কেবল টেবিলের OwnerIDমধ্যে একটি প্রয়োজন ChecquingAccount, যা আপনি বরাবর সূচক করতে পারেন OwnerTypeID
রোকা

আমার কেবল এটি কর্পোরেশন বা প্রাকৃতিক ব্যক্তি কিনা তা নয়, তবে সংশ্লিষ্ট আইডিটিও জানতে হবে, তবে আমার আইডি নম্বর প্রয়োজন কেবলমাত্র 1 বা 2 এর মান নয়! সমাধান 3 যা আমি এখানে পেয়েছি তা কর্পোরেশন বা প্রাকৃতিক ব্যক্তির কাছে আইডি সহ আমার দুটি কলাম রয়েছে
ডেনডিনি

2
হ্যাঁ, সমাধানটি একটি বৈধ বিকল্প। বেশিরভাগ ডিবিএমএসে আপনি প্রয়োগ করতে পারেন যে দুটি এফকে একটির মধ্যে একটি চেক সীমাবদ্ধতার সাথে "সক্রিয়": CHECK (CorporationID IS NOT NULL AND NaturalPersonID IS NULL OR CorporationID IS NULL AND NaturalPersonID IS NOT NULL)আমি সমাধানটি 1 এর চেয়ে বেশি পছন্দ করি (তবে এটি কেবল আমার)। এটি অনেকটা "ক্লিনার"।
ypercubeᵀᴹ

হ্যাঁ, আমি বুঝি, কিন্তু আপনি থাকতে পারে ChecquingAccountটেবিল একটি রেকর্ড OwnerTypeID=1এবং OwnerID=123, যা নির্দেশ করে এটা এক প্রকার Corporation, অতএব আইডি 123মধ্যে Corporationটেবিল। OwnerTypeID আপনাকে কোন টেবিলটি জানায় এবং OwnerID আপনাকে সেই সারণীতে আইডিটি বলে।
রোকা

1
বিকল্প # 1 কীভাবে অসম্ভব? "কর্পোরেশন" শব্দের মূল অর্থ "এমন একটি ব্যবসায় যা আইনত কোনও ব্যক্তি," সর্বোপরি। এটি একটি Customersটেবিল কল ।
সমস্ত ট্রেডের জোন

উত্তর:


15

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

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

সমস্যাটি হ'ল এই লক্ষ্যগুলির মধ্যে কয়েকটি একে অপরের সাথে প্রতিযোগিতা করে।

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

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

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

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

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

সুতরাং আপনি একই সাথে আপনার ডেটা পুনরুদ্ধারকে সরল রাখার সময় সমস্ত নিয়ম অনুসরণ করে এমন একটি পরিষ্কার নকশা তৈরি করা সত্যিই সম্ভব নয়। আপনার ট্রেড-অফ কোথায় হবে তা আপনাকে সিদ্ধান্ত নিতে হবে।


আমার সমাধান # 2 আপনার চার গ্রুপের কোনটির সাথে সম্পর্কিত? "অস্বীকৃত পার্টিশন অ্যাট্রিবিউট সলিউশন" আমার কাছে খুব পরিষ্কার নয় ...
ডেনডিনি

@ ডেনডিনি - আপনার সমাধান নম্বর 2 আমার বর্ণিত সমাধানগুলির সাথে ফিট করে না। কারণ এটি কোনও আইনী সত্তার সাথে সম্পর্কিত কোনও অ্যাকাউন্টের প্রয়োজনের সাথে খাপ খায় না। মধ্যবর্তী টেবিলগুলির প্রাথমিক কীগুলি আপনি যেভাবে সংজ্ঞায়িত করেছেন, সেগুলি অনেকগুলি থেকে বহু মোড়কে। প্রাথমিক কীগুলি যদি কেবলমাত্র হয় corporation_id এবং person_idতারপরে আপনার কাছে মূলত সাব-টাইপিং সমাধানটি হত তবে সুপার-টাইপ টেবিলটি দুটি বিভক্ত হত এবং বিদেশী কীটি উল্টানো হত, তাই লোকেরা একাধিক অ্যাকাউন্ট রাখতে পারে না। এই ধরণের উদ্দেশ্যকে পরাস্ত করে।
জোয়েল ব্রাউন

দুর্দান্ত ব্যাখ্যা। @ জোয়েলব্রাউন, অনুসন্ধানের ক্ষেত্রে "দুটি বিদেশী কী" সমাধানের পারফরম্যান্সের কী কী প্রভাব রয়েছে? এছাড়াও, বিবেচনা করুন যে 2 এর পরিবর্তে 6 বা তার বেশি বৈদেশিক কী থাকতে পারে: আপনি কি এখনও এই পদ্ধতির সুপারিশ করবেন বা পরিবর্তে অন্যটির দিকে ঝুঁকবেন?
Amadeo গ্যালার্ডো

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

@JoelBrown Denormalized ভবিষ্যৎ এসকিউএল সংস্করণ দুটি কলাম উপর ভিত্তি করে একটি যৌগ বিদেশী কী সংজ্ঞা অনুমতি দিয়ে এই পদ্ধতির অনুমতি থাকবে RefIDএবং RefTableযেখানে RefTableএকটি নির্দিষ্ট আইডি শনাক্ত লক্ষ্য টেবিল। এই ধরণের কী এবং এর জন্য অনেকগুলি ব্যবহারের কেস রয়েছে যা সততা প্রয়োগের জন্য 10 বা আরও বেশি সমিতি / সাব টাইপ টেবিল বজায় রাখতে পারে। এই ক্ষেত্রে আমি keyনিজেই এটি তৈরি করেছি।
ডিজেএমজে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.