5

Rails ve MySQL kullanıyorum ve satır sayımına dayalı bir verimlilik sorunum var.Veritabanı kaydı sayımları gereksiz depolanıyor mu?

has_many :donations numaralı Project modelim var.

Proje için benzersiz bağışların sayısını saymak istiyorum.

num_donors adı verilen projects tablosundaki bir alana sahip olmak ve yeni bir bağış oluşturulduğunda bunu artırmak iyi bir fikir mi?

Veya veritabanı optimizasyonu sayesinde benzerlik açısından benzer veya benzer olacak şekilde @num_donors = Donor.count(:select => 'DISTINCT user_id') gibi bir şey mi? Bu, user_id için dizinler ve saymak istediğim başka alanlar oluşturmamı gerektirecek mi?

Bağışlanan toplam miktarı toplamak için aynı cevap bekler mi?

cevap

10

Evet gereksizdir, ancak bunu yapıp yapmamanız durumunuza bağlıdır.

Bilinen performans sorunlarınız olmadıkça, uygulamanızdaki sayım ve toplamları hesaplayın ve bunları saklamayın. Başka bir seçiminiz olmadıkça, hesaplanan değerleri saklamayın. Çoğu durumda, buna başvurmak zorunda kalmazsınız ve yapmamalısınız. Eğer hesaplanan değerleri saklamak gerekiyorsa

aşağıdakileri yapın:

  • bunu artırarak bugüne kadar bunu saklamayın. Her güncellediğinizde sayımı/toplamı tüm verilerden yeniden hesaplayın.
  • Çok fazla güncelleştirmeniz yoksa, kodunu bir güncelleştirme tetikleyicisine numaralı telefona koyun, sayımı/toplamları güncel tutun.
  • veritabanlarındaki artıklık sorunu, numaralarına katılmadığında, yetkili olduğundan emin olmamanızdır. belgelerine, verilerinin kabul etmedikleri ve üzerine yazılabiliyorsa, yetkili kaynak olduğunu not edin.
7

Veritabanınızın boyutuna bağlı olsa da, bunlar veritabanlarının uzmanlaştığı işlem türleridir, bu nedenle hızlı olmaları gerekir. Muhtemelen erken bir optimizasyon vakası söz konusudur - toplamları kaydetmeyerek başlamalı, böylece daha basit hale getirilmeli ve gerekirse daha sonra optimize edilmelidir. Başlık sorusunu yanıtlamak için:

4

Peter ve JohnFx yanıtları ne öneriyorsun okuma performansı artırabilir veritabanı şemanızın denormalization, ama ses vardır ayrıca geliştirici yükümlülüklerini de koyarken yazma (veya ek DBMS clevers zararına) Veri kümenizdeki tutarsızlıkları önlemek için.

ActiveRecord, has_many ilişkilerinde sayımların otomatik olarak yönetilmesi için bazı yerleşik işlevlere sahiptir. Bu Railscast on counter caches göz atın.

5

Maxim'i hatırla "Bir saati olan bir adam zamanı her zaman bilir. İki saati olan bir adam asla emin değildir." Sadece türetilen numarayı depolardım:

Performans sorunları, gereksinim duyduğunuzda türetilmiş sayılar elde etmenizi engeller (bu durumda, yanıtın dizinlerden alınabileceği için sorun olmamalıdır)

ya sen programcı hata veya kasıtlı veya kazara kullanıcı eylemi ile ana tablodan kayıtları kaybediyor inanmak için nedenlerimiz var

. bu durumda, şu anda hesaplanan numarayı denetlemek için türetilmiş numarasını kullanabilirsiniz

+0

Maximi seviyorum - daha önce duymadım. Akılda kalacak :) – nfm

3

Biliyor musunuz? ActiveRecord sihrini basit bir bayrak yapar? sorusuna gelince

class ThingOwner 

# it has a column like 
# t.integer things_count, :default => 0 

has_many :things, :counter_cache => true 

end 

- evet, bu gereksiz olduğundan emin, ben zamanın things.count payı çok büyükse ve sadece eğer böyle bir sayaç eklemek istiyorum. Aksi takdirde, zamanından önce optimizasyon yapılır.

İlgili konular