2012-03-27 18 views
7

İstek listesi olan bir web sitesi hazırlıyorum. İstek listesini (masayı) masif masasında saklamak istiyorum, fakat aynı zamanda kullanıcının istek listelerini sıralarken görmesini istemek, farklı tarihler - tarih eklendiğinde, tarih eklendiğinde, eşya isminde vb. Ayrıca, devam işaretini kullanarak uygulayabileceğime inandığım çağrıları uygulamak istiyorum.Azure Table Storage: Order by

Anladığım kadarıyla "order by" uygulanmadı ve sonuçların tablo depodan döndüğü sıra, bölüm anahtarı ve satır anahtarını temel alıyor. Bu nedenle, anlattığım çağrıları ve sıralamayı uygulamak istersem, istek listesini farklı bölüm anahtarı/satır anahtarı ile defalarca depolayarak bunu uygulamanın en iyi yolu nedir?

Bu basit durumda, istek listesinin o kadar büyük olmayacağı ve aslında listede görünebilecek maksimum öğe sayısını kısıtlayabildiğim, daha sonra çağrıdan kurtulup bellekte sıralayabileceğimiz olasıdır. Ancak, sayfalama ve sıralama için kullanmam gereken daha karmaşık vakalarım var.

cevap

8

Bugünün donanımında 1000 satırlık bir satır olması, bir listede, bellekte ve sırayla kolayca desteklenebilir. Gerçek sorun nedir, Anahtarları kullanarak ve bir tablo taraması yapmak zorunda kalmadan, tablo depolarındaki satırlara erişmeniz ne kadar mümkün. Birden çok tablodaki çoğaltma satırları korumak için oldukça hantal olabilir.

Alternatif bir çözüm, satırlarınızı SQL Azure'a geçici olarak yerleştirip oraya bir sipariş uygular. Sonuç kümenizde bellekte çalışmak için çok büyükse bu etkili olabilir. En iyi sonuç için geçici tablo gerekli indekslere sahip olmalıdır. Böyle

+0

Bellekte bir sıralama yapmaya ve daha sonra bir şişe boynuna dönüştüğünde endişeleniyorum. – s1mm0t

+0

... Ancak ikinci öneriniz ilginç. Hiç böyle bir şey yaptın mı? Farklı depolama alanları arasında veri aktarımı, yavaş olacak bir şey gibi görünecektir. – s1mm0t

+0

Bunu yakın zamanda yapmadım. Bunun muhtemelen bağlantısız bir dünyada çalıştığı ve birden fazla örnek için akılda tutulabilirliği göz önüne alındığında, sonuç kümesinin tablo depolamasından her istek için yerel belleğe yüklenmesi verimsiz olabilir. Bunun yerine SQL Azure'da aşamalandırma, verilere tek bir yükün ardından birden çok örnekten erişilebilmesini sağlayacaktır. Öte yandan, uygulamanız sınırlı veri kümesine sahip tek bir örneğe dayanıyorsa, belleğe yükleme yeterli olabilir. Önce bellek seçeneğini deneyebilir ve daha sonra beklentilere cevap vermezse SQL seçeneklerine geçebilirim. – hocho

2

Neden bunların tümünü bir List kullanarak .net'de yapmıyorsunuz.

Bu tür bir uygulama için SQL Azure'un daha uygun olacağını düşünürdüm.

+0

İstek listesi durumunda bir liste/IEnumerable olabilir Uygun, ama 1000 sonuçların olabileceği başka benzer ekranlar var.Tüm bunları hafızada yapmak zorunda değilim. Bu durumda maliyet avantajları nedeniyle Tablo Depolama'yı SQL Azure lehine kullanıyorum. – s1mm0t

+0

1000 satırlık bellek çok fazla değil. Ayrıca maliyet faydasını belirlediğinizde, zamanınızı düşünmeniz gerekir. SQL Azure'u kullanarak ayda bir saat veya daha fazla tasarruf edecekseniz, SQL Azure'u kullanmak çok daha uygun maliyetlidir. BÜYÜK verilerle uğraşmadıkça ve büyük bir anlam ifade etmedikçe, SQL Azure üzerinden Tablo depolama maliyet avantajları eşit değildir. –

+0

Sana bir artı +1 verdim. Her zaman maliyet ya da boyut ile ilgili değildir. Depolama tablosu oluşturmak için verilerin ayrılmasını istediğiniz çoklu kiracı uygulaması için veritabanı oluşturmadan daha kolay ve hızlıdır. – Paparazzi

-1

şey benim için sadece iyi çalıştı:

List<TableEntityType> rawData = 
    (from c in ctx.CreateQuery<TableEntityType>("insysdata") 
    where ((c.PartitionKey == "PartitionKey") && (c.Field == fieldvalue)) 
    select c).AsTableServiceQuery().ToList(); 
List<TableEntityType> sortedData = rawData.OrderBy(c => c.DateTime).ToList(); 
+5

Bu, satırları – BritishDeveloper

+0

numaralı bellekte sıralayacak. Bu, yalnızca sıralamayı değil, kapsamdaki sayfalama dahil orijinal soruyu yoksayar. –

0

Azure Depolama birincil indeksi ve ikincil endeksi olarak Satır Key olarak Bölme Key tarafından dizine sözlük sırasını varlıkları, tutar. Genel olarak senaryonuz için UserId bir bölüm anahtarı için iyi bir uyum olacağı gibi geliyor, bu yüzden her sorgu için optimize etmek için Satır Anahtarına sahip olursunuz.

Kullanıcının en sondaki istek listelerini görmesini isterseniz, istek listesi kullanıcı tarafından girildiğinde, satır anahtarının DateTime'ın Ters Zamanlı Tarih Körüğü olduğu günlük kuyruk şablonunu kullanabilirsiniz. https://docs.microsoft.com/en-us/azure/storage/storage-table-design-guide#log-tail-pattern

Kullanıcıların ürün listelerine göre sıralanmış istek listelerini görmesini isterseniz, öğe adınızı satır anahtarınız olarak alabilir ve böylece öğeler doğal olarak azure tarafından sıralanır.

Verileri yazarken, verileri sıra dışı hale getirmek ve bu farklı satır anahtarı şemalarıyla birden çok yazma yapmak isteyebilirsiniz. Kullanıcı kimliğiyle aynı bölüm anahtarına sahip olacağınız için, bu aşamada bir toplu işlem işlemini gerçekleştirebilir ve maskeleme işlemlerinin atomik olduğundan, tutarlılık konusunda endişelenmeyebilirsiniz.

Farklı satır anahtarı şemalarını ayırt etmek için, her birini const dizesi değeriyle eklemek isteyebilirsiniz. Ters kene satırları gibi, örneğin "InvertedTicks_ [InvertedDateTimeTicksOfTheWishList]" gibi bir dul dbe satır anahtarı değeri ve öğe adınızdaki satır değeri "ItemName_ [ItemNameOfTheWishList]" olur