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


54

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

ตอนแรกฉันลองpositionคอลัมน์ แต่ดูเหมือนว่ามันจะไม่มีประสิทธิภาพเลยที่จะต้องเปลี่ยนค่าตำแหน่งของไอเท็มอื่นทุกรายการเมื่อคุณเลื่อนมันไปมา

ฉันเคยเห็นคนที่ใช้การอ้างอิงตนเองเพื่ออ้างอิงถึงค่าก่อนหน้า (หรือถัดไป) แต่อีกครั้งดูเหมือนว่าคุณจะต้องอัปเดตรายการอื่น ๆ อีกมากในรายการ

วิธีแก้ปัญหาอื่นที่ฉันเห็นคือใช้เลขทศนิยมและติดสิ่งของในช่องว่างระหว่างพวกเขาซึ่งดูเหมือนจะเป็นทางออกที่ดีที่สุด แต่ฉันแน่ใจว่าต้องมีวิธีที่ดีกว่า

ฉันจะบอกว่ารายการทั่วไปจะมีมากถึง 20 รายการหรือมากกว่านั้นและฉันอาจจะ จำกัด ไว้ที่ 50 การสั่งซื้อซ้ำจะใช้การลากและวางและอาจทำได้ในแบตช์เพื่อป้องกันสภาพการแข่งขันและจาก คำขอ Ajax ฉันใช้ postgres (ที่ heroku) ถ้าเป็นเรื่องสำคัญ

ไม่มีใครมีความคิดใด ๆ

ไชโยสำหรับความช่วยเหลือใด ๆ !


คุณสามารถทำการเปรียบเทียบและบอกเราว่า IO หรือฐานข้อมูลจะเป็นคอขวดหรือไม่?

คำถามที่เกี่ยวข้องในStackOverflow
Jordão

ด้วยการอ้างอิงตนเองเมื่อย้ายรายการจากที่หนึ่งในรายการไปยังที่อื่นคุณต้องอัปเดต 2 รายการเท่านั้น ดูen.wikipedia.org/wiki/Linked_list
Pieter B

อืมไม่แน่ใจว่าทำไมรายการที่เชื่อมโยงจึงไม่ค่อยได้รับความสนใจในคำตอบ
Christiaan Westerbeek

คำตอบ:


32

ก่อนอื่นอย่าพยายามทำอะไรที่ฉลาดด้วยตัวเลขทศนิยมเพราะมันจะทำให้คุณตกใจ REALและDOUBLE PRECISIONไม่แน่นอนและอาจไม่ได้เป็นตัวแทนของสิ่งที่คุณใส่ลงไปอย่างถูกต้อง NUMERICแน่นอน แต่การเคลื่อนไหวที่ถูกต้องจะทำให้คุณหมดความแม่นยำและการใช้งานของคุณจะไม่ดี

การ จำกัด การเลื่อนไปยังการขึ้นและลงเพียงครั้งเดียวทำให้การดำเนินการทั้งหมดนั้นง่ายมาก สำหรับรายการที่มีหมายเลขเรียงตามลำดับคุณสามารถเลื่อนรายการขึ้นโดยการลดตำแหน่งและเพิ่มหมายเลขตำแหน่งของสิ่งที่การลดลงก่อนหน้าเกิดขึ้น (ในคำอื่น ๆ รายการที่5จะกลายเป็น4และสิ่งที่ถูกรายการที่4จะกลายเป็น5ได้อย่างมีประสิทธิภาพแลกเปลี่ยนเป็น Morons อธิบายไว้ในคำตอบของเขา.) ย้ายมันลงมาจะเป็นตรงข้าม จัดทำดัชนีตารางของคุณโดยระบุรายการและตำแหน่งที่ไม่ซ้ำกันและคุณสามารถทำได้ด้วยสองUPDATEรายการภายในธุรกรรมที่จะทำงานได้อย่างรวดเร็ว นอกจากว่าผู้ใช้ของคุณกำลังจัดเรียงรายการใหม่ด้วยความเร็วเหนือมนุษย์สิ่งนี้จะไม่ทำให้เกิดภาระมากนัก

