ডাটাবেসে মন্তব্য এবং পছন্দগুলি কার্যকর করা হচ্ছে


145

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

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

আমি এখানে কিছু অনুরূপ প্রশ্ন পেয়েছি, কিন্তু তাদের কোনওটির সন্তুষ্ট উত্তর নেই, তাই আমি এই প্রশ্নটি আবার জিজ্ঞাসা করছি।

প্রশ্নটি হল, কীভাবে সঠিকভাবে, দক্ষতার সাথে এবং ইলাস্টিকালি ডেটাবেস ডিজাইন করবেন, যাতে এটি বিভিন্ন টেবিলের জন্য মন্তব্যগুলি সঞ্চয় করতে পারে , বিভিন্ন টেবিলের জন্য পছন্দগুলি এবং ট্যাগগুলির জন্য। উত্তর হিসাবে কিছু ডিজাইনের প্যাটার্ন সেরা হবে;)

বিস্তারিত বিবরণ : আমি একটি আছে টেবিল User আরো 3 কিছু ব্যবহারকারী ডেটা সঙ্গে, এবং টেবিল : Photoসঙ্গে ফটোগ্রাফ , Articlesসঙ্গে নিবন্ধ , Placesসঙ্গে স্থান । আমি যে কোনও লগইন ব্যবহারকারীকে সক্ষম করতে চাই:

  • এই 3 টি টেবিলের যে কোনওটিতে মন্তব্য করুন

  • তাদের পছন্দসই হিসাবে চিহ্নিত করুন

  • তাদের যে কোনওটিকে কিছু ট্যাগ দিয়ে ট্যাগ করুন

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

1 পন্থা :

ক) জন্য ট্যাগ , আমি একটি তৈরি করবে টেবিল Tag [TagId, tagName, tagCounter] , তারপর আমি তৈরি করবে অনেক সাথে অধিকের সম্পর্ক টেবিল জন্য: Photo_has_tags, Place_has_tag, Article_has_tag

খ) মন্তব্যগুলির জন্য একই গণনা।

গ) আমি একটি তৈরি করবে টেবিল LikedPhotos [idUser, idPhoto] , LikedArticles[idUser, idArticle], LikedPlace [idUser, idPlace]। সংখ্যা লাইক দ্বারা গণনা করা হবে প্রশ্নের (যা, আমি অনুমান খারাপ)। এবং...

আমি এই নকশাটি শেষ অংশের জন্য সত্যিই পছন্দ করি না, এটি আমার কাছে খারাপ গন্ধযুক্ত;)


2 তম পদ্ধতি :

আমি একটি টেবিল তৈরি করব ElementType [idType, TypeName == some table name]যা প্রশাসক (আমার) দ্বারা সারণীগুলির নামগুলি পছন্দ করতে , মন্তব্য করতে বা ট্যাগ করার জন্য পপুলেটে যাবে । তারপরে আমি টেবিলগুলি তৈরি করব :

ক) LikedElement [idLike, idUser, idElementType, idLikedElement]এবং প্রত্যেকের জন্য উপযুক্ত কলামগুলির সাথে মন্তব্য এবং ট্যাগগুলির জন্য একই। এখন, আমি যখন কোনও ছবি পছন্দ করতে চাই তখন আমি প্রবেশ করিয়ে দেব:

typeId = SELECT id FROM ElementType WHERE TypeName == 'Photo'
INSERT (user id, typeId, photoId)

এবং স্থানের জন্য:

typeId = SELECT id FROM ElementType WHERE TypeName == 'Place'
INSERT (user id, typeId, placeId)

এবং এইভাবেই ... আমি মনে করি যে দ্বিতীয় পদ্ধতিটি আরও ভাল, তবে আমিও মনে করি যে এই নকশায়ও কিছু হারিয়ে যাচ্ছে ...

অবশেষে, আমি আরও আশ্চর্য হয়েছি যে উপাদানটি কতবার পছন্দ হয়েছিল তার জন্য কাউন্টারটি সঞ্চয় করার সবচেয়ে ভাল জায়গা। আমি কেবল দুটি উপায় সম্পর্কে চিন্তা করতে পারি:

  1. উপাদান ( Photo/Article/Place) টেবিল
  2. নির্বাচিত গণনা দ্বারা ()।

