বাছাই করা তালিকা সংরক্ষণের জন্য কীভাবে একটি ডাটাবেস ডিজাইন করবেন?


42

আমি একটি ডাটাবেসের ভিতরে বাছাই করা তালিকা সংরক্ষণ করতে চাই। আমি নিম্নলিখিত অপারেশনগুলি দক্ষতার সাথে সম্পাদন করতে চাই।

  1. সন্নিবেশ (এক্স) - সারণীতে রেকর্ড এক্স .োকান
  2. মুছুন (এক্স) - টেবিল থেকে রেকর্ড এক্স মুছুন
  3. (X, n) - এর আগে - সাজানো তালিকায় রেকর্ড এক্সের আগের 'এন' রেকর্ডগুলি ফিরিয়ে দিন।
  4. (X, n) এর পরে - সাজানো তালিকায় রেকর্ড এক্সকে সফল করে 'এন' রেকর্ডগুলি ফিরিয়ে দিন।
  5. প্রথম (এন) - সাজানো তালিকা থেকে প্রথম 'এন' রেকর্ডগুলি ফিরিয়ে দিন।
  6. সর্বশেষ (এন) - বাছাই করা তালিকা থেকে শেষ 'এন' রেকর্ডগুলি ফিরিয়ে দিন।
  7. (X, y) তুলনা করুন - টেবিল থেকে দুটি রেকর্ড দেওয়া x এবং y, x> y কিনা সন্ধান করুন।

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

বিশেষত, আমি অ্যামাজনের সিম্পলডিবি ব্যবহার করে টেবিলটি প্রয়োগ করতে চাই। তবে একটি রিলেশনাল ডাটাবেসের জন্য সাধারণ উত্তরটিও সহায়ক হওয়া উচিত।

লোড প্রোফাইলে আপডেট করুন:

যেহেতু আমি এটি একটি ওয়েব অ্যাপ্লিকেশনের জন্য পরিকল্পনা করছি, এটি অ্যাপ ব্যবহারকারীর সংখ্যার উপর নির্ভর করে।

যদি 100k সক্রিয় ব্যবহারকারী থাকে (সুপার আশাবাদ: পি), তবে প্রতিদিন আমার প্রায় আনুমানিক অনুমান হবে

500k নির্বাচন করে, 100k সন্নিবেশ এবং মোছা, 500 কে আপডেট

আমি টেবিলটি মোট 500 কিলোমিটার বাড়ার আশা করব।

আমি আপডেটগুলি, sertোকানো এবং তুলনা অপারেশনগুলিতে অনুকূলিতকরণ করতে চাই। আইটেমের র‌্যাঙ্ক ক্রমাগত পরিবর্তিত হবে এবং আমার টেবিলটি আপডেট করা দরকার।


আপনার প্রত্যাশিত লোড প্রোফাইলে কিছুটা বিস্তৃত করুন। প্রতিদিন কতগুলি নির্বাচন / সন্নিবেশ / আপডেট হয়? আপনি কোন ক্রিয়াকলাপটি সবচেয়ে বেশি অনুকূল করতে চান? আপনি প্রতিদিন কতটা বড় টেবিলটি বাড়তে পারেন বা মোট পেতে চান?
নিক চ্যামাস

এটি কি কোনও প্লেয়ার র‌্যাঙ্কিং বোর্ডের জন্য? যাইহোক, আমি আপনার প্রস্তাবিত লোড প্রোফাইলের উপর ভিত্তি করে প্রতিক্রিয়া সহ আমার উত্তরটি আপডেট করেছি।
নিক চ্যামাস

না এটি কোনও প্লেয়ার র‌্যাঙ্কিং বোর্ড নয়।
চিত্তি

আপনি কোন পদ্ধতির ব্যবহার শেষ করেছেন?
নিক চ্যামাস 21

আমি এখানে কী জিজ্ঞাসা করা হচ্ছে বা আপনার যে জিনিসগুলি করা দরকার তা ধরণের লন্ড্রি তালিকা থেকে আপনাকে কী করতে হবে তা সম্পর্কেও আমি নিশ্চিত নই।
ইভান ক্যারল

উত্তর:


22

যদি র‌্যাঙ্কটি সম্পূর্ণ নির্বিচারে না হয় তবে পরিবর্তে অন্য কোনও সম্পত্তি থেকে উদ্ভূত হয় (যেমন নাম, প্লেয়ারের স্কোর ইত্যাদি) তবে জোয়েলের উত্তরটি ভালভাবে দেখুন ।

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

