একটি ডাটাবেসে সঞ্চিত কাজের অগ্রাধিকারের তালিকা


9

আমি নিম্নলিখিতটি করার সর্বোত্তম উপায় সম্পর্কে চিন্তা করার চেষ্টা করছি:

আমার কাছে ডাটাবেসে সঞ্চিত কাজগুলির একটি তালিকা রয়েছে। একটি কার্যকে এটিতে অগ্রাধিকার দেওয়া হয়েছে। আপনি যে কাজের ক্রিয়াকলাপটি চালিত হওয়া উচিত তা পুনরায় সাজানোর জন্য আপনি কোনও কাজের অগ্রাধিকার পরিবর্তন করতে পারেন।

আমি পাইভোটাল ট্র্যাকারের সাথে খুব অনুরূপ কিছু সম্পর্কে ভাবছি।

সুতরাং কল্পনা করুন যে আমাদের নিম্নলিখিত ছিল:

1 Task A
2 Task B
3 Task C
4 Task D
5 Task E

আমরা সিদ্ধান্ত নিই যে ই এখন সবচেয়ে গুরুত্বপূর্ণ কাজ

1 Task E
2 Task A
3 Task B
4 Task C
5 Task D

তাদের একটি নতুন অগ্রাধিকার দেওয়ার জন্য আমার 5 টি কার্য আপডেট করতে হবে।

যদি টাস্ক বি আরও গুরুত্বপূর্ণ হয়ে ওঠে তবে আমার কাছে এআই হবে

1 Task E
2 Task B
3 Task A
4 Task C
5 Task D

আমার কেবলমাত্র টাস্ক বি এবং এ আপডেট করতে হবে।

কোন ডিবিতে এটির কাঠামোগত সম্পর্কে কোন উপায়গুলি যেতে পারে? আমি ধারণা করি যে একই টেবিলে আপনার নিজস্ব ওজন থাকবে এমন একটি পৃথক প্রকল্প রয়েছে।

এর পরে যে কোনও টাস্ক সংঘটিত হয়েছে তা নির্দেশ করা ভাল (কিছুটা লিঙ্ক তালিকার মতো)।

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

উত্তর:


6
  1. দেখে মনে হচ্ছে আপনি অগ্রাধিকারের সারি খুঁজছেন। আপনার কার্যগুলির জন্য সম্ভবত অগ্রাধিকার সংখ্যাগুলি পুনরায় ক্যালকুলেট করা উচিত নয়, আপনার কেবল তাদের জন্য একটি নির্দিষ্ট মান গণনা করা উচিত। আপনি যদি টাস্ক E আরও গুরুত্বপূর্ণ হতে চান তবে এর মান হ্রাস করুন।
  2. আপনি মূলত সম্পর্কের কথা বলছেন। বি .. চেয়ে উ ই সবচেয়ে গুরুত্বপূর্ণ কাজ হওয়া উচিত, ইত্যাদি আরো গুরুত্বপূর্ণ হওয়া উচিত এটি একটি বৃক্ষ, গঠন মত শোনাচ্ছে, এবং আপনি সংরক্ষণ করতে পারেন যে পিতা বা মাতা লিঙ্কগুলি সহ একটি RDBMS হবে।

5

আপনি যদি অগ্রাধিকার নির্দেশ করতে ডাবল ভাসমান পয়েন্ট নম্বর ব্যবহার করেন তবে আপনাকে পুনরায় অর্ডার দেওয়ার দরকার নেই:

1.00 Task A
2.00 Task B
3.00 Task C
4.00 Task D
5.00 Task E

আপনি যদি E এবং B এর মধ্যে E টাস্ক স্থাপন করতে চান তবে: -

  E.priority = A.priority + ((B.priority - A.priority) / 2)

সুতরাং এখন আপনার আছে:

1.00 Task A
1.50 Task E
2.00 Task B
3.00 Task C
4.00 Task D

আপনি যদি E এবং B এর মধ্যে ডি প্রবেশ করাতে চান তবে কেবল তার অগ্রাধিকারটি 1.75 এ সেট করুন। ভাসমান পয়েন্ট সংখ্যাতে প্রায় 18 দশমিক অঙ্কের (প্রদত্ত 1.75 আসলেই 1.750000000000000000) দেওয়া আপনার আগে টানা 53 টি সন্নিবেশের সবচেয়ে খারাপ পরিস্থিতি হওয়া উচিত:

 A.priority + ((B.priority - A.priority) / 2) = B.priority

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


