পোস্টের জন্য পছন্দ বা ভোট


10

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

প্রথম

পোস্ট:

id   head   message   datepost   likes   dislikes
1     ab    anchdg     DATE      1,2,3   7,55,44,3

উপরের উপায়ে idপোস্টটিড হয়। পছন্দসই কলামে, 1,2,3ব্যবহারকারীর আইডি হ'ল যারা পোস্ট বা ব্লগটিকে পছন্দ করেছে বা উন্নত করেছে। 7,55,44,3পোস্ট বা ব্লগকে অপছন্দ বা নিম্নমান দেওয়া ব্যবহারকারীদের আইডি।

দ্বিতীয়

পোস্ট:

id    head  message   datepost
1     ab    anchdg     DATE

পছন্দ:

id    postid    userid
1       1         1
2       2         2

অপছন্দ:

id    postid    userid
1       1         7
2       1         55

এইভাবে, পোস্টের পছন্দগুলি পেতে আমাকে পছন্দ ও অপছন্দের জন্য দুটি পৃথক সারণী তৈরি করতে হবে। এইভাবে, টেবিলগুলি Likes& যেমন Dislikesভারীভাবে পূর্ণ হবে। এটি টেবিলটি ভারী এবং প্রক্রিয়াকরণটি ধীর করতে পারে।

সুতরাং, আমি জানতে চাই যে এই কাজটি অর্জনের সর্বোত্তম এবং মানক উপায় কী?


4
আমি ধরে নিচ্ছি যে কোনও ব্যবহারকারী কোনও পোস্ট পছন্দ এবং অপছন্দ করতে পারে না ? যদি তা হয় তবে আমার কাছে পছন্দ এবং অপছন্দের জন্য একটি টেবিল থাকতে হবে, একটি বিআইটি কলাম সহ (1 টি পছন্দ হিসাবে, অপছন্দের জন্য 0)।
dwjv

1
অথবা সহজ অঙ্কের জন্য 1 এবং -1
jkavalik

1
@dwjv প্রথম উদাহরণে 3 জন ব্যবহারকারী প্রকৃতপক্ষে পোস্টটি পছন্দ করেছেন এবং অপছন্দ করেছেন।
ড্যান হেন্ডারসন

উত্তর:


20

আপনি যে সমস্যার মুখোমুখি হচ্ছেন তা ডেটাবেসের "সাধারণ ফর্মগুলি" হিসাবে পরিচিত, বিশেষত প্রথম সাধারণ ফর্ম। https://en.wikedia.org/wiki/First_normal_form

সংক্ষিপ্ত ব্যবহারকারীর আইডি (প্রথম সংস্করণ) সহ আপনার ডেটাবেস প্রথম সাধারণ আকারে নয়।

সাধারণত কেন এবং কীভাবে সাধারণীকরণকে ভাল হিসাবে বিবেচনা করা হয় তার জন্য https://en.wikedia.org/wiki/Datedia_normalization দেখুন ।

আপনার প্রথম উদাহরণে, "ব্যবহারকারী 4 এর পোস্টটি আর পছন্দ করে না" এর ক্যোয়ারী জটিল হয়ে ওঠে। এটি স্ট্রিং অপারেশন করতে হবে, যার পার্শ্ব প্রতিক্রিয়া এবং কর্নার কেসগুলি বিবেচনা করতে হবে (ব্যবহারকারী একমাত্র "পছন্দ" ব্যবহারকারী, ব্যবহারকারী সর্বশেষ পছন্দকারী ব্যবহারকারী, ব্যবহারকারী পছন্দকারীর স্ট্রিংয়ের মাঝখানে রয়েছে)। আমি এই খারাপ দেখতে পাবেন। এটা করবেন না। একটি সাধারণ নকশা ব্যবহার করুন।

পুনরায়: ডাটাবেস ভারী হয়ে যায়

আপনার যদি 4 মিলিয়ন লাইকযুক্ত একটি পোস্ট থাকে তবে ডেটাবেস ডিজাইন 1 এ আপনার কমপক্ষে একটি "লাইকস" কলাম রয়েছে যা কমপক্ষে 4 মিলিয়ন অক্ষর প্রশস্ত হবে (কারণ আপনার বিভাজনের জন্য কমা দরকার হবে)। এরপরে আপনাকে চার লক্ষ অঙ্ক প্রশস্ত স্ট্রিংয়ের স্ট্রিং অপারেশন করতে হবে। এটি অত্যন্ত অপ্রতিরোধ্য এবং ধীর slow

অন্যদিকে, ডাটাবেসগুলি কয়েক মিলিয়ন সারি হ্যান্ডেল করার জন্য ডিজাইন করা হয়েছে। আমাদের কয়েকশ মিলিয়ন সারি সহ ডাটাবেস রয়েছে এবং গণনা () - ক্রিয়াকলাপগুলি দ্রুত। অত্যন্ত দ্রুত। সুতরাং না, এটি কোনও পারফরম্যান্সের বাধা হয়ে দাঁড়াবে না।