การลากและวาง (เช่นย้ายรายการ6เพื่อนั่งระหว่างรายการ9และ10) เป็นเล่ห์เหลี่ยมเล็กน้อยและต้องทำแตกต่างกันขึ้นอยู่กับว่าตำแหน่งใหม่อยู่เหนือหรือใต้ตำแหน่งเก่า ในตัวอย่างข้างต้นคุณจะต้องเปิดหลุมโดยการเพิ่มตำแหน่งทั้งหมดที่สูงกว่าการ9ปรับปรุง6ตำแหน่งของรายการให้เป็นตำแหน่งใหม่10จากนั้นจึงลดตำแหน่งของทุกสิ่งที่มากกว่าที่6จะเติมลงในตำแหน่งว่าง ด้วยการจัดทำดัชนีเดียวกับที่ฉันอธิบายก่อนหน้านี้จะรวดเร็ว คุณสามารถทำให้สิ่งนี้เร็วขึ้นกว่าที่ฉันเคยอธิบายเล็กน้อยโดยลดจำนวนแถวที่สัมผัสกับธุรกรรม แต่นั่นคือ microoptimization ที่คุณไม่ต้องการจนกว่าคุณจะสามารถพิสูจน์ได้ว่ามีคอขวด

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


นี่เป็นวิธีที่ฉันจัดการกับมันในระบบการเตรียมการเสนอราคาโครงการที่เรามีเมื่อหลายพันล้านปีก่อน แม้แต่ใน Access การอัพเดทก็รวดเร็วเหมือนกัน
HLGEM

ขอบคุณสำหรับการสำรวจ Blrfl! ฉันพยายามทำตัวเลือกหลัง แต่ฉันพบว่าถ้าฉันลบรายการออกจากรายการกลางมันจะปล่อยให้ช่องว่างอยู่ในตำแหน่ง (มันค่อนข้างไร้เดียงสา) มีวิธีง่ายๆในการหลีกเลี่ยงการสร้างช่องว่างเช่นนี้หรือฉันจะต้องทำด้วยตนเองทุกครั้งที่สั่งซื้อใหม่บางสิ่ง (ถ้าฉันต้องจัดการมันจริงๆ)
Tom Brunoli

2
@ TomBrunoli: ฉันต้องคิดเกี่ยวกับการใช้งานเล็กน้อยก่อนที่จะพูดอย่างแน่นอน แต่คุณอาจจะสามารถดึงการกำหนดหมายเลขส่วนใหญ่หรือทั้งหมดโดยอัตโนมัติด้วยทริกเกอร์ เช่นหากคุณลบรายการ 7 ทริกเกอร์จะลดแถวทั้งหมดในรายการเดียวกันที่มีค่ามากกว่า 7 หลังจากการลบเกิดขึ้น ส่วนแทรกจะทำสิ่งเดียวกัน (การแทรกรายการ 7 จะเป็นการเพิ่มแถวทั้งหมด 7 ขึ้นไป) ทริกเกอร์สำหรับการอัปเดต (เช่นย้ายรายการที่ 3 ระหว่าง 9 และ 10) จะซับซ้อนกว่าปานกลาง แต่แน่นอนภายในขอบเขตของความเป็นไปได้
Blrfl

ก่อนหน้านี้ฉันไม่เคยดูทริกเกอร์ แต่ดูเหมือนจะเป็นวิธีที่ดีที่จะทำ
Tom Brunoli

1
@ TomBrunoli: เกิดขึ้นกับฉันว่าการใช้ทริกเกอร์ในการทำเช่นนี้อาจทำให้เกิดการซ้อน ขั้นตอนการจัดเก็บพร้อมการเปลี่ยนแปลงทั้งหมดในธุรกรรมอาจเป็นเส้นทางที่ดีกว่าสำหรับสิ่งนี้
Blrfl

15

คำตอบเดียวกันจากที่นี่https://stackoverflow.com/a/49956113/10608