আমি আশা করি যে আমার সমস্যাটি সম্পর্কে আমার ব্যাখ্যাটি এখন আরও বিশদ হয়েছে।


আপনি এক্সএমএল বিবেচনা করেছেন?
কোডি বাগস্টিন

1
আমি মনে মনে এই জাতীয় প্রশ্নগুলি খুব কমই পাই যা আমার মনে যা আছে তা 100%, আপনার প্রশ্নটি দুর্দান্তভাবে সম্পূর্ণ! ধন্যবাদ @ কোকোস
অ্যাডারচক্স

উত্তর:


194

সর্বাধিক বর্ধিত সমাধানটি হ'ল কেবল একটি "বেস" টেবিল ("পছন্দগুলি", ট্যাগ এবং মন্তব্যের সাথে সংযুক্ত), এবং এটি থেকে অন্য সমস্ত সারণী "উত্তরাধিকারী" হওয়া। নতুন ধরণের সত্তা যুক্ত করার জন্য একটি নতুন "উত্তরাধিকারসূত্রে" সারণী যুক্ত করা জড়িত - এটি স্বয়ংক্রিয়ভাবে পুরো / ট্যাগ / মন্তব্য মেশিনারে প্লাগ ইন করে plug

এর জন্য সত্তা-সম্পর্কের শব্দটি হ'ল "বিভাগ" ( ইআরউইন পদ্ধতিসমূহ গাইড , বিভাগ: " সাব - টাইপ সম্পর্ক" দেখুন)। বিভাগের প্রতীকটি হ'ল:

বিভাগ

ব্যবহারকারী একাধিক সত্তা পছন্দ করতে পারে বলে ধরে নেওয়া, একই ট্যাগ একাধিক সত্তার জন্য ব্যবহার করা যেতে পারে তবে একটি মন্তব্য সত্তা-নির্দিষ্ট, আপনার মডেলটি দেখতে এরকম হতে পারে:

ইআর ডায়াগ্রাম


বিটিডাব্লু, "ইআর ক্যাটাগরি" প্রয়োগের জন্য প্রায় 3 টি উপায় রয়েছে:

  • এক টেবিলের মধ্যে সমস্ত প্রকার।
  • পৃথক টেবিলগুলিতে সমস্ত কংক্রিটের প্রকার।
  • পৃথক টেবিলগুলিতে সমস্ত কংক্রিট এবং বিমূর্তি প্রকার।

আপনার যদি কঠোর পারফরম্যান্সের প্রয়োজনীয়তা না থাকে তবে তৃতীয় পদ্ধতিটি সম্ভবত সেরা (অর্থ শারীরিক টেবিলগুলি উপরের চিত্রের 1: 1 এর সাথে মেলে)।


2
দুর্দান্ত উত্তর, আপনাকে ধন্যবাদ। আমি আশা করি, আমি এটি বাস্তবায়ন করতে সক্ষম হব ... এবং আমি ভাবছি যে জ্যাঙ্গো ওআরএম কীভাবে এটি মানচিত্রটি পরিচালনা করবে (বা আমি নিজে কীভাবে এটি করব ... তবে, এটি অন্য সমস্যা;)) তবে, আপনি কি ব্যাখ্যা করতে পারবেন? আমাকে, কারণ আমি মনে করি যে আমি এটি সঠিকভাবে বুঝতে পারছি না - আপনি আমার জন্য যা আঁকেন (ধন্যবাদ!) আপনি উল্লিখিত তৃতীয় পদ্ধতিটি কী?
কোকোস