পরবর্তী সংখ্যাটি পঠনযোগ্যতা এবং রক্ষণাবেক্ষণযোগ্যতা হবে।

উদাহরণস্বরূপ, আমাকে বলুন যে এই 2 টি বিবৃতি কী করে:

select count(*)
from posts
inner join likes on posts.postid = likes.postid
where postid = 7

select len(likes) - len(replace(likes, ',', ''))
from posts
where postid = 7

আমি যেমন উল্লেখ করেছি, কোটি বা কোটি কোটি পছন্দ যদি টেবিলে উপস্থিত থাকে, তবে টেবিলটি ভারী হয়ে উঠবে না? টেবিলটি খুব দ্রুত পূর্ণ হয়ে যাবে বলে কোটি কোটি রেকর্ড সহ একটি টেবিল সন্ধান করতে খুব বেশি সময় লাগবে না?
হর্ষিত শ্রীবাস্তব

6
@ হারশিতশ্রীবাস্তব মাইএসকিএল আপনার বিলিয়ন সারিগুলির সাধারণ টেবিলগুলি পরিচালনা করতে পারে, তবে আপনার ব্যবহারকারীদের সারণীতে স্ট্রিং হিসাবে সেই বিলিয়ন (ডিস) পছন্দগুলি কল্পনা করুন - এটি আরও বড় এবং কাজ করা আরও কঠিন হতে পারে।
jkavalik

3
@Til_b একটি জিনিস সরাসরি উল্লেখ করে না (তবে সাধারণত সাধারণ ফর্মগুলি ব্যবহারের মাধ্যমে বোঝানো হয়) এটি হ'ল দ্বিতীয় ডিজাইনটি সঠিকভাবে প্রয়োগ করা হলে অন্তর্নিহিত ডাটাবেস ইঞ্জিনকে রেফারেন্সিয়াল অখণ্ডতা বজায় রাখার অনুমতি দেবে যা প্রথম ডিজাইনের ধরণ দিয়ে করা যায় না। এর মূল অর্থ হল, যদি ব্যবহারকারী 4 মুছে ফেলা হয় তবে ডাটাবেসটি লিঙ্কযুক্ত ডেটা সাফ করবে কারণ এটি জানে যে কোন রেকর্ডারটি ব্যবহারকারী 4 রেকর্ডের উপর নির্ভরশীল। প্রথম নকশা এটি অক্ষম কারণ ডেটাবেস স্বজ্ঞাতভাবে স্ট্রিংয়ের মধ্যে কীভাবে সম্পর্ক পরিচালনা করবেন তা জানে না know
ডেভিড আন্তারামিয়ান

9

দ্বিতীয় উপায়টি আরও ভাল কারণ আপনি সহজেই পছন্দ / অপছন্দ যুক্ত করতে বা মুছতে পারেন।

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

সম্মিলিত প্রাথমিক কী হিসাবে পোস্ট_আইড এবং ব্যবহারকারী_আইডি সেট করুন এবং এটি দুর্দান্ত কাজ করে।

সময়ের সাথে সাথে টেবিলের আকার বাড়বে। তবে এতে আপনার দুটি মাত্র কলাম রয়েছে। আইডি এবং পছন্দ / অপছন্দের মান। পোস্টটিড এবং ইউজারিড কেবলমাত্র এটির সাথে লিঙ্কযুক্ত এবং আপনার ব্যবহারকারী এবং পোস্ট সারণীতে সঞ্চিত।


3
আপনার উচিত user_id, post_idএবং valueটেবিলে। আলাদা idকলামের দরকার নেই ।
jkavalik

3
প্রশ্নে @ জাকাওয়ালিকের মন্তব্যে যেমন পরামর্শ দেওয়া হয়েছে, 1 এবং -1 সম্ভবত 1 এবং 2 এর চেয়ে পছন্দ ও অপছন্দের জন্য আরও ভাল মান হতে পারে, কারণ এটি একটি সাধারণ টেবিলের যোগফলের মাধ্যমে মোট স্কোর গণনা সক্ষম করে, গণনার বিয়োগ বাদ দিয়ে "1" সহ সারির গণনা থেকে "2" দিয়ে সারি।
ড্যান হেন্ডারসন

@ ড্যানহেন্ডারসন: পছন্দ-অপছন্দের কিছু একটা যোগফলের চেয়ে বেশ কিছুটা দ্রুত হতে পারে। (তাই বলা হয়, যদিও, এটি 1 এবং -1 সঙ্গে কাজ করবে।)
Chao

আপভোটেড, আপনি যদি প্রেম এবং রাগের মতো আরও 2 টি ক্রিয়া বলতেন তবে আপনি এটি কীভাবে করবেন? আমি পছন্দগুলির জন্য 1 এবং 2 টি আরও ক্রিয়া সহ অপছন্দের জন্য বোঝাতে চাইছি
পাইরেটএপ

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