วิธีแก้ปัญหา: สร้างindexสตริง (เนื่องจากสตริงโดยพื้นฐานแล้วจะมี "ความแม่นยำตามอำเภอใจ" โดยไม่มีที่สิ้นสุด) หรือถ้าคุณใช้ int ให้เพิ่มขึ้นindex100 แทน 1

ปัญหาประสิทธิภาพคือ: ไม่มีค่า "อยู่ระหว่าง" ระหว่างสองรายการที่จัดเรียง

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

ดียิ่งขึ้น: นี่คือวิธีที่ Jira แก้ปัญหานี้ "อันดับ" ของพวกเขา (สิ่งที่คุณเรียกว่าดัชนี) คือค่าสตริงที่อนุญาตให้มีห้องหายใจจำนวนหนึ่งระหว่างรายการที่จัดอันดับ

นี่คือตัวอย่างจริงของฐานข้อมูลจิราที่ฉันทำงานด้วย

   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
ฉันกำลังพยายามหาวิธีที่จะทำสิ่งนี้โดยการปรับปรุงบันทึกเดียวและคำตอบนี้อธิบายถึงวิธีการแก้ปัญหาที่ฉันคิดในใจของฉันได้เป็นอย่างดี
NSjonas

13

ฉันเคยเห็นคนที่ใช้การอ้างอิงตนเองเพื่ออ้างอิงถึงค่าก่อนหน้า (หรือถัดไป) แต่อีกครั้งดูเหมือนว่าคุณจะต้องอัปเดตรายการอื่น ๆ อีกมากในรายการ

ทำไม? สมมติว่าคุณใช้แนวทางตารางรายการแบบลิงก์กับคอลัมน์ (listID, itemID, nextItemID)

การแทรกไอเท็มใหม่ลงในรายการจะมีค่าใช้จ่ายสำหรับการแทรกหนึ่งครั้งและหนึ่งแถวที่แก้ไขแล้ว

การจัดวางรายการใหม่มีค่าใช้จ่ายการแก้ไขสามแถว (รายการที่กำลังถูกย้ายรายการก่อนหน้าและรายการก่อนตำแหน่งใหม่)

การลบรายการมีค่าใช้จ่ายการลบหนึ่งรายการและแถวที่แก้ไขหนึ่งรายการ

ค่าใช้จ่ายเหล่านี้ยังคงเหมือนเดิมโดยไม่คำนึงว่ารายการนั้นมี 10 รายการหรือ 10,000 รายการ ในทั้งสามกรณีมีการแก้ไขน้อยกว่าหนึ่งถ้าแถวเป้าหมายเป็นรายการแรก หากคุณใช้งานบ่อยในรายการสุดท้ายอาจเป็นประโยชน์ในการจัดเก็บ prevItemID แทนที่จะเป็นรายการถัดไป


10

"แต่ดูเหมือนว่าจะไม่มีประสิทธิภาพทีเดียว"

คุณวัดได้หรือไม่ หรือว่าเป็นเพียงการเดา อย่าตั้งสมมติฐานเช่นนี้โดยไม่มีข้อพิสูจน์ใด ๆ

"20 ถึง 50 รายการต่อรายการ"

จริงๆแล้วนั่นไม่ใช่ "รายการทั้งหมด" สำหรับฉันที่ฟังดูน้อยมาก

ฉันขอแนะนำให้คุณใช้แนวทาง "คอลัมน์ตำแหน่ง" (หากเป็นการใช้งานที่ง่ายที่สุดสำหรับคุณ) สำหรับรายการขนาดเล็กเช่นนี้อย่าเริ่มต้นการเพิ่มประสิทธิภาพที่ไม่จำเป็นก่อนที่คุณจะประสบปัญหาประสิทธิภาพที่แท้จริง


6

นี่เป็นคำถามของสเกลและใช้เคส ..

คุณคาดหวังรายการกี่รายการในรายการ? หากคนนับล้านฉันคิดว่าฆ้องเส้นทางทศนิยมเป็นเส้นทางที่ชัดเจน

