হ্যাঁ এটি একটি ভয়ঙ্কর ধারণা।
যাওয়ার পরিবর্তে:
SELECT Deal.Name, DealCategory.Name
FROM Deal
INNER JOIN
DealCategories ON Deal.DealID = DealCategories.DealID
INNER JOIN
DealCategory ON DealCategories.DealCategoryID = DealCategory.DealCategoryID
WHERE Deal.DealID = 1234
আপনাকে এখন যেতে হবে:
SELECT Deal.ID, Deal.Name, DealCategories
FROM Deal
WHERE Deal.DealID = 1234
তারপরে সেই কমা তালিকাটি স্বতন্ত্র সংখ্যায় বিভক্ত করতে আপনার অ্যাপ্লিকেশন কোডে স্টাফ করতে হবে, তারপরে আলাদাভাবে ডাটাবেসটি জিজ্ঞাসা করুন:
SELECT DealCategory.Name
FROM DealCategory
WHERE DealCategory.DealCategoryID IN (<<that list from before>>)
এই নকশার অ্যান্টিপ্যাটার্নটি হয় সম্পর্কের মডেলিংয়ের সম্পূর্ণ ভুল বোঝাবুঝি থেকে উদ্ভূত হয় (আপনি টেবিলগুলি দেখে ভয় পাবেন না T টেবিলগুলি আপনার বন্ধু them সেগুলি ব্যবহার করুন), অথবা একটি উদ্ভট বিভ্রান্তি বিশ্বাস এটি কমা-বিচ্ছিন্ন তালিকা গ্রহণ করা এবং এটি বিভক্ত করার পক্ষে দ্রুততর অ্যাপ্লিকেশন কোডে লিঙ্ক টেবিল যুক্ত করার চেয়ে এটি (এটি কখনও হয় না )। তৃতীয় বিকল্পটি হ'ল তারা বিদেশী কী সেট আপ করতে সক্ষম হওয়ার জন্য এসকিউএল-এর সাথে যথেষ্ট আত্মবিশ্বাসী / সক্ষম নয়, তবে যদি এটি হয় তবে তাদের একটি সম্পর্কযুক্ত মডেলের ডিজাইনের সাথে কিছু করার দরকার নেই।
এসকিউএল অ্যান্টিপ্যাটার্নস ( কারভিন , ২০১০) এই অ্যান্টিপ্যাটার্নগুলিকে (যাকে তিনি 'জয়ওয়ালিং' বলেছেন) পৃষ্ঠাগুলির 15-23 পৃষ্ঠায় একটি সম্পূর্ণ অধ্যায় নিবেদিত করেছেন। এছাড়াও, লেখক এসও তে অনুরূপ প্রশ্ন পোস্ট করেছেন । তিনি উল্লেখ করেছেন যে মূল পয়েন্টগুলি (এই উদাহরণ হিসাবে প্রয়োগ করা হয়):
- একটি নির্দিষ্ট বিভাগে সমস্ত ডিলের জন্য জিজ্ঞাসা করা বরং জটিল (সমস্যাটি সমাধানের সবচেয়ে সহজ উপায় একটি নিয়মিত প্রকাশ, তবে একটি নিয়মিত প্রকাশটি নিজের এবং নিজেই একটি সমস্যা)।
- আপনি বিদেশী কী সম্পর্কগুলি ছাড়া রেফারেন্সিয়াল অখণ্ডতা প্রয়োগ করতে পারবেন না। যদি আপনি ডিলক্যাটগরী এনআরআরটি মুছে ফেলেন। # 26, আপনাকে তখন আপনার অ্যাপ্লিকেশন কোডটিতে, # 26 বিভাগের রেফারেন্সগুলি অনুসন্ধান করতে প্রতিটি চুক্তি করতে হবে এবং সেগুলি মুছতে হবে। এইটি এমন কিছু বিষয় যা ডেটা স্তর এ পরিচালনা করা উচিত, এবং আপনার অ্যাপ্লিকেশনের মধ্যে এটি পরিচালনা করতে হচ্ছে খুব খারাপ জিনিস ।
- মোট প্রশ্নের (
COUNT
, SUM
ইত্যাদি), আবার, থেকে 'জটিল' 'প্রায় অসম্ভব' পরিবর্তিত হয়। আপনার বিকাশকারীদের জিজ্ঞাসা করুন কীভাবে তারা আপনাকে এই বিভাগে থাকা ডিলের সংখ্যা গণনা করে সমস্ত বিভাগের একটি তালিকা পেতে চাইবে। একটি উপযুক্ত নকশা সহ, এটি এসকিউএলের চারটি লাইন।
- আপডেটগুলি আরও জটিল হয়ে ওঠে (যেমন আপনার কাছে পাঁচটি বিভাগে একটি চুক্তি রয়েছে তবে আপনি দুটি সরিয়ে অন্য তিনটি যুক্ত করতে চান)। এটি একটি উপযুক্ত নকশা সহ এসকিউএল এর তিনটি লাইন।
- পরিণামে আপনি
VARCHAR
তালিকার দৈর্ঘ্যের সীমাবদ্ধতায় চলে যাবেন । যদিও আপনার কাছে 4000 টিরও বেশি অক্ষরের অধীনে কমা-বিভাজিত তালিকা রয়েছে, তবে সম্ভাবনাটি পার্স করছে যে দানব যেভাবেই নরক হিসাবে ধীর হয়ে চলেছে।
- ডাটাবেস থেকে একটি তালিকা টানতে, এটিকে বিভক্ত করা এবং তারপরে অন্য ক্যোয়ারির জন্য ডাটাবেসে ফিরে যাওয়া এক প্রশ্নের চেয়ে আস্তে আস্তে ধীর।
টিএলডিআর: এটি একটি মৌলিক ত্রুটিযুক্ত নকশা, এটি ভালভাবে স্কেল করবে না, এটি এমনকি সহজতম প্রশ্নের ক্ষেত্রেও অতিরিক্ত জটিলতার পরিচয় দেয় এবং বাক্সের বাইরে এটি আপনার প্রয়োগকে ধীর করে দেয়।