একটি ডাটাবেসে পুনরায় অলৌকিক তালিকা সংরক্ষণ করা


54

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

আমি প্রথমে একটি positionকলাম চেষ্টা করেছি , তবে মনে হচ্ছে এটি যখন আপনি অন্যদিকে সরানো হয় তখন প্রতিটি আইটেমের অবস্থানের মানটি পরিবর্তন করতে যথেষ্ট অক্ষম হয়ে থাকে।

আমি পূর্বের (বা পরবর্তী) মান উল্লেখ করতে স্ব-রেফারেন্স ব্যবহার করে লোকদের দেখেছি, তবে আবার, মনে হচ্ছে আপনাকে তালিকার সম্পূর্ণ অন্যান্য আইটেমগুলি আপডেট করতে হবে।

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

আমি বলব একটি সাধারণ তালিকায় প্রায় 20 বা ততোধিক আইটেম থাকবে এবং আমি সম্ভবত এটি 50 এর মধ্যে সীমাবদ্ধ করব re পুনঃ-ক্রমটি ড্র্যাগ এবং ড্রপ ব্যবহার করবে এবং সম্ভবত বর্ণের পরিস্থিতি রোধ করার জন্য ব্যাচগুলিতে করা হবে এবং এ জাতীয় থেকে এজ্যাক্স অনুরোধ। আমি যদি পোস্টগ্র্রেস (হিরকুতে) ব্যবহার করি তবে তা গুরুত্বপূর্ণ।

কারো কি কোন ধারনা আছে?

কোন সাহায্যের জন্য চিয়ার্স!


আপনি কি কিছুটা বেঞ্চমার্কিং করতে পারেন এবং আইও বা ডেটাবেস বাধা হয়ে যাবে কিনা তা আমাদের জানান?
রওয়ং

স্ট্যাকওভারফ্লো সম্পর্কিত সম্পর্কিত প্রশ্ন ।
জর্দো

স্ব-রেফারেন্স সহ তালিকার এক স্থান থেকে অন্য আইটেমটি সরানোর সময় আপনাকে কেবলমাত্র 2 টি আইটেম আপডেট করতে হবে। দেখুন en.wikipedia.org/wiki/Linked_list
পিটার বি

হুঁ, কেন লিঙ্কিত তালিকাগুলি উত্তরগুলিতে খুব কমই মনোযোগ পাচ্ছে not
ক্রিশ্চিয়ান ওয়েস্টারবিইক

উত্তর:


32

প্রথমত, দশমিক সংখ্যাসমূহ দিয়ে চালাক কিছু করার চেষ্টা করবেন না, কারণ তারা আপনাকে তীব্র করবে। REALএবং DOUBLE PRECISIONনিখুঁত এবং আপনি তাদের মধ্যে যা রেখেছেন তা সঠিকভাবে উপস্থাপন করতে পারে না। NUMERICসঠিক, তবে চালনার সঠিক ক্রম আপনাকে নির্ভুলতার বাইরে চলে যাবে এবং আপনার প্রয়োগটি খারাপভাবে ভেঙে যাবে।

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

ড্রাগ-এন্ড-ড্রপ মুভগুলি (যেমন, 6আইটেমগুলির মধ্যে বসার জন্য আইটেমটি সরান 9এবং 10) সামান্য কৌশলযুক্ত এবং নতুন অবস্থানটি পুরানোটির উপরে বা নীচে রয়েছে তার উপর নির্ভর করে আলাদাভাবে করতে হবে। উপরের উদাহরণে, আপনাকে সমস্ত অবস্থানের চেয়ে বৃহত্তর বাড়িয়ে একটি গর্ত খুলতে হবে 9, আইটেমের 6অবস্থানটি নতুন হতে হবে 10এবং তারপরে 6শূন্য স্থানটি পূরণের চেয়ে সমস্ত কিছুর অবস্থানকে হ্রাস করতে হবে । আমি আগে বর্ণিত একই সূচক দিয়ে, এটি দ্রুত হবে। লেনদেনের ছোঁয়া সারিগুলির সংখ্যা হ্রাস করে আমি বর্ণিত তুলনায় আপনি আসলে এটি আরও দ্রুত তৈরি করতে পারেন, তবে এটি কোনও মীমাংসা আছে তা প্রমাণ না করা পর্যন্ত আপনার প্রয়োজন নেই এমন একটি মাইক্রোপটিমাইজেশন।

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


