คำถามนี้จริง ๆ แล้วเป็นปัญหาใหญ่ของแบบจำลองข้อมูลของคุณ คุณต้องเริ่มแกะพวกเขาทีละครั้ง โซลูชันที่เป็นธรรมชาติและใช้งานง่ายกว่าจะเลื่อนออกมาในขณะที่คุณพยายามทำให้ปริศนาแต่ละชิ้นง่ายขึ้น
ปัญหาที่ 1: คุณไม่สามารถพึ่งพาคำสั่ง DB ได้
รายละเอียดการเรียงลำดับข้อมูลของคุณไม่ชัดเจน
- ปัญหาที่ใหญ่ที่สุดที่อาจเกิดขึ้นคือคุณไม่ได้ระบุการเรียงลำดับที่ชัดเจนในฐานข้อมูลของคุณผ่านทาง
ORDER BY
ประโยค หากคุณไม่ได้เพราะมันดูเหมือนว่าราคาแพงเกินไปโปรแกรมของคุณมีข้อผิดพลาด ฐานข้อมูลได้รับอนุญาตให้ส่งคืนผลลัพธ์ในลำดับใดก็ได้หากคุณไม่ได้ระบุไว้ คุณไม่สามารถพึ่งพาข้อมูลที่ส่งคืนตามลำดับโดยบังเอิญเพียงเพราะคุณเรียกใช้แบบสอบถามสองสามครั้งและดูเหมือนว่าจะเป็นเช่นนั้น ลำดับอาจเปลี่ยนแปลงได้เนื่องจากแถวต่างๆถูกจัดเรียงใหม่บนดิสก์หรือบางส่วนถูกลบและแถวใหม่จะเข้าแทนที่หรือเพิ่มดัชนี คุณต้องระบุORDER BY
ประโยคบางอย่าง ความเร็วนั้นไร้ค่าโดยไม่มีความถูกต้อง
- ยังไม่ชัดเจนว่าคุณหมายถึงอะไรโดยลำดับการแทรกสำคัญ หากคุณกำลังพูดถึงฐานข้อมูลเองคุณต้องมีคอลัมน์ที่ติดตามสิ่งนี้จริงและจะต้องรวมอยู่ใน
ORDER BY
ข้อของคุณ มิฉะนั้นคุณมีข้อบกพร่อง หากยังไม่มีคอลัมน์ดังกล่าวคุณจะต้องเพิ่มอีกหนึ่งคอลัมน์ ตัวเลือกทั่วไปสำหรับคอลัมน์เช่นนี้จะเป็นคอลัมน์เวลาประทับหรือคีย์ที่เพิ่มขึ้นอัตโนมัติ คีย์การเพิ่มโดยอัตโนมัติมีความน่าเชื่อถือมากกว่า
ปัญหาที่ 2: การจัดเรียงหน่วยความจำมีประสิทธิภาพ
เมื่อคุณให้แน่ใจว่ามันรับประกันที่ได้กลับข้อมูลในการสั่งซื้อที่คุณคาดว่าคุณสามารถใช้ประโยชน์จากความเป็นจริงนี้จะทำให้ในหน่วยความจำประเภทมากมีประสิทธิภาพมากขึ้น เพียงเพิ่มrow_number()
หรือdense_rank()
คอลัมน์ (หรือเทียบเท่าฐานข้อมูลของคุณ) ในชุดผลลัพธ์ของแบบสอบถาม ตอนนี้แต่ละแถวมีดัชนีที่จะให้การบ่งชี้โดยตรงถึงสิ่งที่ควรจะเป็นและคุณสามารถเรียงลำดับสิ่งนี้ในหน่วยความจำได้เล็กน้อย ตรวจสอบให้แน่ใจว่าคุณตั้งชื่อดัชนีที่มีความหมาย (เช่นsortedBySomethingIndex
)
ไวโอลินใหญ่ ตอนนี้คุณไม่จำเป็นต้องพึ่งพาคำสั่งชุดผลลัพธ์ของฐานข้อมูลอีกต่อไป
ปัญหาที่ 3: คุณจำเป็นต้องทำการประมวลผลด้วยรหัสหรือไม่
SQL เป็นจริงจริงๆมีประสิทธิภาพมันเป็นภาษาที่มีการประกาศที่ยอดเยี่ยมที่ให้คุณทำการแปลงและรวบรวมข้อมูลของคุณได้มากมาย DBs ส่วนใหญ่รองรับการทำงานข้ามแถวในปัจจุบัน พวกเขากำลังเรียกว่าฟังก์ชั่นหน้าต่างหรือการวิเคราะห์:
คุณจำเป็นต้องดึงข้อมูลของคุณลงในหน่วยความจำเช่นนี้หรือไม่? หรือคุณสามารถทำงานทั้งหมดในแบบสอบถาม SQL โดยใช้ฟังก์ชันหน้าต่างได้หรือไม่ หากคุณสามารถทำทุกอย่าง (หรืออาจเป็นเพียงส่วนสำคัญ) ของงานในฐานข้อมูลน่าอัศจรรย์! ปัญหารหัสของคุณหายไป (หรือง่ายขึ้นมาก)!
ปัญหาที่ 4: คุณกำลังทำสิ่งนั้นอยู่ data
?
สมมติว่าคุณไม่สามารถทำได้ทั้งหมดใน DB ให้ฉันได้สิ่งนี้โดยตรง คุณกำลังใช้ข้อมูลเป็นแผนที่ (ซึ่งเป็นสิ่งสำคัญที่คุณไม่ต้องการเรียงลำดับ) จากนั้นคุณก็ทำการวนซ้ำในตามลำดับการแทรกและปรับเปลี่ยนแผนที่โดยแทนที่ค่าของคีย์และการเพิ่ม อันใหม่?
ฉันขอโทษ แต่สิ่งที่ห่า
สายที่ไม่ควรต้องกังวลเกี่ยวกับทั้งหมดนี้ ระบบที่คุณสร้างนั้นยอดเยี่ยมมากที่เปราะบาง ใช้ความผิดพลาดเพียงครั้งเดียว (อาจทำให้ตัวเองเหมือนที่เราเคยทำ) เพื่อทำการเปลี่ยนแปลงที่ผิดพลาดเพียงเล็กน้อยและทุกอย่างพังทลายลงเหมือนสำรับไพ่
นี่อาจเป็นความคิดที่ดีกว่า:
- ให้ฟังก์ชั่นของคุณยอมรับ
List
มีฟังก์ชั่นของคุณยอมรับ
- มีสองวิธีที่คุณสามารถจัดการปัญหาการสั่งซื้อได้
- สมัครล้มเหลวอย่างรวดเร็ว โยนข้อผิดพลาดหากรายการไม่อยู่ในลำดับที่ฟังก์ชันต้องการ (หมายเหตุ: คุณสามารถใช้ดัชนีการเรียงลำดับจากปัญหา 2 เพื่อบอกได้ว่าเป็นหรือไม่)
- สร้างสำเนาที่เรียงลำดับตัวเอง (อีกครั้งโดยใช้ดัชนีจากปัญหา 2)
- คิดหาวิธีในการสร้างแผนที่ตามลำดับ
- สร้างแผนที่ที่คุณต้องการภายในฟังก์ชั่นดังนั้นผู้โทรไม่ต้องสนใจมัน
- ทวนสิ่งที่คุณมีและทำตามที่คุณต้องการ
- ส่งคืนแผนที่หรือแปลงเป็นค่าตอบแทนที่เหมาะสม
รูปแบบที่เป็นไปได้อาจสร้างการแสดงแบบเรียงแล้วสร้างแผนที่ของคีย์ไปที่ดัชนีดัชนีสิ่งนี้จะช่วยให้คุณแก้ไขสำเนาที่เรียงลำดับไว้โดยไม่ตั้งใจสร้างสำเนาซ้ำ
หรืออาจเป็นการเหมาะสมกว่า: กำจัดdata
พารามิเตอร์และทำให้processData
ดึงข้อมูลของตัวเองได้จริง จากนั้นคุณสามารถทำเอกสารว่าคุณทำเช่นนี้เพราะมีข้อกำหนดที่เฉพาะเจาะจงมากเกี่ยวกับวิธีการดึงข้อมูล กล่าวอีกนัยหนึ่งทำให้ฟังก์ชันเป็นเจ้าของกระบวนการทั้งหมดไม่ใช่แค่ส่วนเดียว การพึ่งพาระหว่างกันนั้นแข็งแกร่งเกินกว่าที่จะแยกตรรกะออกเป็นส่วนย่อย ๆ (เปลี่ยนชื่อของฟังก์ชันในกระบวนการ)
บางทีสิ่งเหล่านี้อาจใช้ไม่ได้กับสถานการณ์ของคุณ ฉันไม่รู้โดยไม่มีรายละเอียดของปัญหา แต่ฉันรู้ถึงการออกแบบที่เปราะบางและสับสนเมื่อฉันได้ยิน
สรุป
ฉันคิดว่าปัญหาที่นี่ในท้ายที่สุดแล้วว่าปีศาจอยู่ในรายละเอียด เมื่อฉันเริ่มมีปัญหาเช่นนี้มักเป็นเพราะฉันมีการแสดงข้อมูลที่ไม่เหมาะสมสำหรับปัญหาที่ฉันพยายามแก้ไขจริง ทางออกที่ดีที่สุดคือการหาตัวแทนที่ดีกว่าและจากนั้นปัญหาของฉันกลายเป็นเรื่องง่าย (อาจไม่ใช่เรื่องง่าย แต่ตรงไปตรงมา) เพื่อแก้ไข
หาคนที่ได้รับจุดนั้น: งานของคุณคือลดปัญหาของคุณให้เป็นชุดที่เรียบง่ายตรงไปตรงมา จากนั้นคุณสามารถสร้างรหัสที่แข็งแกร่งและใช้งานง่าย คุยกับพวกเขา. รหัสที่ดีและการออกแบบที่ดีทำให้คุณคิดว่าคนงี่เง่าคนไหนที่คิดพวกเขาเพราะมันเรียบง่ายและตรงไปตรงมา อาจมีนักพัฒนาอาวุโสที่มีความคิดที่คุณสามารถพูดคุยกับ