আপনি উচ্চ সন্নিবেশ এবং আপডেট ক্রিয়াকলাপ প্রত্যাশিত, তবে তুলনামূলকভাবে উচ্চ পঠিত ক্রিয়াকলাপ, আমি নিম্নলিখিতটি করার পরামর্শ দিই:

  • র‌্যাঙ্কের টেবিলটি ক্লাস্টার করুন, বিশেষত যদি আপনার প্রশ্নের সিংহভাগ র‌্যাঙ্কের বিপরীতে থাকে। যদি না হয়, বা যদি একটি ক্লাস্টারিং কী নির্বাচন করা সিম্পলডিবিতে উপলভ্য না থাকে তবে কেবল শীর্ষস্থানীয় কলাম হিসাবে র‌্যাঙ্কযুক্ত একটি সূচক তৈরি করুন। এটি প্রশ্নগুলি 3-6 পূরণ করবে fy
  • রেকর্ডে প্রথমে একটি সূচক এবং তারপরে র‌্যাঙ্ক (অথবা, এসকিউএল সার্ভারের জগতে, কেবল রেকর্ড এবং- INCLUDEর‌্যাঙ্ক, বা আপনি র‌্যাঙ্কে ক্লাস্টার করেছেন তবে কেবল রেকর্ড করুন) কোয়েরিটি 7 পূরণ করবে।
  • আপনার ডেটা যথাযথভাবে ফাঁক করে (অর্থাত্ FILLFACTORএসকিউএল সার্ভারে সেটিংস সেট করে ) অপারেশনগুলি 1 এবং 2 অনুকূলিত করা যেতে পারে । এটি বিশেষত গুরুত্বপূর্ণ যদি আপনি র‌্যাঙ্কে ক্লাস্টার করেন।
  • আপনি র‌্যাঙ্কগুলি সন্নিবেশ বা আপডেট করার সাথে সাথে র‌্যাঙ্ক সংখ্যার মধ্যে যতটা সম্ভব ফাঁক রাখুন সম্ভাবনা হ্রাস করতে আপনার সম্ভাব্য র‌্যাঙ্ক সন্নিবেশ বা আপডেটের জন্য কোনও বিদ্যমান রেকর্ডকে পুনরায় র‌্যাঙ্ক করতে হবে। উদাহরণস্বরূপ, আপনি যদি 1000 এর পদক্ষেপগুলিতে আপনার রেকর্ডগুলি র‌্যাঙ্ক করেন তবে আপনি প্রায় অর্ধেকের জন্য পর্যাপ্ত জায়গা রেখেছেন যে নূন্যতম সুযোগ সহ অনেকগুলি পরিবর্তন এবং সন্নিবেশ করানো আপনাকে সেই পরিবর্তনগুলির সাথে সরাসরি জড়িত নয় এমন একটি রেকর্ড পুনরায় র‌্যাঙ্ক করতে হবে।
  • প্রতি রাতে তাদের মধ্যে র‌্যাঙ্ক ফাঁকগুলি পুনরায় সেট করতে সমস্ত রেকর্ডকে পুনরায় স্থান দিন।
  • আপনার বিদ্যমান রেকর্ডের সংখ্যার তুলনায় আপনার সন্নিবেশকৃত সন্নিবেশ বা আপডেটের সংখ্যার সাথে সামঞ্জস্য রাখতে পুনরায় র‌্যাঙ্কিংয়ের পাশাপাশি র‌্যাঙ্ক ফাঁক আকারের ফ্রিকোয়েন্সি টিউন করতে পারেন। সুতরাং আপনার যদি 100 কে রেকর্ড থাকে এবং আপনার সন্নিবেশগুলি এবং আপডেটগুলি এর 10% হওয়ার প্রত্যাশা করে, 10 কে নতুন র‌্যাঙ্কের জন্য পর্যাপ্ত জায়গাটি ছেড়ে দিন এবং রাত্রে পুনরায় র‌্যাঙ্ক করুন।
  • 500K রেকর্ড পুনরায় র‌্যাঙ্কিং একটি ব্যয়বহুল ক্রিয়াকলাপ, তবে দিনের বা সপ্তাহের বাইরে একবার-করা একবারের মতো ডাটাবেসের জন্য ভাল হওয়া উচিত। র‌্যাঙ্কের ব্যবধানগুলি বজায় রাখার জন্য এই অফ-ঘন্টা গণের পুনরায় র‌্যাঙ্কিং হ'ল যা আপনাকে প্রতিটি র‌্যাঙ্ক আপডেটের জন্য অনেকগুলি রেকর্ড পুনরায় র‌্যাঙ্ক করা বা আপনার স্বাভাবিক এবং শীর্ষ সময়কালে সন্নিবেশ করিয়ে দেয়।