আমরা ঠিক গাজিলিয়ন বছর আগে এই প্রকল্প বিড প্রস্তুতির সিস্টেমে ঠিক এটিই পরিচালনা করেছি। এমনকি অ্যাক্সেসেও আপডেটটি ছিল সমান-বিভাজন দ্রুত।
এইচএলজিইএম

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

2
@ টমব্রুনোলি: নিশ্চিত হয়ে বলার আগে আমাকে বাস্তবায়নের বিষয়ে কিছুটা ভাবতে হবে, তবে আপনি সম্ভবত সবচেয়ে বেশি বা সমস্ত রেন্টারিং স্বয়ংক্রিয়ভাবে ট্রিগার দিয়ে সরিয়ে রাখতে সক্ষম হবেন। উদাহরণস্বরূপ, আপনি যদি আইটেম 7 টি মুছুন, ট্রিগার মুছে ফেলার পরে 7 টিরও বেশি সংখ্যক একই তালিকার সমস্ত সারি হ্রাস করে। সন্নিবেশকারীরা একই কাজ করবে (একটি আইটেম serোকানো 7 বা তার বেশি সারিগুলিকে বাড়িয়ে তুলবে)। একটি আপডেটের ট্রিগার (উদাহরণস্বরূপ, 9 এবং 10 এর মধ্যে আইটেম 3 সরান) মাঝারিভাবে আরও জটিল হবে তবে অবশ্যই করণীয়ের মধ্যে রয়েছে is
blrfl

আমি আগে ট্রিগারগুলিতে সন্ধান করি নি তবে এটি করার ভাল উপায় বলে মনে হয়।
টম ব্রুনোলি

1
@ টমব্রুনিলি: আমার কাছে এটি ঘটে যে এটি করতে ট্রিগার ব্যবহার করার ফলে ক্যাসকেড হতে পারে। কোনও লেনদেনের সমস্ত পরিবর্তন সহ সঞ্চিত পদ্ধতিগুলি এর জন্য আরও ভাল রুট হতে পারে।
blrfl

15

এখান থেকে একই উত্তর https://stackoverflow.com/a/49956113/10608


সমাধান: indexএকটি স্ট্রিং তৈরি করুন (কারণ স্ট্রিংগুলিতে মূলত অসীম "স্বেচ্ছাসেবীর নির্ভুলতা থাকে")। অথবা আপনি যদি কোন int ব্যবহার করেন তবে index1 এর পরিবর্তে 100 দ্বারা বৃদ্ধি করুন ।

পারফরম্যান্স সমস্যাটি হ'ল দুটি বাছাই করা আইটেমের মধ্যে "মধ্যে" কোনও মান নেই।

item      index
-----------------
gizmo     1
              <<------ Oh no! no room between 1 and 2.
                       This requires incrementing _every_ item after it
gadget    2
gear      3
toolkit   4
box       5

পরিবর্তে, এটির মতো করুন (নীচে আরও ভাল সমাধান):

item      index
-----------------
gizmo     100
              <<------ Sweet :). I can re-order 99 (!) items here
                       without having to change anything else
gadget    200
gear      300
toolkit   400
box       500

আরও ভাল: এখানে জিরা কীভাবে এই সমস্যাটি সমাধান করে। তাদের "র‌্যাঙ্ক" (যাকে আপনি সূচক বলছেন) একটি স্ট্রিং মান যা র‌্যাঙ্কড আইটেমগুলির মধ্যে এক টন শ্বাস প্রশ্বাসের রুম দেয়।

