যেখানে প্রতিটি পণ্যটির অনেকগুলি পরামিতি থাকে সেখানে বিভিন্ন ধরণের পণ্যের জন্য কীভাবে কোনও পণ্যের টেবিল ডিজাইন করবেন


140

টেবিল ডিজাইনে আমার তেমন অভিজ্ঞতা নেই। আমার লক্ষ্য হ'ল এক বা একাধিক পণ্য সারণী তৈরি করা যা নীচের প্রয়োজনীয়তাগুলি পূরণ করে:

  • অনেক ধরণের পণ্য (টিভি, ফোন, পিসি, ...) সমর্থন করুন। প্রতিটি ধরণের পণ্যগুলির বিভিন্ন পরামিতিগুলির সেট থাকে:

    • ফোনের রঙ, আকার, ওজন, ওএস থাকবে ...

    • পিসিতে সিপিইউ, এইচডিডি, র‌্যাম থাকবে ...

  • পরামিতিগুলির সেটটি গতিশীল হতে হবে। আপনার পছন্দ মতো কোনও প্যারামিটার যুক্ত বা সম্পাদনা করতে পারেন।

প্রতিটি ধরণের পণ্যের জন্য আলাদা টেবিল ছাড়া আমি কীভাবে এই প্রয়োজনীয়তাগুলি পূরণ করতে পারি?

উত্তর:


233

আপনি বর্ণিত ধরণের শ্রেণিবিন্যাসের মডেলিংয়ের জন্য কমপক্ষে এই পাঁচটি বিকল্প রয়েছে:

  • একক টেবিল উত্তরাধিকার : সমস্ত প্রকারের সমস্ত বৈশিষ্ট্য সংরক্ষণ করার জন্য পর্যাপ্ত কলাম সহ সমস্ত পণ্যের ধরণের জন্য একটি টেবিল। এর অর্থ প্রচুর কলাম, যার বেশিরভাগই কোনও প্রদত্ত সারিতে শূন্য।

  • ক্লাস টেবিল উত্তরাধিকার : পণ্যগুলির জন্য একটি টেবিল, সমস্ত পণ্যের ধরণের সাধারণ বৈশিষ্ট্য সংরক্ষণ করে। তারপরে পণ্যের ধরণের প্রতি এক টেবিল, সেই পণ্যটির জন্য নির্দিষ্ট বৈশিষ্ট্যগুলি সংরক্ষণ করে।

  • কংক্রিট টেবিল উত্তরাধিকার : সাধারণ পণ্য বৈশিষ্ট্যের জন্য কোনও টেবিল নেই table পরিবর্তে, পণ্য ধরণের প্রতি এক টেবিল, উভয় সাধারণ পণ্য বৈশিষ্ট্য এবং পণ্য-নির্দিষ্ট বৈশিষ্ট্য সংরক্ষণ করে।

  • সিরিয়ালযুক্ত এলওবি : পণ্যগুলির জন্য একটি টেবিল, সমস্ত পণ্যের ধরণের সাধারণ বৈশিষ্ট্য সংরক্ষণ করে। একটি অতিরিক্ত কলাম XML, YAML, JSON, বা অন্য কোনও ফর্ম্যাটে অর্ধ-কাঠামোগত ডেটার একটি BLOB সঞ্চয় করে B এই BLOB আপনাকে প্রতিটি পণ্যের ধরণের জন্য নির্দিষ্ট বৈশিষ্ট্যগুলি সংরক্ষণ করতে দেয়। আপনি এটি বর্ণনার জন্য অভিনব নকশার প্যাটার্নগুলি ব্যবহার করতে পারেন, যেমন ফেসিড এবং মেমেন্টো। তবে নির্বিশেষে আপনার কাছে এমন একটি বৈশিষ্ট্য রয়েছে যা এসকিউএল-এর মধ্যে সহজে জিজ্ঞাসা করা যায় না; আপনাকে পুরো ব্লবটি অ্যাপ্লিকেশনটিতে ফিরিয়ে আনতে হবে এবং এটি সেখানে সাজিয়ে ফেলতে হবে।

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

আমি এ সম্পর্কে আরও একটি উপস্থাপনা, এক্সটেনসিবল ডেটা মডেলিংয়ে লিখেছি ।