ถ้า 6 แล้วการจัดลำดับเลขจำนวนเต็มใหม่เป็นตัวเลือกที่ชัดเจน นอกจากนี้ยังคำถามเป็นวิธีการที่รายการหรือเรียงใหม่ หากคุณใช้ลูกศรขึ้นและลง (เลื่อนขึ้นหรือลงทีละหนึ่งช่อง) ฉันจะใช้จำนวนเต็มจากนั้นสลับกับค่าก่อนหน้า (หรือถัดไป) เมื่อย้าย

นอกจากนี้คุณมักจะคอมมิทถ้าผู้ใช้สามารถทำการเปลี่ยนแปลง 250 ครั้งจากนั้นทำการคอมมิตในครั้งเดียวมากกว่าที่ฉันบอกว่าจำนวนเต็มด้วยการกำหนดหมายเลขใหม่อีกครั้ง ...

tl; dr: ต้องการข้อมูลเพิ่มเติม


แก้ไข: "รายการสิ่งที่ปรารถนา" ฟังดูเป็นรายการเล็ก ๆ มากมาย (สมมุติว่านี่อาจเป็นเท็จ) .. ดังนั้นฉันจึงพูดว่าจำนวนเต็มกับการกำหนดหมายเลขใหม่ (แต่ละรายการมีตำแหน่งของตนเอง)


ฉันจะอัปเดตคำถามด้วยบริบทเพิ่มเติม
Tom Brunoli

ทศนิยมไม่ทำงานเนื่องจากความแม่นยำมี จำกัด และแต่ละรายการที่แทรกอาจใช้เวลา 1 บิต
njzk2

3

หากวัตถุประสงค์คือเพื่อลดจำนวนการดำเนินการฐานข้อมูลต่อการดำเนินการเรียงลำดับใหม่:

สมมติว่า

  • รายการช้อปปิ้งทั้งหมดสามารถระบุด้วยจำนวนเต็ม 32 บิต
  • มีการ จำกัด ขนาดสูงสุดสำหรับรายการสินค้าที่ต้องการของผู้ใช้ (ฉันเห็นบางเว็บไซต์ยอดนิยมใช้ 20 - 40 รายการตามขีด จำกัด )

จัดเก็บรายการสิ่งที่ต้องการเรียงลำดับของผู้ใช้เป็นลำดับของจำนวนเต็ม (อาร์เรย์จำนวนเต็ม) ในหนึ่งคอลัมน์ ทุกครั้งที่มีการเรียงลำดับรายการความปรารถนาใหม่อาร์เรย์ทั้งหมด (แถวเดียวคอลัมน์เดียว) จะได้รับการอัปเดตซึ่งจะต้องดำเนินการด้วยการอัปเดต SQL ครั้งเดียว

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


หากวัตถุประสงค์แตกต่างกันให้ใช้แนวทาง "คอลัมน์ตำแหน่ง"


เกี่ยวกับ "ความเร็ว" ตรวจสอบให้แน่ใจว่าได้กำหนดเกณฑ์ขั้นตอนการจัดเก็บ ในขณะที่ออกการอัปเดต20 รายการแยกต่างหากสำหรับการสลับรายการที่ต้องการหนึ่งครั้งอาจช้า แต่อาจมีวิธีที่รวดเร็วในการใช้ขั้นตอนการจัดเก็บ


3