আমি যে জিরা ডাটাবেসের সাথে কাজ করি তার প্রকৃত উদাহরণ এখানে

   id    | jira_rank
---------+------------
 AP-2405 | 0|hzztxk:
 ES-213  | 0|hzztxs:
 AP-2660 | 0|hzztzc:
 AP-2688 | 0|hzztzk:
 AP-2643 | 0|hzztzs:
 AP-2208 | 0|hzztzw:
 AP-2700 | 0|hzztzy:
 AP-2702 | 0|hzztzz:
 AP-2411 | 0|hzztzz:i
 AP-2440 | 0|hzztzz:r

এই উদাহরণ লক্ষ্য করুন hzztzz:i। একটি স্ট্রিং র‌্যাঙ্কের সুবিধা হ'ল আপনি দুটি আইটেমের মধ্যে ঘর ছুঁড়েছেন, আপনাকে এখনও আর কিছু র‌্যাঙ্ক করতে হবে না। ফোকাস সঙ্কুচিত করার জন্য আপনি কেবল স্ট্রিংয়ে আরও অক্ষর যুক্ত করতে শুরু করেছেন।


1
আমি কেবল একটি একক রেকর্ড আপডেট করে এটি করার কিছু উপায় নিয়ে আসার চেষ্টা করছিলাম এবং এই উত্তরটি আমার মাথার মধ্যে যে সমাধানটি আমি খুব ভালভাবে ভাবছিলাম তা ব্যাখ্যা করে।
এনএসজোনাস

13

আমি পূর্বের (বা পরবর্তী) মান উল্লেখ করতে স্ব-রেফারেন্স ব্যবহার করে লোকদের দেখেছি, তবে আবার, মনে হচ্ছে আপনাকে তালিকার সম্পূর্ণ অন্যান্য আইটেমগুলি আপডেট করতে হবে।

কেন? বলুন আপনি কলামগুলির সাথে লিঙ্কযুক্ত-তালিকা সারণী পদ্ধতির গ্রহণ করেছেন (listID, আইটেমআইডি, নেক্সটআইটিআইডিআইডি)।

তালিকায় একটি নতুন আইটেম সন্নিবেশ করানোর জন্য একটি সন্নিবেশ করা এবং একটি পরিবর্তিত সারি লাগবে।

কোনও আইটেম প্রতিস্থাপনের জন্য তিনটি সারি পরিবর্তন প্রয়োজন (আইটেমটি সরানো হচ্ছে, তার আগে আইটেমটি এবং আইটেমটি তার নতুন অবস্থানের আগে)।

কোনও আইটেম সরানোর জন্য একটি মুছা এবং একটি পরিবর্তিত সারির দাম।

তালিকায় 10 টি আইটেম বা 10,000 আইটেম রয়েছে তা নির্বিশেষে এই ব্যয়গুলি একই থাকে। তিনটি ক্ষেত্রেই লক্ষ্য সারিটি প্রথম তালিকার আইটেম হলে একটি কম পরিবর্তন রয়েছে। আপনি যদি প্রায়শই শেষ তালিকার আইটেমটিতে প্রায়শই অপারেটিং করে থাকেন তবে আগামীর পরিবর্তে প্রিজটেমিড সংরক্ষণ করা উপকারী।


10

"তবে মনে হচ্ছে এটি বেশ দক্ষ হবে"

আপনি কি এটি পরিমাপ করেছেন? নাকি এটাই কি এক অনুমান? কোনও প্রমাণ ছাড়াই এ জাতীয় অনুমান করবেন না।

"প্রতি তালিকায় 20 থেকে 50 আইটেম"

সত্যি বলতে, এটি "সম্পূর্ণ প্রচুর আইটেম" নয়, যা আমার কাছে খুব কম শোনাচ্ছে।

আমি আপনাকে "অবস্থান কলাম" পদ্ধতির সাথে লেগে থাকার পরামর্শ দিই (যদি এটি আপনার পক্ষে সর্বাধিক সাধারণ বাস্তবায়ন হয়)। এই জাতীয় ছোট আকারের আকারের জন্য, আপনি প্রকৃত পারফরম্যান্স সমস্যার অভিজ্ঞতা পাওয়ার আগে অপ্রয়োজনীয় অনুকূলকরণ শুরু করবেন না