EAV সম্পর্কে অতিরিক্ত চিন্তা: যদিও অনেক লোক EAV এর পক্ষে বলে মনে হয়, আমি তা করি না। এটি সবচেয়ে নমনীয় সমাধানের মতো বলে মনে হয় এবং তাই সেরা therefore তবে, ট্যানস্টাএফএল প্রবন্ধটি মনে রাখবেন । এখানে ইএভি এর কিছু অসুবিধা রয়েছে:

  • কোনও কলাম বাধ্যতামূলক করার কোনও উপায় নয় (সমতুল্য NOT NULL)।
  • এন্ট্রিগুলিকে বৈধতা দেওয়ার জন্য এসকিউএল ডেটা প্রকারগুলি ব্যবহার করার কোনও উপায় নেই।
  • অ্যাট্রিবিউটের নামগুলি ধারাবাহিকভাবে বানান তা নিশ্চিত করার কোনও উপায় নেই।
  • কোনও প্রদত্ত বৈশিষ্ট্যের মানগুলিতে বিদেশী কী রাখার কোনও উপায় নেই, উদাহরণস্বরূপ একটি সন্ধানের টেবিলের জন্য।
  • প্রচলিত সারণী বিন্যাসে ফলাফল আনয়ন জটিল এবং ব্যয়বহুল, কারণ একাধিক সারি থেকে JOINগুণাবলী প্রতিটি বৈশিষ্ট্যের জন্য আপনাকে করতে হবে ।

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

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

আমি EAV ব্যবহার করতে চাই শুধুমাত্র যদি প্রত্যেক সারি সম্ভাব্য গুণাবলী একটি স্বতন্ত্র সেট আছে করার অনুমতি দিতে হবে। আপনার কাছে যখন পণ্যের ধরণের একটি সীমাবদ্ধ সেট থাকে, তখন EAV ওভারকিল হয়। ক্লাস টেবিল উত্তরাধিকার আমার প্রথম পছন্দ হবে।


২০১৮ আপডেট করুন: "অনেকগুলি কাস্টম বৈশিষ্ট্য" সমস্যার সমাধান হিসাবে লোকেরা যত বেশি JSON ব্যবহার করে দেখি, আমি তার সমাধানটি কম পছন্দ করি। এটি সমর্থনগুলিতে বিশেষ JSON ফাংশন ব্যবহার করার পরেও প্রশ্নগুলি খুব জটিল করে তোলে । সাধারণ সারি এবং কলামগুলিতে সংরক্ষণের তুলনায় জেএসএন নথি সংরক্ষণ করতে অনেক বেশি সঞ্চয় স্থান লাগে space

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

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


11
@ হিমালয়গার্গ অপশন "4.5" সত্যিই বিলের পোস্টের পুরো পয়েন্টের বিপরীত।
ব্যবহারকারী3308043

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


2
আমি আমার মামলার জন্য সিরিয়ালাইজড এলওবি পছন্দ করি। তবে এটি কি ওআরএমের জন্য উপযুক্ত? আমি ইএফ ব্যবহার করি
মাহমুদ জেনামি

@ ব্যবহারকারী ২74৪৫১7777,, অবশ্যই, তবে আপনাকে সম্ভবত কাঠামোগত ডেটা ফিল্ডগুলি আনপ্যাক করার জন্য কাস্টম কোড লিখতে হবে যা এলওবি গঠন করে এবং আপনার ওআরএম অবজেক্টের প্রতিটি সত্তা ক্ষেত্রে প্রয়োগ করতে হবে। আমি ইএফ জানি না, তবে আমি মনে করি আপনি এটির একটি বেস ওআরএম ক্লাস তৈরি করতে পারেন। আপনাকে ডাটাবেস সারিটির কংক্রিট ক্ষেত্রগুলি থেকে কোন ক্ষেত্রগুলি এসেছে এবং কোন ক্ষেত্রগুলি এলওবির ক্ষেত্র থেকে এসেছে তা ট্র্যাক করে রাখতে হবে, যাতে অবজেক্টটি সংরক্ষণ করার সময় আপনি আবার একটি এলওবি গঠন করতে পারেন।
বিল কারভিন

12

@পাথর হৃদয়

আমি সারা পথ ইএভি এবং এমভিসি দিয়ে এখানে যাব।

@ বিল কারভিন

এখানে ইএভি এর কিছু অসুবিধা রয়েছে:

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