আপনি যদি 100K + আকারের টেবিলে 100K + পড়ার প্রত্যাশা করেন তবে আমি লিঙ্কযুক্ত তালিকার পদ্ধতির ব্যবহারের পরামর্শ দিই না। এটি সেই আকারগুলিতে ভাল স্কেল করবে না।


স্থানগুলি পরিবর্তনযোগ্য। আমি আশা করছি যে র‌্যাঙ্কগুলি ক্রমাগত পরিবর্তন হবে এবং নিয়মিত নতুন রেকর্ড সন্নিবেশিত হবে। আমি কেসটি নিয়ে চিন্তিত যখন আমি কোনও র‌্যাঙ্ক সহ একটি নতুন উপাদান inোকি তখন নতুন রেকর্ডের নীচে সমস্ত রেকর্ডের ক্রম অনুসারে পরিবর্তন করা দরকার। আমার ডাটাবেসে কয়েক হাজার রেকর্ড থাকা অবস্থায় কি এটি ব্যয়বহুল অপারেশন নয়?
চিত্তি

@ ছিট্টি - আহ, এটি উদ্বেগের বিষয়। আপনি আপনার র‌্যাঙ্কিংয়ের বাইরে রাখতে পারেন (উদাঃ 0, 1000, 2000, 3000, ...) এবং পর্যায়ক্রমে র‌্যাঙ্ক ফাঁক পূরণ হওয়ায় সমস্ত রেকর্ড পুনরায় র‌্যাঙ্ক করে। যদিও আপনি কয়েক হাজার হাজার রেকর্ডের তুলনায় অনেক বেশি আশা করেন তবে এটি স্কেল হবে না।
নিক চ্যামাস

1
@ চিট্টি - এটি আসলে মজার বিষয়। ডাটাবেস ইঞ্জিনগুলি ডেটা ইনডেক্স করার সময় হুবহু এটিই সমস্যা, কারণ তারা এটি অর্ডার করে এবং ডেটা যুক্ত বা পরিবর্তিত হিসাবে এটি পুনরায় অর্ডার করে। আপনি যদি সন্ধান করেন FILLFACTORতবে দেখতে পাবেন এটি মূলত একটি সূচীতে রেকর্ডের জন্য সেই অতিরিক্ত স্থান তৈরি করার জন্য বোঝানো হয়েছিল, ঠিক যেমনটি বর্ণিত র‌্যাঙ্ক ফাঁকগুলি র‌্যাঙ্কের পরিবর্তন এবং সন্নিবেশের জন্য স্থান তৈরি করে।
নিক চ্যামাস

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

@ চিত্তী - এই প্রশ্নটির স্বীকৃত উত্তর দুর্দান্ত। এটি এখানে বর্ণিত একই পদ্ধতির পরামর্শ দেয়, সংখ্যার পরিবর্তে দশমিকগুলি ব্যবহারের অতিরিক্ত পরামর্শ সহ র‌্যাঙ্কগুলি নির্ধারণ এবং পরিবর্তনের ক্ষেত্রে আপনার নমনীয়তাটিকে ব্যাপকভাবে প্রসারিত করতে। দুর্দান্ত খুঁজে।
নিক চাম্মাস

13

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

বিকল্প বিকল্প হ'ল টেবিলে "পূর্বসূরি" রিফ্লেক্সেভ বিদেশী কী কলামটি ব্যবহার করে লিঙ্কযুক্ত তালিকা হিসাবে রেকর্ডগুলি মডেল করা:

ID   setID   item       predecessor
---  ------  ------     ------------
1    1       Apple      null
2    1       Orange     1
3    2       Cucumber   null
4    1       Pear       2
5    1       Grape      4
6    2       Carrot     3

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

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


2
লিঙ্কযুক্ত তালিকার মডেলটি ঝরঝরে। এসকিউএল সার্ভারের ক্রমে এই জাতীয় শ্রেণিবিন্যাস পুনরুদ্ধার করতে আপনি পুনরাবৃত্ত সিটিই ব্যবহার করবেন ।
নিক চ্যামাস

যদিও লম্বা টেবিলের জন্য সেই স্তরক্রমটি তৈরি করা বেশ ব্যয়বহুল। সুবিধাটি হ'ল র‌্যাঙ্কের পরিবর্তন / সন্নিবেশ / ইত্যাদি সহজেই করা যায়। চিতির প্রত্যাশিত লোড প্রোফাইলের উপর নির্ভর করে এটি সম্ভবত সেরা পন্থা হতে পারে।
নিক চাম্মাস