2
@ কোকোস মূলত, পদ্ধতির (3) অর্থ ENTITY একটি টেবিল, ফটো একটি টেবিল, নিবন্ধটি একটি সারণী এবং PLACE একটি সারণী। পদ্ধতির (২) অর্থ ENTITY এর জন্য কোনও সারণী নেই এবং পদ্ধতির (1) অর্থ কেবল একটি সারণী রয়েছে। এই সমস্ত পদ্ধতির অস্তিত্ব (সমস্ত তাদের শক্তি এবং দুর্বলতা সহ) এর দুর্ভাগ্যজনক পরিণতি যে একটি সাধারণ আরডিবিএমএস স্থানীয়ভাবে টেবিলের উত্তরাধিকারকে সমর্থন করে না।
ব্র্যাঙ্কো দিমিত্রিজেভিক

1
"বিভাগ" এ দুর্দান্ত ব্যাখ্যা এবং রেফারেন্সের জন্য +1 ধন্যবাদ। আমি এটির নিকটে একটি প্রশ্ন পোস্ট করতে যাচ্ছিলাম তবে আপনি এটি এখানে উত্তর দিয়েছেন।
অ্যান্ডি holaday

2
@ ব্র্যাঙ্কো দিমিত্রিজেভিক কেন সত্তার টেবিলগুলি ফটো, আর্টিকেল, স্থানের নিজস্ব পিকে নেই যেমন ফটোআইডি, আর্টিক্যালআইডি ইত্যাদি রাখতে পারে না তবে এফকে হিসাবে সত্তা_আইডি-র জন্য আরও একটি কলাম থাকতে পারে? এটা কি অপ্রয়োজনীয়?
ভলিউম এক

3
@ ওরিওন এর সর্বাধিক BIGINTহ'ল 9223372036854775807. ধরে নিচ্ছি যে আপনি প্রতি সেকেন্ডে একটি সারি .োকাচ্ছেন, আপনি 300 বিলিয়ন বছরে উপলব্ধ মূল্যবোধের বাইরে চলে যাবেন। অবশ্যই, আপনি ততক্ষণে 128-বিট পূর্ণসংখ্যায় পোর্ট করতে সক্ষম হবেন!
ব্র্যাঙ্কো দিমিত্রিজেভিক

22

যেহেতু আপনি ডাটাবেসগুলিকে "ঘৃণা" করছেন, আপনি কেন এটি প্রয়োগ করার চেষ্টা করছেন? পরিবর্তে, এই জিনিসটি ভালবাসেন এবং শ্বাস নেয় এমন কারও কাছ থেকে সহায়তা প্রার্থনা করুন।

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

যদি এটি ওয়ান ম্যান প্রজেক্ট হয় তবে স্টোরেজ পদ্ধতি ব্যবহার করে ডাটাবেস ইন্টারফেসটিকে সাধারণ ক্রিয়াকলাপে প্রোগ্রাম করুন: add_user, update_user, add_comment, add_ Like, upload_photo, list_comments ইত্যাদি code স্কিমাটিকে কোডের এক লাইনে এম্বেড করবেন না। এই পদ্ধতিতে, কোনও কোড প্রভাবিত না করেই ডাটাবেস স্কিমা পরিবর্তন করা যেতে পারে: কেবল সঞ্চিত পদ্ধতিগুলি স্কিমা সম্পর্কে জানতে হবে।

আপনাকে স্কিমাটি কয়েকবার রিফ্যাক্টর করতে হতে পারে। এইটা সাধারণ. প্রথমবার এটি নিখুঁত হওয়ার বিষয়ে চিন্তা করবেন না। প্রাথমিক নকশার প্রোটোটাইপ করার জন্য কেবল এটি যথেষ্ট কার্যকরী করুন। আপনার যদি সময়ের বিলাসিতা থাকে তবে এটি কিছু ব্যবহার করুন এবং তারপরে স্কিমাটি মুছুন এবং এটি আবার করুন। এটি দ্বিতীয়বার সর্বদা ভাল।


2
কারণ এটি আমার নিজের দ্বারা বাস্তবায়ন করা দরকার। কমপক্ষে আপাতত ... এবং, আমি ভেবেছিলাম যে সম্ভবত একটি ডাটাবেসকে কিছুটা পছন্দ করা খুব ভাল উপলক্ষ;) সঞ্চিত পদ্ধতিতে আপনার পরামর্শ সম্পর্কে আপনাকে ধন্যবাদ। কেউ কি জানেন, যদি তারা স্বয়ংক্রিয়ভাবে জ্যাঙ্গো ওআরএম ম্যাপ করে?
কোকোস