আপনি এখানে উল্লেখ করেছেন যে সমস্ত জিনিস:

  • তথ্য বৈধতা
  • বৈশিষ্ট্য নাম বানান বৈধতা
  • বাধ্যতামূলক কলাম / ক্ষেত্র
  • নির্ভরযোগ্য গুণাবলী ধ্বংস পরিচালনা

আমার মতে মোটেও একটি ডাটাবেসের অন্তর্ভুক্ত নয় কারণ কোনও অ্যাপ্লিকেশনের প্রোগ্রামিং ল্যাঙ্গুয়েজ যেমন কোনও ডেটাবেসই সঠিক মাত্রায় সেই ইন্টারঅ্যাকশন এবং প্রয়োজনীয়তাগুলি পরিচালনা করতে সক্ষম হয় না।

আমার মতে এইভাবে একটি ডাটাবেস ব্যবহার করা পেরেক হাতুড়ি করার জন্য একটি শিলা ব্যবহার করার মতো। আপনি এটি একটি শিলা দিয়ে করতে পারেন তবে আপনি মনে করছেন না যে কোনও হাতুড়ি ব্যবহার করা যা আরও সুনির্দিষ্ট এবং বিশেষভাবে এই ধরণের ক্রিয়াকলাপের জন্য ডিজাইন করা হয়েছে?

প্রচলিত সারণী বিন্যাসে ফলাফল আনয়ন জটিল এবং ব্যয়বহুল, কারণ একাধিক সারি থেকে গুণাবলী পেতে আপনাকে প্রতিটি বৈশিষ্ট্যের জন্য যোগ দিতে হবে।

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

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

এমনকি অতিরিক্ত ডেটা স্টোরেজ ব্যয়ের সাথে আপনারও উদ্বিগ্ন হওয়ার দরকার নেই কারণ এটি প্রতিদিন কম দামে এবং সস্তা হয়।

আপনি যদি এখনও অ্যাপ্লিকেশনটির দ্বারা পরিচালিত ক্রিয়াকলাপগুলির সাথে উদ্বিগ্ন হন তবে ডেটা প্রাক প্রসেস করার জন্য আপনি সর্বদা এরলং, সি ++, গো ভাষা ব্যবহার করতে পারেন এবং পরে কেবল আপনার মূল অ্যাপ্লিকেশনটিতে আরও অনুকূলিত ডেটা প্রক্রিয়া করতে পারেন।


you can always use Erlang, C++, Go Language to pre-process the dataআপনি কি বুঝাতে চাচ্ছিলেন? ডিবির পরিবর্তে গো ল্যাং ব্যবহার করবেন? আপনি দয়া করে বিস্তারিত বলতে পারেন?
সবুজ

1
আমি সম্পূর্ণভাবে রাজী. EAV যাওয়ার একটি উপায়, বিশেষত যদি আপনার স্তরের নমনীয়তার প্রয়োজন হয় যা আপনাকে ডিবি স্কিমা পরিবর্তন ছাড়াই নতুন ধরণের পণ্য এবং প্যারামিটার যুক্ত করার অনুমতি দেয়, আমি আপনার আবেদনের মাধ্যমে লাইভ প্রোডাকশন চাই। ওখানে এসেছি। আমার জন্য কাজ করেছেন। ধীর অনুসন্ধান সম্পর্কে ... এখানে কেউ কি কখনও ক্যাশে সম্পর্কে শুনেছেন? ;)
পাওয়েল.কালিসz

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

6

যদি আমি Class Table Inheritanceঅর্থ ব্যবহার করি :

পণ্যগুলির জন্য একটি সারণী, সমস্ত পণ্যের ধরণের সাধারণ বৈশিষ্ট্য সংরক্ষণ করে। তারপরে পণ্যের ধরণের প্রতি এক টেবিল, সেই পণ্যটির জন্য নির্দিষ্ট বৈশিষ্ট্যগুলি সংরক্ষণ করে। -বিল কারভিন

যা আমি বিল কার্বিনের পরামর্শগুলির মধ্যে সেরা পছন্দ করি .. আমি এক ধরনের অপূর্ণতা আগে থেকেই দেখতে পারি, যা আমি কীভাবে সমস্যা থেকে বাঁচতে পারি তা ব্যাখ্যা করার চেষ্টা করব।