1
আমি এই পদ্ধতির পছন্দ করি তবে এটি হওয়া উচিত: E.priority = A.Priority + ((B.Priority - A.Priority / / 2)) এবং A.Priority + ((B.Priority - A.priority) / 2) = বি.প্রিয়রিটি
মার্সেল

এটি উল্লেখ করার জন্য ধন্যবাদ - সেই অনুসারে উত্তর সংশোধন করা হয়েছে
জেমস অ্যান্ডারসন

1

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

উদাহরণ স্বরূপ:

TaskId int identity(1,1),
Task varchar(50),
SortOrder int

আইটেমগুলিকে পুনঃক্রম করা সঞ্চিত পদ্ধতিতে দুটি ইনপুট প্যারামিটার লাগে:

@TaskId int,
@NewSortOrder int

আমরা নতুন ক্রমে আইটেমগুলি সঞ্চয় করতে একটি টেম্প টেবিল ব্যবহার করেছি:

CREATE TABLE #Tasks
(
RowId int identity(1,1),
TaskId int
)

সেগুলিকে নতুন ক্রমে নামানোর জন্য আমরা তিনটি নির্বাচিত বিবৃতি ব্যবহার করেছি:

-- Step 1
INSERT INTO #Tasks
SELECT TaskId FROM tblTasks
WHERE SortOrder < @NewSortOrder
ORDER BY SortOrder

--Step 2
INSERT INTO #Tasks
VALUES(@TaskId)

--Step 3
INSERT INTO #Tasks
SELECT TaskId FROM tblTasks
WHERE SortOrder >= @NewSortOrder
ORDER BY SortOrder

তারপরে আমরা নতুন সাজানোর ক্রম দিয়ে বেস টেবিল (tblTasks) আপডেট করেছি যা আসলে টেম্প টেবিলের RowId পরিচয় কলাম:

-- Update Base Table
UPDATE tblTasks
SET SortOrder = t2.RowId
FROM tblTasks t1
INNER JOIN #Tasks t2
ON t1.TaskId = t2.TaskId

এটি প্রতিবার চ্যাম্পের মতো কাজ করে।


0

আমি এখনও এটির মধ্য দিয়ে ভাবিনি ..... তবে কেন দশমিকের অনুমতি দিচ্ছেন না কেন আপনি সমস্ত কিছু আপডেট না করেই অন্যের মধ্যে জিনিসগুলি স্টাফ করতে পারেন?

আপনি 1.5 এর মান দিয়ে 1 এবং 2 এর মধ্যে কিছু স্কোয়াশ করতে পারেন।

আমি ন্যূনতম এবং সর্বাধিক মানগুলি এড়াতে চাই। সংখ্যাকে priorityণাত্মক হিসাবে রোল করতে দিন যদি তারা বর্তমানে 0 এর আগে অগ্রাধিকার আসে।

বিক্ষিপ্ত দশমিক এবং নেতিবাচক মানগুলি এড়ানোর জন্য আপনি অভ্যন্তরীণ "অর্ডারিং" অগ্রাধিকারগুলি থেকে আলাদা "মানব প্রদর্শন" অগ্রাধিকারের কথা বিবেচনা করতে পারেন।


দশমিক ব্যবহার করবেন না। স্ট্রিং, সংখ্যা বা বর্ণমালা ব্যবহার করুন। তারপরে আপনি কমপক্ষে স্ট্রিংয়ের দৈর্ঘ্যের সীমা অতিক্রম না করা পর্যন্ত আপনি দুটি পুরানোগুলির মধ্যে একটি নতুন মান alwaysোকাতে পারেন।
কেভিন cline

0

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

টাস্ক টেবিলের জন্য, আপনি একটি কলাম "Next_task" এবং "prev_task" যুক্ত করুন যা একই টেবিলের আইডি কলামের বিদেশী কী (ধরে নিবে একটি "-1" NULL এর সমতুল্য)

সর্বোচ্চ_প্রিয়তার সাথে টাস্কটি ফিরিয়ে দিন () : এসকিউএল কোয়েরি যা prev_task = -1 দিয়ে টাস্কটি ফেরত দেয়

E সর্বাধিক গুরুত্বপূর্ণ কাজ : এসকিউএল কোয়েরি যা ই এর পরের_টাস্কটিকে সর্বাধিক অগ্রাধিকার দিয়ে টাস্কের আইডিতে পরিবর্তন করে। এবং ই-এর পূর্ব-টাস্ক -1-এ পরিবর্তন হয় ...

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