6

এটি সত্যিই স্কেল এবং ব্যবহারের ক্ষেত্রে একটি প্রশ্ন ..

আপনি একটি তালিকায় কয়টি আইটেম আশা করেন? যদি লক্ষ লক্ষ হয় তবে আমি মনে করি গঙ্গটি দশমিক রুটটি সুস্পষ্ট।

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

এছাড়াও আপনি কতবার প্রতিশ্রুতিবদ্ধ হন, যদি ব্যবহারকারী 250 টি পরিবর্তন করতে পারে তবে একবারে প্রতিশ্রুতিবদ্ধ করুন, আমি বলি এরপরে পুনর্নবীকরণের সাথে পূর্ণসংখ্যার ...

tl; dr: আরও তথ্যের প্রয়োজন।


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


আমি আরও কিছু প্রসঙ্গে প্রশ্নটি আপডেট করব
টম ব্রুনোলি

দশমিকগুলি কাজ করে না, যথার্থতা সীমিত হওয়ায় এবং প্রতিটি
inোকানো

3

পুনর্নির্মাণ অপারেশন অনুযায়ী ডাটাবেস ক্রিয়াকলাপের সংখ্যা হ্রাস করা যদি উদ্দেশ্য হয়:

ধরে নিচ্ছি যে

  • সমস্ত শপিং আইটেম 32-বিট পূর্ণসংখ্যার সাথে গণনা করা যেতে পারে।
  • ব্যবহারকারীর ইচ্ছার তালিকার জন্য সর্বাধিক আকারের সীমা রয়েছে। (আমি কিছু জনপ্রিয় ওয়েবসাইট সীমা হিসাবে 20 - 40 আইটেম ব্যবহার করতে দেখেছি)

ব্যবহারকারীর সাজানো ইচ্ছার তালিকাটি একটি কলামে পূর্ণসংখ্যার পূর্ণ সংখ্যার (পূর্ণসংখ্যার অ্যারে) হিসাবে সংরক্ষণ করুন। যতবার ইচ্ছা তালিকাটি পুনরায় অর্ডার করা হয় তখন পুরো অ্যারে (একক সারি; একক কলাম) আপডেট হয় - যা একটি একক এসকিউএল আপডেটের সাথে সঞ্চালিত হয়।

https://www.postgresql.org/docs/current/static/arrays.html


উদ্দেশ্যটি পৃথক হলে, "অবস্থান কলাম" পদ্ধতির সাথে লেগে থাকুন।


"গতি" সম্পর্কিত, সঞ্চিত প্রক্রিয়া পদ্ধতির মানটিকে নিশ্চিত করে নিন। এক ইচ্ছার তালিকাগুলির জন্য 20+ পৃথক আপডেট দেওয়ার সময় ধীর হতে পারে, তবে সঞ্চিত পদ্ধতি ব্যবহারের দ্রুত উপায় থাকতে পারে।