সংযুক্ত তালিকার বিকল্পটি তুলনা বাদে সমস্ত ক্রিয়াকলাপের জন্য সেরা ধারণার মতো দেখায়। দুটি ধারণাটির সাথে তুলনামূলকভাবে কোনও পথ খুঁজে না পেয়ে আমি কীভাবে তুলনা করতে পারি তা কোনও ধারণা?
চিত্তি

আপনার কাছে আইটেমগুলির আইডি থাকলে আমি মনে করি তুলনা () তুলনা করা () সোজা হবে, যদি না আপনি তুলনা () এর অর্থ কী বোঝেন। আপনি যখন বলেছিলেন: "x> y" সন্ধান করুন এর অর্থ কি "x পূর্ববর্তী y" সন্ধান করুন? আমি দেখতে পাচ্ছি না কাস্টম ইনডেক্স বা স্টোরেজ প্রক্রিয়া ছাড়া সহজ হওয়া যা তালিকায় চলে যাবে (বা @ নিক দ্বারা উল্লিখিত আকর্ষণীয় সিটিই বৈশিষ্ট্য)।
বিপানুল্লা

5
এই ধরণের সমাধান গ্রাফের ডেটা মডেল ( en.wikedia.org/wiki/Graph_theory ) এরও প্রায় অনুমান করে । গ্রাফ নোড এবং প্রান্তগুলি সংরক্ষণের জন্য অনুকূলিত একটি স্টোরেজ সিস্টেমটি কোনও আরডিবিএমএসের চেয়ে ভাল সমাধান হতে পারে। ট্রিপল- এবং কোয়াড-স্টোর এবং নিও 4 জ এর মতো গ্রাফ ডাটাবেসগুলি এতে বেশ ভাল।
বিপানুল্লা

6

আমি মনে করি কাজটি হ'ল র্যাঙ্ক গণনা করার জন্য ব্যবহৃত সম্পত্তি বা বৈশিষ্ট্যগুলি সংরক্ষণ করা এবং তারপরে একটি সূচক তৈরি করা। ডাটাবেসটিকে স্থিতির ক্রমে ডেটাবেসটিকে শারীরিকভাবে সঞ্চয় করতে বা একটি ম্যানুয়ালি ম্যানেজড লিঙ্কযুক্ত তালিকা ব্যবহার করার জন্য বলার চেষ্টা করার পরিবর্তে, কেন ডাটাবেস ইঞ্জিনটি এটির জন্য নকশা করা হয়েছিল তা করতে দিচ্ছে না?


2
যদি 'র‌্যাঙ্ক গণনা করতে ব্যবহৃত বৈশিষ্ট্যগুলি' নির্বিচারে হয় তবে কী হবে? উদাহরণস্বরূপ: শপিং কার্টের এন্ট্রিগুলির একটি সেট যা ব্যবহারকারীর স্বেচ্ছাসেবী কর্মের ভিত্তিতে পুনরায় সাজানো হয় ered
চিট্টি

আপনি যখন র‌্যাঙ্কটি নির্বিচারে বলছেন, আপনার অর্থ কী? একটি অ্যালগরিদম থাকতে হবে যা আপনি র‌্যাঙ্কটি কী হবে তা গণনা করতে ব্যবহার করেন। উদাহরণস্বরূপ: "শপিং কার্টের এন্ট্রিগুলির উপর ভিত্তি করে" - ভিত্তিক কীভাবে? ডাটাবেসে অবশ্যই এমন কিছু সঞ্চিত থাকতে হবে যা র‌্যাঙ্ক গণনার জন্য চালক। এটি বেশ কয়েকটি জিনিসের সংমিশ্রণ হতে পারে তবে এই জিনিসগুলি কোনওভাবে গ্রাহকের টেবিল বা গ্রাহকের সাথে সম্পর্কিত টেবিলগুলিতে সংরক্ষণ করা উচিত। যদি এটি ডেটাতে থাকে তবে আপনি কোনও ফাংশন তৈরি করতে পারেন যা এটি গণনা করে। আপনি যদি এটি গণনা করতে পারেন তবে আপনি এটি সঞ্চয় করতে এবং এটির উপরে সূচী করতে পারেন।
জোয়েল ব্রাউন

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

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