ตกลงฉันประสบปัญหายุ่งยากนี้เมื่อเร็ว ๆ นี้และคำตอบทั้งหมดในคำถาม & คำตอบนี้ให้แรงบันดาลใจมากมาย วิธีที่ฉันเห็นมันแต่ละวิธีแก้ปัญหามีข้อดีข้อเสีย

  • หากpositionฟิลด์นั้นต้องต่อเนื่องกันโดยไม่มีช่องว่างคุณจะต้องเรียงลำดับรายการทั้งหมดใหม่ นี่เป็นการดำเนินการ O (N) ข้อดีคือฝั่งไคลเอ็นต์จะไม่ต้องการตรรกะพิเศษใด ๆ เพื่อรับใบสั่งซื้อ

  • หากเราต้องการหลีกเลี่ยงการดำเนินการ O (N) แต่ยังคงรักษาลำดับที่แม่นยำหนึ่งในวิธีการคือใช้ "การอ้างอิงตนเองเพื่ออ้างอิงถึงค่าก่อนหน้า (หรือถัดไป)" นี่เป็นสถานการณ์จำลองรายการเชื่อมโยงตำราเรียน จากการออกแบบมันจะไม่เกิด "รายการอื่น ๆ อีกมากมายในรายการ" อย่างไรก็ตามสิ่งนี้ต้องใช้ฝั่งไคลเอ็นต์ (บริการบนเว็บหรืออาจเป็นแอพมือถือ) เพื่อใช้ตรรกะ travesal ที่เชื่อมโยงกับลิสต์เพื่อรับออเดอร์

  • รูปแบบบางอย่างไม่ได้ใช้อ้างอิงคือรายการที่เชื่อมโยง พวกเขาเลือกที่จะเป็นตัวแทนของคำสั่งทั้งหมดเป็นหยดที่มีอยู่ในตัวเองเช่น JSON-array-in-a-string [5,2,1,3,...]; คำสั่งดังกล่าวจะถูกจัดเก็บในที่แยกต่างหาก วิธีการนี้ยังมีผลข้างเคียงของการกำหนดรหัสฝั่งไคลเอ็นต์เพื่อรักษาลำดับการแยกนั้น

  • ในหลายกรณีเราไม่จำเป็นต้องเก็บคำสั่งซื้อที่แน่นอนเราเพียงแค่ต้องรักษาอันดับสัมพัทธ์ในแต่ละระเบียน ดังนั้นเราสามารถอนุญาตให้มีช่องว่างระหว่างเรคคอร์ดตามลำดับ รูปแบบรวมถึง: (1) ใช้จำนวนเต็มกับช่องว่างเช่น 100, 200, 300 ... แต่คุณจะหมดช่องว่างอย่างรวดเร็วแล้วต้องใช้กระบวนการกู้คืน; (2) การใช้ทศนิยมที่มาพร้อมกับช่องว่างที่เป็นธรรมชาติ แต่คุณจะต้องตัดสินใจว่าคุณจะสามารถอยู่กับข้อ จำกัด ที่แม่นยำในที่สุดหรือไม่ (3) โดยใช้ตำแหน่งสตริงตามที่อธิบายไว้ในคำตอบนี้แต่ต้องระวังกับดักการดำเนินงานที่ยุ่งยาก

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


2

ใช้หมายเลขจุดลอยตัวสำหรับคอลัมน์ตำแหน่ง

คุณสามารถจัดลำดับรายการใหม่ได้โดยเปลี่ยนเฉพาะคอลัมน์ตำแหน่งในแถว "ย้าย"

โดยทั่วไปหากผู้ใช้ของคุณต้องการตำแหน่ง "สีแดง" หลัง "สีฟ้า" แต่ก่อนหน้า "สีเหลือง"

จากนั้นคุณก็ต้องคำนวณ

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

หลังจากไม่กี่ล้านตำแหน่งอีกครั้งคุณอาจได้รับจำนวนจุดลอยตัวขนาดเล็กจนไม่มี "ระหว่าง" - แต่นี่น่าจะเป็นเท่าที่เห็นยูนิคอร์น

คุณสามารถใช้สิ่งนี้โดยใช้เขตข้อมูลจำนวนเต็มที่มีช่องว่างเริ่มต้นที่ 1,000, ดังนั้นการเริ่มต้น oredring ของคุณจะเป็น 1,000-> blue, 2000-> Yellow, 3000-> Red หลังจาก "ย้าย" สีแดงหลังจากสีน้ำเงินคุณจะมี 1,000-> สีน้ำเงิน, 1500-> แดง, 2000-> เหลือง

