আমি কীভাবে একটি বিশ্রাম পরিষেবাতে অর্ডার করা তালিকার সংস্থানটি ডিজাইন করব?


11

আমি বারবার একই সমস্যাটি চালিয়েছি এবং আমি এমন কোনও সমাধান খুঁজে পাই নি যা আমি সত্যই অনুকূল অনুভব করেছি।

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

অর্ডার করা তালিকার সংস্থানটির একটি বিশ্রাম পরিষেবা কীভাবে ডিজাইন করব?

বিশেষত, আমি কীভাবে একটি বিশ্রামের সংস্থানটির নকশা listএবং itemমডেলটি ডিজাইন করব ? সর্বাধিক সাধারণ নকশা আমি দেখেছি হ'ল itemসত্তাটি কোনও সম্পত্তি orderবা positionসম্পত্তি। আমি শুনেছি এমন অন্য পদ্ধতির আইটেমগুলির মধ্যে দ্বিগুণ-লিঙ্কযুক্ত তালিকা।

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


কৌতূহলের বাইরে, কেন বিশেষভাবে অর্ডার করা তালিকাটি ফিরিয়ে দেওয়া গুরুত্বপূর্ণ?
অ্যাডাম ওয়েলস

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

উত্তর:


14

আদেশযুক্ত তালিকার প্রতিনিধিত্ব করা রিলেশনাল ডাটাবেসগুলির মধ্যে অন্যতম সমস্যা problems তালিকার সদস্যতার সম্পর্কের ক্ষেত্রে পজিশনের সম্পত্তি যুক্ত করা এটি করার সর্বাধিক সাধারণ উপায়, যেহেতু আপনি সহজেই ORDER BY positionআপনার এসকিউএল কোয়েরিতে যুক্ত করে আদেশ তালিকাটি পুনরুদ্ধার করতে পারেন এবং যেহেতু আপনি সহজেই গড়ের মাধ্যমে তালিকার মাঝখানে আইটেমগুলি সন্নিবেশ করতে পারেন পূর্ববর্তী এবং পরবর্তী তালিকার সদস্যের মানগুলি, অবস্থানটি অনুমান করে পূর্ণসংখ্যার পরিবর্তে ভাসমান।

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

তবে, RESTful API গুলি সম্পর্কিত ডেটাবেসগুলির সীমাবদ্ধতায় ভোগে না। আপনি কোনও পজিশনের মতো হ্যাক ব্যবহার না করে প্রাকৃতিক বোধ করার মতো কিছু করতে পারেন।

তালিকায় যদি আপনার কাছে কয়েক শতাধিক উপাদান থাকে তবে কেবল একটি অনুরোধে পুরো তালিকাটি স্থানান্তর করুন। ধরে নিই আমরা [1, 2, 3, 4]তালিকার সদস্যরা যেখানে আইডি রয়েছে সেখানে পুনঃক্রম করতে চাই

POST /url/of/the/list
Content-type: application/json
...

[1, 2, 4, 3]

ব্যাকএন্ড এটির পরে আপনি যে কোনও ডাটাবেজ প্রযুক্তি ব্যবহার করছেন তা এটি অনুবাদ করতে পারে তবে এপিআই ব্যবহারকারীদের এই বিবরণগুলি বিবেচনা করতে হবে না।

যদি তালিকাটি বড় হয় এবং আইটেমগুলিতে সাধারণত স্বতন্ত্রভাবে অনুরোধ করা হয় তবে আপনি url এ একটি সূচকের অনুমতি দিতে পারেন:

GET /page/7

আপনি যদি হেটোয়াস এ থাকেন তবে প্রতিক্রিয়াটিতে নেভিগেশনকে সহজ করার জন্য পূর্ব / পরবর্তী লিঙ্কগুলি অন্তর্ভুক্ত থাকতে পারে, যদি উত্সটি সাধারণত সেভাবেই গ্রাস করা হয়। তবে, এটি বোঝানোর দরকার নেই যে আপনার ডাটাবেসেও এই দ্বিগুণ-লিঙ্কযুক্ত তালিকা রয়েছে।

যদি তালিকাটি খুব বড় হয় তবে আপনি পছন্দ ArrayListমত অপারেশন যেমন insertবা push/ প্রকাশ করতে চাইতে পারেন append। আমি যেমন কল কল্পনা করতে পারে

POST /url/of/the/list?at=1357;mode=insert
...

description of the item to insert

যদি পুনঃনির্মাণ একটি সাধারণ ব্যবহারের ক্ষেত্রে হয় এবং তত্ক্ষণাত পুনরায় অর্ডারিং প্রতিশ্রুতিবদ্ধ করা উচিত, তবে আপনি আপনার এপিআইতে একটি উপযুক্ত এন্ডপয়েন্ট দিতে পারেন:

POST /url/of/the/list/reorder-item?from=783;to=1357

যদি পুনঃনির্দেশিত তালিকাটি স্পষ্টভাবে প্রতিশ্রুতিবদ্ধ করা উচিত, তবে নতুন অর্ডারটিকে JSON নথি হিসাবে স্থানান্তর করা সহজ হবে, উপরে দেখুন।

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


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

তালিকার মতো অপারেশনগুলিতে এই সমস্যাটি থাকা উচিত নয়, তবে প্রদত্ত যে প্যারামিটারগুলি (এ থেকে, থেকে)
আইডিতে থাকে

2

আমি মনে করি যে বিভিন্ন পদ্ধতির ব্যবহারযোগ্যতা অন্তর্নিহিত ডাটাবেস ব্যবহৃত হচ্ছে এর উপর নির্ভর করে।

এই পদ্ধতির আদেশ অনুযায়ী কোনও আইটেম স্থানান্তরিত করার পরামর্শ দেওয়া হয়েছে:

= 783; থেকে = 1357 থেকে পোস্ট / ইউআরএল / এর / তালিকা / পুনঃক্রম-আইটেমটি?

যদি আপনার সিরিয়ালিজেবল লেনদেন না হয় তবে এটি জাতির শর্ত সাপেক্ষে হতে পারে। বেশিরভাগ ডিবিতে READ_COMMITTED এর ডিফল্ট স্তরটি কোনও রেসের শর্তকে দূর করবে না!

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

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

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