6
আমি আপনার শেষ বাক্যটি পছন্দ করি - দ্বিতীয়বার এটি সর্বদা ভাল।
লুইস

2
এটি দ্বিতীয়বার সর্বদা ভাল। হ্যাঁ
গামার

20

এটি একটি সাধারণ ধারণা দয়া করে ক্ষেত্রের নামগুলির স্টাইলিংয়ের দিকে বেশি মনোযোগ দিন না, তবে সম্পর্ক এবং কাঠামোর দিকে বেশি

এখানে চিত্র বর্ণনা লিখুন

এই সিউডোকোডটি আইডি 5 এর সাথে
* সমস্ত ক্রিয়াকলাপগুলি থেকে ক্রিয়াকলাপ নির্বাচন করুন
যেখানে ক্রিয়া করুন .ID_Stuff = 5
এবং ক্রিয়াকলাপ স্টাফ = "ফটো"
এবং ক্রিয়াকলাপগুলি = টাইপ অ্যাকশন = "মন্তব্য"

এই সিউডোকোড আইডি 5 এর সাথে ফটো পছন্দ করেছেন এমন সমস্ত পছন্দ বা ব্যবহারকারী পাবেন
(আপনি কেবল পছন্দগুলির পরিমাণ পাওয়ার জন্য গণনা () ব্যবহার করতে পারেন)

SELECT * FROM actions  
WHERE actions.id_Stuff = 5  
AND actions.typeStuff="photo"  
AND actions.typeAction = "like"  

আমি মনে করি আপনি এমনকি মন্তব্য পছন্দ করতে পারেন, হিসাবে একটি মন্তব্যে একটি "মত" লিঙ্ক ক্লিক করুন। এই ক্যোয়ারী আইডি 133 সহ একটি মন্তব্য (ক্রিয়া) এর পছন্দগুলি পাবেন: SELECT * FROM actions WHERE actions.id=133 AND actions.typeStuff = "comment" AND actions.typeAction = "like"
user964260

1
আমি অবশ্যই আমার সিস্টেমের আরও প্রকাশের জন্য এই সমাধানটি মনে রাখব :)
কোকোস

আমার কাছে দুটি স্টাফ টেবিল স্টাফ 1 এবং স্টাফ 2 রয়েছে ... আমি এই চিত্রটি অনুসরণ করেছি তবে এটি ব্যবহার করার সময় স্কিএল ত্রুটি রয়েছে ... স্টাফ 1, স্টাফ 2 স্বতন্ত্র প্রাথমিক কীগুলির সাথে দুটি স্বতন্ত্র টেবিল রয়েছে এবং ক্রিয়া সারণিতে একটি কলাম আইডি_স্টফ রয়েছে যা রেফারেন্স করছে এই দুটি টেবিল স্টাফ 1, স্টাফ 2। এখন উদাহরণস্বরূপ স্টাফ 1 এর 5 টি সারি রয়েছে, স্টাফ 2-এ 10 টি সারি রয়েছে, যখন আমি আইডি_স্টফের সাথে 5 এর চেয়ে কম কিছু দিয়ে সারণী সারণিতে সারি যুক্ত করার চেষ্টা করি তখন '3' বলি এটি কোয়েরি কার্যকর করে কারণ উভয় স্টাফ 1 এবং আইডিস্টফ '3' সহ একটি সারি রয়েছে। স্টাফ 2, তবে যদি আমি আইডি_স্টফের সাথে 5 টিরও বেশি সারি যুক্ত করার চেষ্টা করি ... (পরবর্তী মন্তব্যে অবিরত থাকুন)
উইকস ডেড

1
যদি কেউ এইভাবে পছন্দগুলি বাস্তবায়িত করতে চান তবে এটি নতুন পছন্দকারীর ব্যবহারকারীকে জানান দেওয়া আরও কঠিন করে তোলে difficult এটি অন্য টেবিল প্রয়োজন।
গ্রেগ এল