3

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

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

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

  • কিছু ভিন্নতা রেফারেন্স অর্থাৎ লিঙ্কযুক্ত তালিকা ব্যবহার করে না। তারা পুরো অর্ডারকে একটি স্ব-অন্তর্ভুক্ত ব্লব হিসাবে উপস্থাপন করতে পছন্দ করে, যেমন একটি JSON- অ্যারে-ইন-এ-স্ট্রিং [5,2,1,3,...]; এই জাতীয় ক্রমটি তখন আলাদা জায়গায় সংরক্ষণ করা হবে। এই পৃথক অর্ডার ব্লবটি বজায় রাখতে ক্লায়েন্টের সাইড কোডের প্রয়োজনীয়তারও এই পদ্ধতির একটি পার্শ্ব প্রতিক্রিয়া রয়েছে।

  • অনেক ক্ষেত্রে, আমাদের সত্যিকার অর্থে সঠিক অর্ডার সঞ্চয় করার দরকার নেই, আমাদের কেবল প্রতিটি রেকর্ডের মধ্যে একটি আপেক্ষিক র‌্যাঙ্ক বজায় রাখা দরকার। সুতরাং আমরা ক্রমিক রেকর্ড মধ্যে ফাঁক অনুমতি দিতে পারি। পরিবর্তনের মধ্যে রয়েছে: (১) 100, 200, 300 এর মতো ফাঁক দিয়ে পূর্ণসংখ্যার ব্যবহার করা ... তবে আপনি দ্রুত ফাঁক দিয়ে চলে যাবেন এবং তারপরে পুনরুদ্ধার প্রক্রিয়াটি প্রয়োজন; (২) দশমিক ব্যবহার করে যা প্রাকৃতিক ফাঁকফোকরের সাথে আসে, তবে আপনাকে সিদ্ধান্ত নিতে হবে যে আপনি চূড়ান্ত নির্ভুলতার সীমাবদ্ধতার সাথে বাঁচতে পারবেন কিনা; (3) বর্ণনা অনুযায়ী স্ট্রিং ভিত্তিক র্যাঙ্ক ব্যবহার এই উত্তরটি কিন্তু সতর্কতা অবলম্বন করা আবশ্যক চতুর বাস্তবায়ন যাত্রীর সঙ্গের নিজলটবহর

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


2

অবস্থান কলামের জন্য একটি ভাসমান পয়েন্ট নম্বর ব্যবহার করুন।

তারপরে আপনি কেবল "সরানো" সারিটিতে অবস্থানের কলামটি পরিবর্তন করে তালিকার পুনঃক্রম করতে পারেন।

মূলত যদি আপনার ব্যবহারকারী "নীল" এর পরে "লাল" তবে "হলুদ" এর আগে অবস্থান করতে চান

তারপরে আপনার কেবল গণনা করা দরকার

red.position = ((yellow.position - blue.position) / 2) + blue.position

কয়েক মিলিয়ন পুনরায় অবস্থানের পরে আপনি ভাসমান পয়েন্ট সংখ্যাগুলি এত কম পেতে পারেন যে "এর মধ্যে" নেই - তবে এটি প্রায় কোনও ইউনিকর্ন দেখার মতোই।

আপনি এটি 1000 এর প্রাথমিক ফাঁক দিয়ে পূর্ণসংখ্যার ক্ষেত্র ব্যবহার করে এটি প্রয়োগ করতে পারেন। সুতরাং আপনার অন্তর্নিহিত অংশটি 1000-> নীল, 2000-> হলুদ, 3000-> লাল হবে। নীল পরে লাল "চলমান" পরে আপনার 1000-> নীল, 1500-> লাল, 2000-> হলুদ হবে।

সমস্যাটি হ'ল 1000 এর আপাতদৃষ্টিতে বড় প্রাথমিক ফাঁক দিয়ে 10 টি মুভ আপনাকে 1000-> নীল, 1001-পুস, 1004-> বিজ এর মতো পরিস্থিতিতে ফেলবে ...... যেখানে আপনি আর সক্ষম হবেন না পুরো তালিকাটিকে পুনরায় নম্বর না দিয়ে "নীল" এর পরে কিছু সন্নিবেশ করতে। ভাসমান পয়েন্ট সংখ্যা ব্যবহার করে সর্বদা দুটি পজিশনের মধ্যে একটি "হাফওয়ে" পয়েন্ট থাকবে।


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

