รายการลำดับความสำคัญของงานที่เก็บไว้ในฐานข้อมูล


9

ฉันพยายามคิดถึงวิธีที่ดีที่สุดในการทำสิ่งต่อไปนี้:

ฉันมีรายการงานที่จัดเก็บในฐานข้อมูล งานมีลำดับความสำคัญที่กำหนดไว้ คุณสามารถเปลี่ยนลำดับความสำคัญของงานเพื่อจัดลำดับใหม่ที่ควรดำเนินการ

ฉันกำลังคิดถึงบางสิ่งที่คล้ายกับ Pivotal Tracker

ดังนั้นลองจินตนาการว่าเรามีสิ่งต่อไปนี้:

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

เราตัดสินใจว่า E เป็นภารกิจที่สำคัญที่สุดแล้ว

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

ฉันต้องการอัปเดตงานทั้งหมด 5 รายการเพื่อให้ลำดับความสำคัญใหม่แก่พวกเขา

ถ้า Task B มีความสำคัญมากกว่า AI ก็จะมี

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

ฉันต้องการอัปเดต Task B และ A เท่านั้น

วิธีการเกี่ยวกับการสร้างสิ่งนี้ในฐานข้อมูล? ฉันคิดว่าคุณจะมีโครงการ differnt เก็บไว้ในตารางเดียวกันที่จะมีน้ำหนักของตัวเอง

มันจะดีกว่าที่จะชี้งานที่เกิดขึ้นหลังจากนั้น (เล็กน้อยเช่นรายการลิงก์)

นี่เป็นเพียงสมองที่ทิ้งขยะจริงๆ เพิ่งสงสัยว่าคุณจะใช้สิ่งนี้อย่างไร

คำตอบ:


6
  1. ดูเหมือนว่าคุณกำลังมองหาคิวลำดับความสำคัญ คุณอาจไม่ควรคำนวณลำดับความสำคัญของงานซ้ำคุณควรคำนวณค่าคงที่สำหรับพวกเขา หากคุณต้องการให้ภารกิจ E สำคัญกว่าให้ลดความสำคัญลง
  2. คุณกำลังพูดถึงความสัมพันธ์เป็นหลัก B ควรสำคัญกว่า A. E ควรเป็นภารกิจที่สำคัญที่สุด ฯลฯดูเหมือนว่าโครงสร้างแบบต้นไม้และคุณสามารถเก็บไว้ใน RDBMS ด้วยลิงก์หลัก

5

หากคุณใช้หมายเลขทศนิยมสองครั้งเพื่อระบุลำดับความสำคัญคุณไม่จำเป็นต้องสั่งซื้อใหม่อีกครั้ง:

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

หากคุณต้องการที่จะวางงาน E ระหว่าง A และ B แล้ว: -

  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

หากคุณต้องการแทรก D ระหว่าง E และ B ให้ตั้งค่าความสำคัญเป็น 1.75 ด้วยตัวเลขทศนิยมประมาณ 18 หลักในตัวเลขทศนิยม (1.75 คือ 1.7500000000000000) คุณควรมีกรณีที่แย่ที่สุดที่มี 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) = B.priority
Marcel Panse

ขอบคุณสำหรับการชี้ให้เห็นว่า - ตอบแก้ไขตามนั้น
James Anderson

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ของตาราง temp:

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

ใช้งานได้เหมือนแชมป์ทุกครั้ง


0

ฉันยังไม่ได้คิดเรื่องนี้เลย ..... แต่ทำไมไม่ยอมให้ทศนิยมคุณสามารถทำสิ่งต่าง ๆ ระหว่างคนอื่นโดยไม่ต้องอัพเดททุกอย่าง?

คุณสามารถ squish บางอย่างระหว่าง 1 ถึง 2 ด้วยค่า 1.5

ฉันจะหลีกเลี่ยงค่า min และ max ด้วย อนุญาตให้ตัวเลขหมุนเข้าด้านลบหากลำดับความสำคัญมาก่อนสิ่งที่เป็น 0

คุณอาจพิจารณาว่ามีการจัดลำดับความสำคัญ "แสดงโดยมนุษย์" แยกจากลำดับความสำคัญ "สั่งซื้อ" ภายในเพื่อหลีกเลี่ยงการแสดงทศนิยมและค่าลบที่แปลกประหลาด


อย่าใช้ทศนิยม ใช้สตริงตัวเลขหรือตัวอักษร จากนั้นคุณสามารถแทรกค่าใหม่ระหว่างค่าเก่าสองค่าอย่างน้อยก็จนกว่าจะถึงขีดจำกัดความยาวของสตริง
วินไคลน์