4
id_stuffতিনটি টেবিলের প্রতিটিটিতে কীভাবে কলামটিতে অনন্য মূল্য থাকবে?
ভলিউম এক

0

আমি যতটুকু বুঝি. বিভিন্ন টেবিল প্রয়োজন। তাদের মধ্যে অনেক সম্পর্ক আছে।

  • সারণী যা ব্যবহারকারীর ডেটা যেমন পরিচয় ক্ষেত্রের সাথে নাম, উপাধি, জন্ম তারিখ সংরক্ষণ করে।
  • টেবিল যা ডেটা ধরণের সঞ্চয় করে। এই ধরণেরগুলি ফটো, শেয়ার, লিঙ্ক হতে পারে be প্রতিটি ধরণের অবশ্যই একটি অনন্য টেবিল থাকতে হবে। অতএব, তাদের পৃথক সারণী এবং এই টেবিলের মধ্যে একটি সম্পর্ক রয়েছে।
  • প্রতিটি বিভিন্ন তথ্য টাইপের এর টেবিল থাকে has উদাহরণস্বরূপ, স্থিতি আপডেট, ফটো, লিঙ্কগুলি।
  • শেষ সারণি অনেকের সাথে অনেকগুলি সম্পর্কিত যা একটি আইডি, ব্যবহারকারী আইডি, ডেটা টাইপ এবং ডেটা আইডি সঞ্চয় করে।

আপনি যদি আপনার ডাটাবেস চিত্রটি পোস্ট করেন। আমি সম্পর্ক আঁকতে পারি
এরেনকান

0

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

যদি কম টেবিলের প্রয়োজন হয় এমনটির পক্ষে না হন

এক্ষেত্রে:

  1. মন্তব্য যুক্ত করুন: আপনি হয় একটি নির্দিষ্ট অনেক / অনেক টেবিল বাছাই বা পছন্দ করা হচ্ছে যা জন্য একটি নির্দিষ্ট নির্দিষ্ট সনাক্তকারী সঙ্গে একটি সাধারণ টেবিল sertোকানো, আমি মনে করি ক্লায়েন্ট কোড আপনার দ্বিতীয় ক্ষেত্রে সামান্য সহজ হবে।
  2. আইটেমটির জন্য মন্তব্যগুলি সন্ধান করুন: এখানে সাধারণ টেবিলটি ব্যবহার করা কিছুটা সহজ বলে মনে হচ্ছে - আমাদের সত্ত্বার ধরণের মাধ্যমে একটি মাত্র প্রশ্ন রয়েছে
  3. এক ধরণের জিনিস সম্পর্কে কোনও ব্যক্তির মন্তব্যগুলি সন্ধান করুন: উভয় ক্ষেত্রেই সহজ জিজ্ঞাসা
  4. একজন ব্যক্তির সমস্ত বিষয় সম্পর্কে সমস্ত মন্তব্য সন্ধান করুন: এটি উভয় দিক দিয়েই খুব কম মনে হচ্ছে।

আমি মনে করি আপনার "বৈষম্যযুক্ত" পদ্ধতি, বিকল্প 2, কিছু ক্ষেত্রে সহজ প্রশ্ন উত্পন্ন করে এবং অন্যদের মধ্যে খুব খারাপ মনে হয় না তাই আমি এটির সাথে যাব।


0

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


-1

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

একদিন আপনাকে এই জাতীয় কাঠামো থেকে পাঠগুলি অনুকূল করতে হবে। আপনি বেস বেসগুলির উপর সহজেই অগ্রগতি সারণীগুলি তৈরি করতে পারেন এবং লেখাগুলিতে কিছুটা হারাতে পারেন।

অভিধান সহ একটি বড় টেবিল একদিন নিয়ন্ত্রণহীন হয়ে উঠতে পারে।


আরও সারণী মানে এটি কম রক্ষণাবেক্ষণযোগ্য হবে। পৃথক টেবিলগুলি বেশিরভাগ ডি / বিএস দ্বারা তীক্ষ্ণ করা যায়।
wallyk ২১ শে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.