আমার যখন কোন বৈশিষ্ট্যটি কেবল 1 ধরণের সাধারণ, তারপরে 2, তারপরে 3 ইত্যাদির মধ্যে সাধারণ হয়ে যায় তখন আমার কোন কন্টিজেন্সি পরিকল্পনা করা উচিত?

উদাহরণস্বরূপ: (এটি কেবল একটি উদাহরণ, আমার আসল সমস্যা নয়)

যদি আমরা আসবাবপত্র বিক্রি করি তবে আমরা চেয়ার, ল্যাম্প, সোফাস, টিভি ইত্যাদি বিক্রি করতে পারি টিভি টাইপটি কেবলমাত্র এমন এক ধরণের যা আমাদের বহন করে যা বিদ্যুৎ খরচ হয়। সুতরাং আমি এই power_consumptionবৈশিষ্ট্যটি রাখব tv_type_table। তবে তারপরে আমরা হোম থিয়েটার সিস্টেমগুলি বহন শুরু করি যার একটি power_consumptionসম্পত্তিও রয়েছে। ঠিক এটির অন্য একটি পণ্য ঠিক আছে তাই আমি এই ক্ষেত্রটি stereo_type_tableপাশাপাশি যুক্ত করব কারণ এটি এই সময়ে সম্ভবত সবচেয়ে সহজ। কিন্তু আমরা আরো এবং আরো ইলেকট্রনিক্স বহন শুরু হিসাবে ধরে, আমরা বুঝতে পারি যে power_consumptionবিস্তৃত যথেষ্ট এটা যে হওয়া উচিত main_product_table। আমার এখন কি করা উচিত?

ক্ষেত্রটি যুক্ত করুন main_product_table। ইলেকট্রনিক্স মাধ্যমে লুপ একটি স্ক্রিপ্ট লিখুন এবং প্রতিটি থেকে সঠিক মান করা type_tableথেকে main_product_table। তারপরে প্রতিটি থেকে কলামটি বাদ দিন type_table

এখন যদি আমি সর্বদা GetProductDataপণ্যটির তথ্যটি টানতে ডাটাবেসের সাথে ইন্টারঅ্যাক্ট করতে একই বর্গ ব্যবহার করতাম ; তাহলে এখন যদি কোডের যে কোনও পরিবর্তনগুলির পুনঃনির্ধারণের প্রয়োজন হয় তবে সেগুলি কেবল সেই শ্রেণিতে হওয়া উচিত।


3

আপনার কাছে একটি পণ্য সারণী এবং 3 টি কলাম সহ পৃথক পণ্যসম্পাদনা ইনফোর টেবিল থাকতে পারে: পণ্যের আইডি, অতিরিক্ত তথ্যের নাম, অতিরিক্ত তথ্য মান। রঙটি যদি অনেকগুলি ব্যবহার করে তবে সমস্ত ধরণের পণ্য ব্যবহার না করে থাকে তবে এটি আপনার পণ্য সারণীতে একটি নমনীয় কলাম হতে পারে বা এটি কেবল প্রোডাক্টএডিশিয়েশনাল ইনফোতে রেখে দিতে পারে।

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

স্টিভ ইয়েজ এটিকে সম্পত্তি বৈশিষ্ট্য বলে এবং এটি ব্যবহার সম্পর্কে একটি দীর্ঘ পোস্ট লিখেছিল।


4
প্রোপার্টি প্যাটার্নটি অন্য নামে কেবল সত্ত্বা-গুণ-মান। এটি ব্যাপকভাবে ব্যবহৃত হয়, তবে এটি একটি সম্পর্কিত ডেটাবেসে সংরক্ষণ করে রাখার ফলে সাধারণীকরণের নিয়ম ভঙ্গ হয়।
বিল কারভিন

2
সত্যি কথা বলতে কি, যখন আমি @ বিলের উত্তরে EAV- র বিবরণটি পড়ি তখন আমি বুঝতে পারি না তিনি কী ব্যাখ্যা দিচ্ছেন। তবে আপনি যখন বলেছিলেন 3 columns: product ID, additional info name, additional info valueআমি ধারণাটি বুঝতে পেরেছি। এবং আমি আসলে এটি আগে করেছি, এবং সমস্যার মধ্যে দৌড়েছি। তবে এই সমস্যাগুলি কী ছিল তা এই মুহূর্তে আমার মনে নেই rec
জেডি আইজ্যাকস

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