0

অগ্রাধিকার সমস্যাটির আরেকটি পদ্ধতির উল্লেখ হ'ল আইটেমটির চেয়ে কোন আইটেমটি বেশি গুরুত্বপূর্ণ specify এইচআর অ্যাপ্লিকেশনটিতে এটি কোনও কর্মচারীর পরিচালক কে তা বলার মতো হবে।

ID  Name           ParentPriority
1   TopPriority    NULL
2   Medium         1
3   Low            2
4   AnotherMedium  1
5   Less than 2    2

তারপরে অগ্রাধিকার দেয় এমন একটি ক্যোয়ারী তৈরি করতে এই http://blog.sqlauthority.com/2012/04/24/sql-server-intr پيداوار- to- hierarchical-query- using- a- recursive-cte- a- primer/ পড়ুন মাত্রা।

ID  Name           ParentPriority  PriorityLevel
1   TopPriority    NULL            1
2   Medium         1               2
3   Low            2               3
4   AnotherMedium  1               2
5   Less than 2    2               3

আমি মনে করি এটি অগ্রাধিকার নির্ধারণের ক্ষেত্রে একটি সহজ ব্যবহারকারীর অভিজ্ঞতা, তবে এটি একই স্তরের একাধিক অগ্রাধিকারের অনুমতি দেয়।


-1

একটি সহজ উপায় হ'ল এই জাতীয় কিছু দিয়ে শুরু করা:

100 Task A
200 Task B
300 Task C
400 Task D
500 Task E

তারপরে, টাস্ক এ এবং টাস্ক বিয়ের মধ্যে "টাস্ক ই" স্থানান্তরিত করতে, বলুন, আপনি কেবল "টাস্ক ই" এর অগ্রাধিকারটি টাস্ক এ এবং টাস্ক বি (অর্থাৎ এই ক্ষেত্রে "150") এর অর্ধ-পথের কিছুতে সেট করেছেন।

অবশ্যই, আপনি যদি ক্রমাগত অগ্রাধিকারগুলি পুনরায় সাজান, আপনি শেষ পর্যন্ত এমন একটি সমস্যায় চলে যাবেন যার মাধ্যমে দুটি সংলগ্ন কর্মের নতুন এন্ট্রি প্রবেশের "ফাঁক" থাকবে না। কিন্তু যখন এটি হয়, আপনি কেবলমাত্র 100, 200, 300, ইত্যাদিতে সমস্ত অগ্রাধিকারগুলিকে "রিসেট" করতে পারেন etc.


1
এটি আসলে আমার উত্তর হিসাবে একই, কেবলমাত্র ঘনিষ্ঠভাবে দশমিকের পরিবর্তে বৃহত্তর পূর্ণসংখ্যার সাথে শুরু। :)
jojo

-1

আমি কোনও ডাটাবেস গুরু নই, তাই আমি অ্যাক্সেস ২০১০-তে এটি সবচেয়ে যুক্তিসঙ্গত উপায়ে সমাধান করেছি I তারপরে এই ক্ষেত্রটির জন্য আমার একটি ইভেন্ট আছে।

ইভেন্টটি "অগ্রাধিকার" ক্ষেত্রের আপডেটের পরে একটি ইভেন্ট যা একটি সন্ধান করা "অগ্রাধিকার" এর চেয়ে আরও বেশি বা সমান অগ্রাধিকার প্রাপ্ত অন্যান্য সমস্ত রেকর্ডের অগ্রাধিকার সংখ্যায় 1 যুক্ত করতে একটি আপডেট ক্যোয়ারী "qryPriority" ট্রিগার করে।

এখানে ইভেন্ট ভিবি কোড এবং আপডেট ক্যোয়ারী এসকিউএল রয়েছে:

"অগ্রাধিকার" ইভেন্ট ভিবি কোড:

Private Sub Priority_AfterUpdate()
Me.Refresh
If Priority > 0 Then
DoCmd.OpenQuery ("qryPriority")
End If
Me.Refresh
Priority = Priority - 1
End Sub

"qryPriority" আপডেট ক্যোয়ারী এসকিউএল:

UPDATE YOURTABLENAME SET YOURTABLENAME.Priority = [Priority]+1
WHERE (((YOURTABLENAME.Priority)>=[Forms]![YOURFORMNAME]![Priority]));
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.