আমি কি অবিচ্ছিন্নভাবে এই টেবিলটি পচন করতে পারি?


10

আমার লিগের বাইরে থাকা একটি ডাটাবেস ডিজাইনের সমস্যাটি পেরিয়ে গিয়েছি এবং আমার ডিবিএ গুরুর কাছে ফায়ার ড্রিল বন্ধ রয়েছে।

সংক্ষেপে, আমার কাছে নিম্নলিখিত প্রাথমিক কী (ব্রেভিটির জন্য পিকে) সহ একটি টেবিল রয়েছে:

child_id   integer
parent_id  integer
date       datetime

child_idএবং parent_idসত্তার টেবিলগুলির জন্য বিদেশী কী। "শিশু" সারণীতে নিজেই "প্যারেন্ট" টেবিলে একটি বিদেশী কী রয়েছে এবং লো, প্রতিটি child_idসর্বদা parent_idউপরের সারণীর দ্বারা প্রত্যাশিত একইরকম উল্লেখ করে । আসলে, দেখা যাচ্ছে যে দুটি অতিরিক্ত সমন্বয় করে কিছু অতিরিক্ত কোড রয়েছে।

যা এই অতিমাত্রায় উত্সাহী সাধারণীকরণকে নবীকে বলে তোলে "এর পরিবর্তে আমার অপ্রয়োজনীয় অপসারণ করা উচিত!"

আমি নিম্নলিখিতটি পচে:

Table_1 PK:
child_id   integer
date       datetime

Table_2 PK:
parent_id  integer
date       datetime

Table_3: (already exists)
child_id   integer PRIMARY KEY
parent_id  integer FOREIGN KEY

এবং দেখুন, আমি যখন এই ছেলেরা প্রাকৃতিক উপায়ে একসাথে যোগদান করি তখন আমি আসল টেবিলটি পুনরুদ্ধার করি। এটি আমার বোঝাপড়া যা এই 5 এনএফ করে তোলে।

যাইহোক, এখন আমি বুঝতে পারি যে একটি গোপনীয় ব্যবসার নিয়ম রয়েছে।

সাধারণত, প্রদত্তের সাথে সম্পর্কিত তারিখগুলি সংশ্লিষ্টগুলির সাথে সম্পর্কিত তারিখগুলির child_idএকটি উপসেট হতে হবে parent_id। আপনি দেখতে পাচ্ছেন যে প্রথম টেবিলটি এই বিধি প্রয়োগ করে।

আমার পচনটি নিয়মটি কার্যকর করে না, কারণ তারিখগুলি খুব বেশি বড় না হওয়া পর্যন্ত আপনি অবাধে টেবিল 1 এ যুক্ত করতে পারেন।

নিম্নলিখিত প্রশ্নগুলির সাথে যা আমাকে এখানে নিয়ে যায়:

  1. এই ক্ষয় 5NF হয়? যদিও আমি বলব এটি সন্নিবেশজনিত অসুবিধাগুলির অনুমতি দেয়, এটি উইকির উদাহরণ অনুসরণ করে বলে মনে হয়, যা নিজেই এই গাইডটি অনুসরণ করে । " তিনটি পৃথক রেকর্ড ধরণের সমন্বিত একটি সাধারণ আকারের মাধ্যমে আমরা সমস্ত সত্য তথ্য পুনর্গঠন করতে পারি" এই বাক্যাংশটি আমাকে বিশেষ বিরতি দেয়, যেহেতু আমি যতটা আবর্জনা পাম্প করি না কেন Table_1, প্রাকৃতিক যোগদান এখনও এড়িয়ে যায় না ores

  2. ধরুন আমি এই পচনটি পছন্দ করি না (আমি পছন্দ করি না)। আমি নির্দ্বিধায় স্বীকার করি যে ব্যবহারিক সমাধানটি হ'ল টেবিল এবং কোডটি যেমন রয়েছে তেমনি রেখে দেওয়া। কিন্তু তত্ত্ব, সেখানে পচা এবং / অথবা সীমাবদ্ধতা যোগ করার জন্য যেমন যে আমি প্রথম টেবিল থেকে দূরে পেতে একটি উপায় এবং আমার ব্যবসার নিয়ম সংরক্ষণ?


1
আপনার মূল সারণীতে কী (গুলি) রয়েছে? এটি নির্ভর করে কি নির্ভরতা? আপনি যে শিশু_আইডি-> পিতামাত_আইডি বলছেন বলে মনে হচ্ছে, সেই ক্ষেত্রে চাইল্ড_আইডি এবং পিতামাত_আইডি উভয়ই সেই টেবিলে একই কী এর অংশ হতে পারে না।
nvogel

