Bu soru aslında veri modelinizle bir araya getirilen bir çok sorun. Bunları teker teker çözmeye başlamanız gerekir. Bulmacanın her bir parçasını basitleştirmeye çalışırken daha doğal, sezgisel çözümler ortadan kalkar.
Sorun 1: DB Siparişine bağlı olamaz
Verilerinizi sıralama açıklamalarınız net değil
- En büyük potansiyel sorun, bir
ORDER BY
fıkra ile veritabanınızda açık bir sıralama belirtmemenizdir . Çok pahalı görünmediğinden değilseniz, programınızın bir hatası var . Belirtilmemişse, veritabanlarının sonuçları herhangi bir sırayla döndürmesine izin verilir ; Sorguya birkaç kez koştuğunuz için rastgele veriyi sırayla döndürmenize bağlı olamazsınız. Sıra değişebilir çünkü sıralar diskte yeniden düzenlenir, ya da bazıları silinir, yenileri yer alır ya da bir dizin eklenir. Sen gerekir bir belirtmek ORDER BY
çeşit maddesini. Doğruluk olmadan hız değersizdir.
- Ayrıca, ekleme siparişi ile ne demek istediğinizi de belli etmiyor. Veritabanına kendisi söz ediyorsanız, gereken aslında bu izleyen bir sütun var ve bu olmalı senin dahil edilmesi
ORDER BY
fıkra. Aksi takdirde, böcek var. Eğer böyle bir sütun henüz mevcut değilse, bir tane eklemeniz gerekir. Bunun gibi sütunlar için tipik seçenekler, ekleme zaman damgası sütunu veya otomatik artan anahtardır. Otomatik artan anahtar daha güvenilirdir.
Problem 2: Hafıza sıralamada verimli olma
Verileri beklediğiniz sıraya göre döndürmenin garanti edildiğinden emin olduktan sonra , bellek türlerini çok daha verimli hale getirmek için bu gerçeği kaldırabilirsiniz . Sorgunuzun sonuç kümesine bir row_number()
veyadense_rank()
sütun (veya veritabanınızın eşdeğeri) eklemeniz yeterlidir. Artık her satırda, siparişin ne olması gerektiği konusunda doğrudan bir gösterge verecek bir endeks var ve bunu hatıra olarak saklayabilirsiniz. Dizine anlamlı bir ad (benzeri sortedBySomethingIndex
) verdiğinizden emin olun .
Viyola. Şimdi artık veritabanı sonuç kümesi sırasına bağlı kalmak zorunda değilsiniz.
Sorun 3: Bu işlemi kodda yapmanız gerekiyor mu?
SQL aslında gerçekten güçlü. Verileriniz üzerinde çok fazla dönüşüm ve toplama yapmanıza izin veren şaşırtıcı bir bildirim dilidir. Çoğu DB bugünlerde çapraz sıra işlemlerini bile destekliyor. Bunlara pencere veya analitik fonksiyonlar denir:
Verilerinizi bu şekilde belleğe mi çekmeniz gerekiyor ? Veya SQL işlevindeki tüm çalışmaları pencere işlevlerini kullanarak yapabilir misiniz? DB'deki çalışmaların tümünü (veya belki de yalnızca önemli bir bölümünü) yapabiliyorsanız, harika! Kod probleminiz ortadan kalkar (veya çok daha basitleşir)!
Problem 4: Buna ne yapıyorsunuz data
?
Bunların hepsini DB'de yapamayacağınızı varsayarak, bunu doğru anlamama izin verin. Sen (siz şeylerle kamalıdır Verileri harita alıyorsun yok bunun üzerinde göre sıralamak istiyorum), o zaman konum ilerlerken ekleme talimatına ve bazı anahtarlarının değeri değiştirerek ve ekleyerek yerinde haritayı değiştirerek Yeni olanlar?
Özür dilerim, ama ne halt?
Arayanlar tüm bunlar için endişelenmek zorunda olmamalıdır . Yarattığınız sistem çok kırılgan. Küçük bir yanlış değişiklik yapmak için tek bir aptal hata (belki de kendi başınıza yaptığınız gibi) alır ve her şey kart destesi gibi çöküyor.
İşte belki daha iyi bir fikir:
- İşlevinizin kabul etmesini sağlayın
List
.
- Sipariş problemini çözmenin birkaç yolu var.
- Hızlı Arızayı Uygula. Listede işlevin gerektirdiği sırada değilse bir hata atın. (Not: Problem olup olmadığını anlamak için Problem 2'deki sıralama indeksini kullanabilirsiniz.)
- Sıralı bir kopya kendiniz oluşturun (sorun yine 2'deki dizini kullanarak).
- Haritanın kendisini sırayla oluşturmanın bir yolunu bulun.
- İhtiyacınız olan haritayı dahili olarak oluşturun, böylece arayan kişi onunla ilgilenmek zorunda kalmaz.
- Şimdi sahip olduğunuz sıraya göre düzenleyin ve yapmanız gerekeni yapın.
- Haritayı döndürün veya uygun bir dönüş değerine dönüştürün
Sıralı bir gösterim oluşturmak ve ardından indekslemek için bir anahtar haritası oluşturmak olabilir . Bu, yanlışlıkla kopyaları oluşturmadan sıralanan kopyanızı yerinde değiştirmenize olanak sağlar.
Ya da belki bu daha mantıklı: data
Parametreden kurtulun ve processData
aslında kendi verilerini alın. Daha sonra bunu yaptığınızı belgeleyebilirsiniz, çünkü verilerin getirilme şekli konusunda çok özel gereksinimleri vardır . Başka bir deyişle, işlev yapmak kendi tüm süreci, bunun sadece bir parçası; Bağımlılıklar, mantığı daha küçük parçalara bölmek için fazla güçlüdür. (İşlemdeki işlevin adını değiştirin.)
Belki bunlar senin durumun için işe yaramaz. Sorunun tam detayları olmadan bilmiyorum. Ama duyduğumda kırılgan ve kafa karıştırıcı bir tasarım biliyorum.
özet
Bence buradaki problem nihayetinde şeytanın ayrıntıda olduğu. Böyle bir sıkıntı yaşamaya başladığımda, bunun sebebi genellikle çözmeye çalıştığım problem için verilerimi uygunsuz bir şekilde temsil etmemdir. En iyi çözüm, daha iyi bir temsil bulmak ve benim sorunum çözmek için basit (belki kolay değil, basit) olur.
Bu noktayı alan birini bulun: işiniz, sorununuzu basit ve anlaşılır olanlara indirgemek. O zaman sağlam, sezgisel bir kod oluşturabilirsiniz. Onlarla konuş. İyi kod ve iyi tasarım, sizi salak ve anlaşılır oldukları için herhangi bir aptalın düşünebileceğini düşündürür. Belki konuşabileceğin zihniyeti olan kıdemli bir geliştirici vardır.