0

มีความสมเหตุสมผลในการใช้รายการที่เชื่อมโยงและการดำเนินการใน RDBMS เพียงแค่แทนที่การจัดการอาร์เรย์และการอ้างอิงด้วยแบบสอบถาม SQL อย่างไรก็ตามฉันไม่แน่ใจว่านี่เป็นวิธีที่มีประสิทธิภาพที่สุดในการดำเนินการอย่างง่าย ๆ หรือไม่ซึ่งจะต้องใช้คำสั่ง SQL จำนวนมาก

สำหรับตารางงานคุณเพิ่มคอลัมน์ "next_task" และ "prev_task" ซึ่งเป็นคีย์ต่างประเทศในคอลัมน์ id ของตารางเดียวกัน (สมมติว่า "-1" เทียบเท่ากับ NULL)

ส่งคืนงานที่มี maximum_priority () : แบบสอบถาม SQL ซึ่งส่งคืนงานด้วย prev_task = -1

E เป็นงานที่สำคัญที่สุด : แบบสอบถาม SQL ซึ่งเปลี่ยน next_task ของ E เป็น ID ของงานที่มีลำดับความสำคัญสูงสุด และเปลี่ยน prev_task ของ E เป็น -1 ...

การดำเนินการนี้และการดำเนินการอื่น ๆ เช่นการวาง E ไว้หน้า A หรือการพิมพ์รายการงานที่สั่งซื้อจะต้องใช้แบบสอบถาม SQL อื่น ๆ อีกมากมายซึ่งควรเป็นแบบอะตอมมิกทั้งหมด (เว้นแต่คุณจะสามารถปรับให้เหมาะสม) มันเป็นการออกกำลังกายที่ดี แต่อาจไม่ใช่วิธีที่มีประสิทธิภาพที่สุดในการทำ


0

อีกวิธีหนึ่งในการแก้ไขปัญหาลำดับความสำคัญก็คือการระบุว่ารายการใดมีความสำคัญมากกว่ารายการนั้น ในแอปพลิเคชั่น HR นี่จะเป็นการบอกว่าผู้จัดการของพนักงานคือใคร

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-introduction-to-hierarchical-query-using-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

จากนั้นหากต้องการย้าย "Task E" ระหว่าง Task A และ Task B คุณต้องตั้งค่า "Task E" เป็นครึ่งทางระหว่าง Task A และ Task B (เช่น "150" ในกรณีนี้)

แน่นอนถ้าคุณจัดลำดับความสำคัญใหม่อยู่ตลอดเวลาในที่สุดคุณจะพบกับปัญหาที่งานที่อยู่ติดกันสองงานไม่มี "ช่องว่าง" เพื่อแทรกรายการใหม่ แต่เมื่อสิ่งนั้นเกิดขึ้นคุณสามารถ "รีเซ็ต" ลำดับความสำคัญทั้งหมดในครั้งเดียวย้อนกลับไปที่ 100, 200, 300 และอื่น ๆ


1
นี่เป็นคำตอบเดียวกับฉันเพิ่งเริ่มต้นด้วยจำนวนเต็มที่มากกว่าแทนที่จะเป็นทศนิยมที่จัดกลุ่มอย่างใกล้ชิด :)
jojo

-1

ฉันไม่มีกูรูฐานข้อมูลดังนั้นฉันจึงแก้ไขปัญหานี้ด้วยวิธีที่สมเหตุสมผลที่สุดที่ฉันสามารถทำได้ใน Access 2010 ฉันมีเขตข้อมูล "ลำดับความสำคัญ" ซึ่งเป็นเขตข้อมูลตัวเลข จากนั้นฉันมีกิจกรรมสำหรับสาขานี้

เหตุการณ์นี้เป็นเหตุการณ์หลังจากอัปเดตสำหรับฟิลด์ "ลำดับความสำคัญ" ที่เรียกใช้คิวรีการอัปเดต "qryPriority" เพื่อเพิ่ม 1 ไปยังหมายเลขลำดับความสำคัญของระเบียนอื่น ๆ ทั้งหมดที่มีลำดับความสำคัญมากกว่าหรือเท่ากับจำนวนลำดับความสำคัญที่เพิ่งป้อน

นี่คือเหตุการณ์รหัส VB ​​และ Update Query SQL:

รหัส VB ​​เหตุการณ์ "ลำดับความสำคัญ":

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

"qryPriority" อัปเดต SQL Query:

UPDATE YOURTABLENAME SET YOURTABLENAME.Priority = [Priority]+1
WHERE (((YOURTABLENAME.Priority)>=[Forms]![YOURFORMNAME]![Priority]));
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.