সংক্ষিপ্ত সংস্করণ
বিদ্যমান বহু থেকে বহু লোকের যোগদানের জন্য আমাকে প্রতিটি জোড়ায় একটি নির্দিষ্ট সংখ্যক অতিরিক্ত সম্পত্তি যুক্ত করতে হবে। নীচের চিত্রগুলিতে এড়িয়ে যাওয়া, বেস কেসটি প্রসারিত করে এটি সম্পাদন করার সুবিধাগুলি এবং অসুবিধাগুলির দিক থেকে বিকল্পগুলির মধ্যে 1-4 কে সবচেয়ে ভাল উপায়? বা, আমি এখানে বিবেচনা না করে এর চেয়ে ভাল বিকল্প আছে কি?
দীর্ঘ সংস্করণ
একটি মধ্যবর্তী যোগদানের টেবিলের মাধ্যমে আমার কাছে বর্তমানে বহু-বহু সম্পর্কের মধ্যে দুটি টেবিল রয়েছে। আমার এখন বিদ্যমান সংস্থাগুলির জুটির সাথে সম্পর্কিত বৈশিষ্ট্যগুলিতে অতিরিক্ত লিঙ্ক যুক্ত করতে হবে। আমার প্রতিটি জোড়ের জন্য এই বৈশিষ্ট্যগুলির একটি নির্দিষ্ট সংখ্যা রয়েছে, যদিও সম্পত্তি সারণীতে একটি প্রবেশ একাধিক জোড়া প্রয়োগ করতে পারে (বা এমনকি এক জোড়ার জন্য একাধিকবার ব্যবহার করা যেতে পারে)। আমি এটি করার সর্বোত্তম উপায়টি নির্ধারণ করার চেষ্টা করছি এবং পরিস্থিতিটি কীভাবে ভাবব তা বাছাই করতে সমস্যা হচ্ছে। শব্দার্থগতভাবে দেখে মনে হচ্ছে যেন আমি এটিকে নীচের যে কোনও হিসাবে সমানভাবে বর্ণনা করতে পারি:
- অতিরিক্ত সংখ্যার নির্দিষ্ট সংখ্যার একটি সংস্থার সাথে একটি জুড়ি যুক্ত
- একজোড়া অনেকগুলি অতিরিক্ত বৈশিষ্ট্যযুক্ত
- অনেকগুলি (দুটি) অবজেক্ট বৈশিষ্ট্যের এক সেটের সাথে যুক্ত
- অনেক সম্পত্তি অনেক সম্পত্তি যুক্ত
উদাহরণ
আমার দুটি অবজেক্ট টাইপ, এক্স এবং ওয়াই, প্রতিটি অনন্য আইডি সহ, এবং objx_objy
কলামগুলির সাথে একটি লিঙ্ক টেবিল x_id
এবং y_id
যা একসাথে লিঙ্কটির জন্য প্রাথমিক কী গঠন করে। প্রতিটি এক্স অনেকগুলি ওয়াইসের সাথে সম্পর্কিত হতে পারে এবং এর বিপরীতে। এটি আমার বিদ্যমান বহু থেকে বহু সম্পর্কের জন্য সেটআপ।
বেস কেস
এখন অতিরিক্ত হিসাবে আমার কাছে অন্য একটি সারণীতে সংজ্ঞায়িত বৈশিষ্ট্যের একটি সেট রয়েছে এবং শর্তগুলির একটি সেট রয়েছে যার অধীনে প্রদত্ত (এক্স, ওয়াই) জুটির সম্পত্তি পি থাকা উচিত conditions শর্তের সংখ্যাটি স্থির থাকে, এবং সমস্ত জোড়া একই। তারা মূলত "পরিস্থিতিতে সি 1, জোড় (এক্স 1, ওয়াই 1) এর সম্পত্তি P1 রয়েছে", "পরিস্থিতিতে সি 2, জোড় (এক্স 1, ওয়াই 1) এর সম্পত্তি P2 রয়েছে" এবং এইভাবে, জোড়ের প্রতিটি জোড়ের জন্য তিনটি পরিস্থিতি / শর্তের জন্য টেবিল।
বিকল্প 1
আমার বর্তমান অবস্থায় ঠিক তিন শর্ত আছে, এবং তাই এক সম্ভাবনা কলাম যুক্ত করতে আমি, যে বৃদ্ধি আশা কোন কারণ নেই c1_p_id
, c2_p_id
এবং c3_p_id
করতে featx_featy
, একটি দেওয়া নির্দিষ্ট x_id
এবং y_id
যা সম্পত্তি, p_id
তিনটি ক্ষেত্রে প্রতিটি ব্যবহারের ।
এটি আমার কাছে দুর্দান্ত ধারণা বলে মনে হচ্ছে না, কারণ এটি কোনও বৈশিষ্ট্যে প্রয়োগ সমস্ত বৈশিষ্ট্য নির্বাচন করতে এসকিউএলকে জটিল করে তোলে এবং আরও শর্তে সহজেই স্কেল করে না। যাইহোক, এটি প্রতি (এক্স, ওয়াই) জোড়ের জন্য নির্দিষ্ট সংখ্যক শর্তের প্রয়োজনীয়তা প্রয়োগ করে। আসলে এটি এখানে একমাত্র বিকল্প যা এটি করে।
বিকল্প 2
একটি শর্ত সারণী তৈরি করুন cond
, এবং যোগদানের টেবিলের প্রাথমিক কীতে শর্ত আইডি যুক্ত করুন।
এর একটি নেতিবাচক দিকটি হ'ল এটি প্রতিটি জুটির জন্য শর্তের সংখ্যা নির্দিষ্ট করে না। আরেকটি হ'ল আমি যখন প্রাথমিক সম্পর্কের বিষয়টি কেবল তখনই বিবেচনা করি তবে এরকম কিছু
SELECT objx.*, objy.* FROM objx
INNER JOIN objx_objy ON objx_objy.x_id = objx.id
INNER JOIN objy ON objy.id = objx_objy.y_id
DISTINCT
সদৃশ এন্ট্রি এড়াতে আমাকে তখন একটি ধারা যুক্ত করতে হবে। এতে প্রতিটি জুটির উপস্থিতি একবারেই হওয়া উচিত বলে মনে হয়।
বিকল্প 3
যোগদানের টেবিলটিতে একটি নতুন 'জুড়ি আইডি' তৈরি করুন এবং তারপরে প্রথমটি এবং বৈশিষ্ট্য এবং শর্তগুলির মধ্যে একটি দ্বিতীয় লিঙ্ক টেবিল রাখুন।
প্রতিটি জুটির জন্য একটি নির্দিষ্ট সংস্থার শর্ত প্রয়োগের অভাব ব্যতীত এর কয়েকটি অসুবিধাগুলি রয়েছে বলে মনে হয়। একটি নতুন আইডি তৈরি করা যদিও বিদ্যমান আইডি ব্যতীত অন্য কিছুই সনাক্ত করে তা কি বোধগম্য নয়?
বিকল্প 4 (3 বি)
মূলত অপশন 3 এর সমান, তবে অতিরিক্ত আইডি ক্ষেত্রটি তৈরি না করেই। এটি নতুন যোগদানের টেবিলের মূল আইডি উভয় রেখেই সম্পন্ন হয়, সুতরাং এটির পরিবর্তে, ক্ষেত্রগুলি x_id
এবং y_id
ক্ষেত্রগুলি থাকে xy_id
।
এই ফর্মের অতিরিক্ত সুবিধা হ'ল এটি বিদ্যমান সারণীগুলিতে কোনও পরিবর্তন করে না (যদিও তারা এখনও উত্পাদনে নেই)। তবে এটি মূলত পুরো টেবিলটিকে একাধিকবার নকল করে (বা যাইহোক, সেভাবে অনুভব করে) তাই এটি আদর্শ বলে মনে হয় না।
সারসংক্ষেপ
আমার অনুভূতি হ'ল বিকল্প 3 এবং 4 যথেষ্ট পরিমাণে সমান যে আমি যে কোনও একটিতে যেতে পারি। আমি সম্ভবত এখনই সম্পত্তিগুলির সাথে সংক্ষিপ্ত সংখ্যক সংখ্যক সংখ্যক সংখ্যক লিঙ্কের প্রয়োজনের জন্য না চাইলে অপশন 1টিকে অন্যথায় যেমন হবে তার চেয়ে বেশি যুক্তিসঙ্গত বলে মনে হচ্ছে। কিছু সীমাবদ্ধ পরীক্ষার উপর ভিত্তি করে, DISTINCT
আমার প্রশ্নগুলিতে একটি ধারা যুক্ত করা এই পরিস্থিতিতে কার্যকারিতার উপর প্রভাব ফেলবে বলে মনে হয় না, তবে আমি নিশ্চিত নই যে অপশন 2 পরিস্থিতিটির পাশাপাশি অন্যদেরও প্রতিনিধিত্ব করে, কারণ স্থাপনার ফলে অন্তর্নিহিত সদৃশতার কারণে লিঙ্ক টেবিলের একাধিক সারিতে একই (এক্স, ওয়াই) জোড়া
এই বিকল্পগুলির মধ্যে একটিটি কি আমার সেরা পথে এগিয়ে যাওয়ার বা আমার কাছে অন্য কোনও কাঠামো বিবেচনা করা উচিত?
DISTINCT
দফা, আমি # 2 শেষে এক, যা সংযোগগুলি মত একটি ক্যোয়ারী চিন্তা ছিল x
এবং y
এর মাধ্যমে xyc
কিন্তু বোঝায় না c
যদি আমি করেছেন ... তাই (x_id, y_id, c_id)
সীমাবদ্ধ UNIQUE
সারি দিয়ে (1,1,1)
এবং (1,1,2)
তারপর, SELECT x.id, y.id FROM x JOIN xyc JOIN y
আমি ফিরে পাবেন একই রকম দুটি সারি, (1,1)
এবং (1,1)
।