3
শপিং কার্টটি কেবলমাত্র একটি উদাহরণ যা আমি দেখিয়েছি যে 'র‌্যাঙ্ক' নির্বিচারে হতে পারে এমন কেস রয়েছে। হতে পারে যে এটি একটি দুর্দান্ত উদাহরণ ছিল না। নেটফ্লিক্স ডিভিডি সারি আরও ভাল উদাহরণ হতে পারে। কেবল যুক্তি দেখানোর জন্য 100k আইটেমের সাথে নেটফ্লিক্স সারিটি কল্পনা করুন যা ব্যবহারকারীর মাধ্যমে নির্বিচারে পুনরায় সাজানো যেতে পারে এবং প্রতি মিনিটে তিনি তা করেন। এই অনুমান অ্যাপ্লিকেশনটিতে মুভিগুলির অর্ডার করা তালিকার অর্পণ করার জন্য আপনি কীভাবে একটি ডেটাবেস ডিজাইন করবেন?
চিত্তি

1

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

আরডিবিএমএসের মতো SQL server, আপনার প্রয়োজনীয় বৈশিষ্ট্যগুলি ক্লাস্টারড ইনডেক্সের প্রাথমিক কারণ।

  • সারণি (এক্স) - সারণি> রেকর্ড সারণি মধ্যে রেকর্ড এক্স .োকান।
  • মুছুন (এক্স) - টেবিল থেকে রেকর্ড এক্স মুছুন> সরান মুছুন।
  • (X, n) - এর আগে - সাজানো তালিকায় রেকর্ড এক্সের আগের 'এন' রেকর্ডগুলি ফিরিয়ে দিন। > শীর্ষস্থানীয় ফলাফলগুলি নির্বাচন করুন যেখানে ক্লজ অনুসারে মান এবং ক্রমের তুলনায় x কম।

  • (X, n) এর পরে - সাজানো তালিকায় রেকর্ড এক্সকে সফল করে 'এন' রেকর্ডগুলি ফিরিয়ে দিন। > শীর্ষস্থানীয় ফলাফলগুলি নির্বাচন করুন যেখানে ক্লজ অনুসারে মান এবং শৃঙ্খলার চেয়ে x বড়।

  • প্রথম (এন) - সাজানো তালিকা থেকে প্রথম 'এন' রেকর্ডগুলি ফিরিয়ে দিন। > শীর্ষ এন ফলাফল নির্বাচন করুন।

  • সর্বশেষ (এন) - বাছাই করা তালিকা থেকে শেষ 'এন' রেকর্ডগুলি ফিরিয়ে দিন। > Desc দ্বারা অর্ডার করার পরে শীর্ষ এন ফলাফলগুলি নির্বাচন করুন।

  • (X, y) তুলনা করুন - টেবিল থেকে দুটি রেকর্ড দেওয়া x এবং y, x> y কিনা সন্ধান করুন। > টিএসকিউএল যদি বিবৃতি দেয়।

সিম্পলডিবি স্বয়ংক্রিয় সূচী, বাছাই এবং একটি মৌলিক কোয়েরি ভাষা সরবরাহ করে । আমি আরডিবিএমএস বেছে নিলেও আমার সমস্যা থেকেই যাবে। সমস্যাটি কারণ আমার ডাটাবেসে ডেটা র‌্যাঙ্কিং ইচ্ছামত পরিবর্তন হয় এবং সেগুলি একক সম্পত্তি হিসাবে ক্যাপচার করা যায় না (যদি না আমি কাস্টম র‌্যাঙ্ক কলাম ব্যবহার করি) যা সূচী করা যায়।
চিত্তি

0

এখানে প্রতিটি পোস্টের পরে আমার পোস্টগ্রিস টেবিলটিকে আবার র‌্যাঙ্ক করতে ব্যবহার করলাম:

CREATE OR REPLACE FUNCTION re_rank_list() RETURNS trigger AS $re_rank_list$
DECLARE
    temprow record;
    row_idx integer := 1;    
BEGIN
    FOR temprow IN
    SELECT * FROM your_schema.your_list WHERE list_id = NEW.list_id ORDER BY rank ASC
    LOOP
        UPDATE your_schema.your_list SET rank = row_idx * 100 WHERE id = temprow.id;
        row_idx := row_idx + 1;
    END LOOP;
    RETURN NEW;
END;
$re_rank_list$ LANGUAGE plpgsql;


CREATE TRIGGER re_rank_list AFTER UPDATE ON your_schema.your_list_value
    FOR EACH ROW 
    WHEN (pg_trigger_depth() = 0)
    EXECUTE PROCEDURE re_rank_list();

আমার ব্যবহারের ক্ষেত্রে, পারফরম্যান্স কোনও উদ্বেগের বিষয় নয়, তবে আত্মবিশ্বাস যে এটি কখনই ভাঙ্গবে না বা উদ্ভট আচরণ করবে তা গুরুত্বপূর্ণ is

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