ปัญหาคือว่าด้วยช่องว่างเริ่มต้นที่มีขนาดใหญ่ดูเหมือน 1,000 ถึงน้อยเป็น 10 ย้ายจะพาคุณเข้าสู่สถานการณ์เช่น 1,000-> สีฟ้า, 1001-puce, 1004-> biege ...... ที่คุณจะไม่สามารถอีกต่อไป เพื่อแทรกอะไรก็ได้หลังจาก "น้ำเงิน" โดยไม่ต้องใส่หมายเลขใหม่ทั้งหมด การใช้หมายเลขจุดลอยตัวจะเป็นจุดกึ่งกลางระหว่างสองตำแหน่งเสมอ


4
การจัดทำดัชนีและการเรียงลำดับในฐานข้อมูลที่ขึ้นอยู่กับการลอยมีราคาแพงกว่า ints Ints ยังเป็นลำดับที่ดี ... ไม่จำเป็นต้องส่งเป็นบิตเพื่อให้สามารถเรียงลำดับบนไคลเอนต์ได้ (ความแตกต่างระหว่างตัวเลขสองจำนวนที่แสดงผลเหมือนกันเมื่อพิมพ์ แต่มีค่าบิตที่แตกต่างกัน)

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

5
สำหรับผู้ที่สนใจวิธีนี้เป็นสิ่งที่ Trello ( trello.com ) ทำ เปิดการดีบักเกอร์โครเมี่ยมของคุณและเอาท์พุท diff JSON จากก่อน / หลังจากที่สั่งซื้อ (ลาก / วางการ์ด) และคุณจะได้รับ "pos": 1310719, + "pos": 638975.5- เพื่อความเป็นธรรมคนส่วนใหญ่ไม่ได้ทำรายการ trello ที่มี 4 ล้านรายการ แต่ขนาดและการใช้งานของรายการ Trello เป็นเรื่องธรรมดาสำหรับเนื้อหาที่ผู้ใช้จัดเรียงได้ และสิ่งใดก็ตามที่ผู้ใช้จัดเรียงไม่เกี่ยวอะไรกับประสิทธิภาพสูงความเร็วในการเรียงลำดับ int vs float นั้นเป็นสิ่งที่พิจารณาโดยเฉพาะอย่างยิ่งเมื่อพิจารณาว่าฐานข้อมูลส่วนใหญ่ถูก จำกัด โดยประสิทธิภาพของ IO
zelk

1
@PieterB สำหรับ 'ทำไมไม่ใช้จำนวนเต็ม 64 บิต' มันเป็นเรื่องของการยศาสตร์สำหรับนักพัฒนาซอฟต์แวร์ส่วนใหญ่ มีความลึกโดยประมาณน้อยกว่า <1.0 เท่าที่มี> 1.0 สำหรับโฟลตเฉลี่ยของคุณดังนั้นคุณสามารถเริ่มต้นคอลัมน์ 'ตำแหน่ง' เป็น 1.0 และแทรก 0.5, 0.25, 0.75 ได้อย่างง่ายดายเพียงเท่าตัว ด้วยจำนวนเต็มค่าเริ่มต้นของคุณจะต้องเป็น 2 ^ 30 หรือมากกว่านั้นทำให้เป็นการยากที่จะคิดเมื่อคุณทำการดีบั๊ก 4073741824 ใหญ่กว่า 496359787 หรือไม่ เริ่มนับตัวเลข
zelk

1
นอกจากนี้หากคุณเคยประสบคดีที่คุณไม่มีที่ว่างระหว่างตัวเลข ... มันไม่ใช่เรื่องยากที่จะแก้ไข ย้ายหนึ่งในนั้น แต่สิ่งสำคัญคือการทำงานในลักษณะที่ดีที่สุดซึ่งจัดการกับการแก้ไขหลายอย่างพร้อมกันโดยฝ่ายต่าง ๆ (เช่น trello) คุณสามารถแยกตัวเลขสองตัวหรืออาจจะโรยเสียงรบกวนเล็กน้อยและ voila แม้ว่าคนอื่นทำสิ่งเดียวกันในเวลาเดียวกันยังคงมีคำสั่งทั่วโลกและคุณไม่จำเป็นต้อง INSERT ภายในการทำธุรกรรมเพื่อให้ได้ ที่นั่น
zelk
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.