1
@ ট্রেভর: আপনি কি এখানে উত্তরগুলি একবার পর্যালোচনা করেছেন? জিজ্ঞাসা করার 19 মিনিট পরে শেষবার দেখা হয়েছে। উত্তরগুলি পরে এসেছিল।
gbn

উত্তর:


9

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

আপনার এক টেবিলে আপনার কী {চাইল্ড_আইডি, প্যারেন্ট_আইডি, তারিখ, রয়েছে এবং আপনার শিশু টেবিলে একটি অনন্য জুড়ি {চাইল্ড_আইডি, প্যারেন্ট_আইডি The থাকা উচিত তা এই সংযোজনের অংশটি অপ্রয়োজনীয় বলে অগত্যা বোঝায় না combination । এর অর্থ হ'ল যে টেবিলটিতে key চাইল্ড_আইডি, প্যারেন্ট_আইডি, তারিখ the প্রাথমিক কী হিসাবে রয়েছে, {চাইল্ড_আইডি, প্যারেন্ট_আইডি attrib বৈশিষ্ট্যের জোড়টিকে প্রথমে শিশু টেবিলটি উল্লেখ করা উচিত।

যদি এটি হয় তবে আপনি ব্যবহার করতে পারেন FOREIGN KEY (child_id, parent_id) REFERENCES child (child_id, parent_id)। এটি করতে, আপনার সারণী "চাইল্ড" এর কলামগুলির (চাইল্ড_আইডি, প্যারেন্ট_আইডি) জোড়া লাগানোর জন্য একটি অনন্য বাধা প্রয়োজন, যা চাইল্ড_আইডের প্রাথমিক কী হলে কোনও সমস্যা হওয়া উচিত নয়।

তবে ডেটার অর্থ কী তা না জেনে বলার উপায় নেই এবং এই থ্রেডে আপনিই একমাত্র যিনি এটি জানেন। (তবে আমরা আপনাকে তা আমাদের কাছে ব্যাখ্যা করতে পেরে খুশি হব))

মূল টেবিলের দিক থেকে, আপনি মনে করছেন যে শিশু_ইড -> পিতা-মাতা_আইডি। যদি এটি হয় তবে পিতামাতা_আইডি কেন প্রথম স্থানে রয়েছে? "চাইল্ড" টেবিলের বিদেশি কী রেফারেন্স সহ কী (চাইল্ড_আইডি, তারিখ) কী নয়? আমার কাছে দেখে মনে হচ্ছে আপনি যে ধরণের অপ্রয়োজনীয়তার কথা বলছেন তা "প্যারেন্ট_আইডি" কলামটি ফেলে সমাধান করা যেতে পারে।

INSERT বিবৃতি আকারে এসকিউএল ডিডিএল এবং নমুনা ডেটা আমাদের আপনাকে সহায়তা করতে সহায়তা করে। ডিডিএল এবং ইনসার্টের বিবৃতি বর্ণনার চেয়ে আরও সুনির্দিষ্ট।


1
"ক্রিয়ামূলক নির্ভরতা" অনুস্মারক জন্য +2
jcolebrand

3

এটা চেষ্টা কর...

  • (child_id,parent_id)শিশু টেবিলে অনন্য বাধা যুক্ত করুন
  • আপনার বর্তমান সারণীটি (PK,FK:child_id, PK,FK:parent_id, PK:date)যেমন রয়েছে তেমনই, এফকে নতুন অনন্য সীমাবদ্ধতায় 2 টি কলামে রয়েছে

অথবা

  • বর্তমান চাইল্ড টেবিল থেকে এফকে সরান
  • একটি নতুন টেবিল তৈরি করুন (PK,FK:child_id, FK:parent_id)যা সন্তানের সাথে 1: 1 হয়
  • আপনার বর্তমান সারণীটি (PK,FK: child_id, PK,FK: parent_id, PK:date)যেমন রয়েছে তেমন থাকে। তবে নতুন সারণীতে এফকে 2 টি কলামে রয়েছে

অন্য কিছু না হলে এটি আপনাকে অনুপ্রেরণা জাগাতে পারে ...

যদি আমি সঠিকভাবে বুঝতে পারি তবে এটি অপ্রয়োজনীয়তা এবং কোড সরিয়ে ফেলবে ...

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