Câu hỏi này thực sự là một loạt các vấn đề với mô hình dữ liệu của bạn được đưa vào một. Bạn cần bắt đầu gỡ rối chúng, từng cái một. Các giải pháp trực quan, tự nhiên hơn sẽ xuất hiện khi bạn cố gắng đơn giản hóa từng mảnh ghép.
Vấn đề 1: Bạn không thể phụ thuộc vào Đơn hàng DB
Mô tả của bạn về sắp xếp dữ liệu của bạn là không rõ ràng.
- Vấn đề tiềm năng lớn nhất là bạn không chỉ định một loại rõ ràng trong cơ sở dữ liệu của mình, thông qua một
ORDER BY
mệnh đề. Nếu bạn không phải vì nó quá đắt, chương trình của bạn có lỗi . Cơ sở dữ liệu được phép trả về kết quả theo bất kỳ thứ tự nào nếu bạn không chỉ định một kết quả; bạn không thể phụ thuộc vào nó một cách ngẫu nhiên trả lại dữ liệu theo thứ tự chỉ vì bạn đã chạy truy vấn một vài lần và nó trông như vậy. Thứ tự có thể thay đổi vì các hàng được sắp xếp lại trên đĩa hoặc một số bị xóa và các hàng mới thay thế chúng hoặc chỉ mục được thêm vào. Bạn phải chỉ định mộtORDER BY
mệnh đề của một số loại. Tốc độ là vô giá trị mà không chính xác.
- Nó cũng không rõ ý của bạn bằng cách chèn thứ tự quan trọng. Nếu bạn đang nói về chính cơ sở dữ liệu, bạn phải có một cột thực sự theo dõi điều này và nó phải được bao gồm trong
ORDER BY
mệnh đề của bạn . Nếu không, bạn có lỗi. Nếu một cột như vậy chưa tồn tại, thì bạn cần thêm một cột. Các tùy chọn điển hình cho các cột như thế này sẽ là cột dấu thời gian chèn hoặc khóa tăng tự động. Phím tăng tự động là đáng tin cậy hơn.
Vấn đề 2: Sắp xếp bộ nhớ hiệu quả
Một khi bạn chắc chắn rằng nó được đảm bảo để được trở về dữ liệu theo thứ tự bạn mong đợi, bạn có thể tận dụng thực tế này để thực hiện trong bộ nhớ các loại nhiều hiệu quả hơn. Chỉ cần thêm một row_number()
hoặcdense_rank()
cột (hoặc tương đương với cơ sở dữ liệu của bạn) vào tập kết quả truy vấn của bạn. Bây giờ mỗi hàng có một chỉ mục sẽ cung cấp cho bạn một dấu hiệu trực tiếp về thứ tự được cho là gì và bạn có thể sắp xếp theo thứ tự này trong bộ nhớ một cách tầm thường. Chỉ cần đảm bảo rằng bạn đặt cho chỉ mục một tên có ý nghĩa (nhưsortedBySomethingIndex
).
Viola. Bây giờ bạn không phải phụ thuộc vào thứ tự thiết lập kết quả cơ sở dữ liệu nữa.
Vấn đề 3: Bạn thậm chí có cần thực hiện xử lý này trong mã không?
SQL thực sự rất mạnh. Đó là một ngôn ngữ khai báo tuyệt vời cho phép bạn thực hiện nhiều biến đổi và tổng hợp trên dữ liệu của mình. Hầu hết các DB thậm chí còn hỗ trợ các hoạt động hàng ngang hiện nay. Chúng được gọi là chức năng cửa sổ hoặc phân tích:
Bạn thậm chí có cần phải kéo dữ liệu của mình vào bộ nhớ như thế này không? Hoặc bạn có thể thực hiện tất cả các công việc trong truy vấn SQL bằng cách sử dụng các hàm cửa sổ? Nếu bạn có thể làm tất cả (hoặc thậm chí chỉ là một phần quan trọng) của công việc trong DB, thật tuyệt vời!Vấn đề mã của bạn biến mất (hoặc đơn giản hơn rất nhiều)!
Vấn đề 4: Bạn đang làm gì với điều đó data
?
Giả sử bạn không thể làm tất cả trong DB, hãy để tôi nói thẳng điều này. Bạn đang lấy dữ liệu dưới dạng bản đồ (được khóa bởi những thứ bạn không muốn sắp xếp theo), sau đó bạn đang lặp lại dữ liệu theo thứ tự chèn và sửa đổi bản đồ tại chỗ bằng cách thay thế giá trị của một số khóa và thêm những cái mới?
Tôi xin lỗi, nhưng cái quái gì thế?
Người gọi không cần phải lo lắng về tất cả điều này . Hệ thống bạn đã tạo cực kỳ mong manh. Chỉ cần một sai lầm ngớ ngẩn (thậm chí có thể do chính bạn tạo ra, như chúng ta đã làm) để thực hiện một thay đổi nhỏ và toàn bộ sự việc sụp đổ như một cỗ bài.
Đây có thể là một ý tưởng tốt hơn:
- Có chức năng của bạn chấp nhận một
List
.
- Có một vài cách bạn có thể xử lý vấn đề đặt hàng.
- Áp dụng thất bại nhanh. Ném một lỗi nếu danh sách không theo thứ tự mà hàm yêu cầu. (Lưu ý: Bạn có thể sử dụng chỉ mục sắp xếp từ Bài toán 2 để biết nếu có.)
- Tự tạo một bản sao được sắp xếp (một lần nữa sử dụng chỉ mục từ vấn đề 2).
- Chỉ ra một cách để xây dựng bản đồ theo thứ tự.
- Xây dựng bản đồ bạn cần nội bộ cho chức năng, vì vậy người gọi không cần phải quan tâm đến nó.
- Bây giờ lặp đi lặp lại bất cứ điều gì theo thứ tự đại diện bạn có và làm những gì bạn phải làm.
- Trả lại bản đồ hoặc chuyển đổi nó thành một giá trị trả về thích hợp
Một biến thể có thể có thể là xây dựng một biểu diễn được sắp xếp và sau đó tạo một bản đồ khóa để lập chỉ mục . Điều này sẽ cho phép bạn sửa đổi bản sao được sắp xếp của bạn tại chỗ, mà không vô tình tạo các bản sao.
Hoặc có thể điều này có ý nghĩa hơn: loại bỏ data
tham số và thực processData
sự lấy dữ liệu của chính nó. Sau đó, bạn có thể ghi lại rằng bạn đang làm điều này bởi vì nó có các yêu cầu rất cụ thể về cách dữ liệu được tìm nạp. Nói cách khác, làm cho hàm riêng toàn bộ quá trình, không chỉ là một phần của nó; sự phụ thuộc lẫn nhau quá mạnh để phân chia logic thành các phần nhỏ hơn. (Thay đổi tên của hàm trong quy trình.)
Có lẽ những điều này sẽ không làm việc cho tình huống của bạn. Tôi không biết mà không có chi tiết đầy đủ của vấn đề. Nhưng tôi biết một thiết kế mỏng manh và khó hiểu khi tôi nghe.
Tóm lược
Tôi nghĩ vấn đề ở đây cuối cùng là ma quỷ nằm trong chi tiết. Khi tôi bắt đầu gặp rắc rối như thế này, thường là do tôi có cách trình bày dữ liệu không phù hợp cho vấn đề tôi đang cố gắng giải quyết. Giải pháp tốt nhất là tìm một đại diện tốt hơn , và sau đó vấn đề của tôi trở nên đơn giản (có thể không dễ dàng, nhưng đơn giản) để giải quyết.
Tìm ai đó đạt được điểm đó: công việc của bạn là giảm vấn đề của bạn xuống một tập hợp những vấn đề đơn giản, đơn giản. Sau đó, bạn có thể xây dựng mã mạnh mẽ, trực quan. Nói chuyện với họ. Mã tốt và thiết kế tốt khiến bạn nghĩ rằng bất kỳ kẻ ngốc nào cũng có thể nghĩ ra chúng, bởi vì chúng đơn giản và dễ hiểu. Có lẽ có một nhà phát triển cấp cao có tư duy mà bạn có thể nói chuyện.