ইনট ব্যবহার করে যে কোনও প্রকল্পের অর্থ হ'ল প্রতি বারের ক্রম পরিবর্তন হওয়ার সাথে তালিকার সমস্ত / বেশিরভাগ সারি আপডেট করতে হবে। ফ্লোট ব্যবহার করে আপনি কেবল সারিটি সরিয়ে নিয়েছেন যা সরানো হয়েছে। এছাড়াও "ints এর চেয়ে বেশি ব্যয়বহুল ভাসমান" প্রয়োগ এবং প্রয়োগ করা হার্ডওয়ারের উপর নির্ভর করে। অবশ্যই জড়িত অতিরিক্ত সিপিইউ একটি সারি এবং এর সাথে সম্পর্কিত সূচকগুলি আপডেট করার জন্য প্রয়োজনীয় সিপিইউর তুলনায় তুচ্ছ।
জেমস অ্যান্ডারসন

5
নায়েসারদের জন্য, এই সমাধানটি হ'ল ট্রেলো (ট্রেলো ডটকম ) যা করে। আপনার ক্রোম ডিবাগারটি খুলুন এবং পুনঃক্রমের আগে / পরে জেএসন আউটপুটকে আলাদা করুন (একটি কার্ড টেনে আনুন / ছাড়ুন) এবং আপনি পান - "pos": 1310719, + "pos": 638975.5। সত্যি কথা বলতে, বেশিরভাগ লোকেরা তাদের মধ্যে 4 মিলিয়ন এন্ট্রি সহ ট্রেলো তালিকাগুলি করেন না, তবে ট্রেলোর তালিকার আকার এবং ব্যবহারের ক্ষেত্রে ব্যবহারকারীর অনুসারে বাছাইযোগ্য সামগ্রীর পক্ষে খুব সাধারণ। এবং ব্যবহারকারী অনুসারে বাছাইযোগ্য কিছুতে উচ্চ কার্যকারিতার সাথে আনুমানিক কিছু করার নেই, ইন্ট বনাম ফ্লোট বাছাইয়ের গতি এটির জন্য গতিযুক্ত, বিশেষত ডাটাবেসগুলি বিবেচনা করে বেশিরভাগ আইও পারফরম্যান্স দ্বারা সীমাবদ্ধ।
zelk

1
@ পিটারবি '64 বিট পূর্ণসংখ্যা কেন ব্যবহার করবেন না', এটি বেশিরভাগ ক্ষেত্রে বিকাশকারীর জন্য অর্গনমিক্স I আপনার গড় ফ্লোটের জন্য প্রায় বিট গভীরতা <1.0 রয়েছে> সুতরাং আপনি 'পজিশন' কলামটি 1.0 এ ডিফল্ট করতে পারেন এবং ডাবলিংয়ের মতো সহজেই 0.5, 0.25, 0.75 সন্নিবেশ করতে পারেন। পূর্ণসংখ্যার সাহায্যে আপনার ডিফল্টটি 2 ^ 30 বা ততোধিক হতে হবে, আপনি কখন ডিবাগ করছেন তা ভাবতে কিছুটা জটিল করে তোলে। 4073741824 496359787 এর চেয়ে বড়? অঙ্কগুলি গণনা শুরু করুন।
zelk

1
তদ্ব্যতীত, আপনি যদি কখনও এমন কোনও ক্ষেত্রে আঘাত করেন যেখানে আপনি সংখ্যার মধ্যে স্থান ছাড়িয়ে যান ... তবে ঠিক করা এত কঠিন নয়। তাদের মধ্যে একটি সরান। তবে গুরুত্বপূর্ণ বিষয়টি হ'ল এটি সর্বোত্তম প্রয়াসের এক ধরণের পদ্ধতিতে কাজ করে, যা বিভিন্ন পক্ষের (যেমন ট্রেলো) অনেকগুলি একই সাথে সম্পাদনা পরিচালনা করে। আপনি দুটি সংখ্যা বিভক্ত করতে পারেন, এমনকি কিছুটা এলোমেলো গোলমাল এবং ভয়েলা ছিটিয়ে দিতে পারেন, এমনকি যদি অন্য কেউ একই সময়ে একই কাজ করে থাকে তবে এখনও একটি গ্লোবাল অর্ডার রয়েছে, এবং আপনাকে কোনও লেনদেনের ভিতরে প্রবেশের দরকার নেই আছে।
zelk
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.