Hangi yaklaşım bu durumda almalıdır?

1 Cevap

Ben Kimlik Harita deseni ile veri Mapper deseni hayata geçirdik. Kısacası: Ben veritabanından 2000 nesneleri olmasını istediğiniz zaman, mapper zaten nesneler oluşturulan başvurular içeren bir karma haritada karşı sonuç kümesini denetler. Id karma haritada zaten ise, eski nesne yerine dönüş diziye eklenir. Aksi takdirde yeni bir nesne oluşturulur ve dönüş diziye eklenir. Return array 2000 nesneler içerir.

Not: Bu sayılar teorik vardır! Platform son derece uğrak olabilir, bu nedenle bu dakikada hatta ikinci birçok kez oluşabilir.

Soru: seçenek, neden daha iyi ve?

A) veritabanındaki tüm nesneleri 2000 al. Kayıt kümesi (2000 satır) üzerinde yineleme ve kimlik haritada karşı her kimliği kontrol. Bu orada varsa, nesne diziye kimlik haritanın başvurulan nesnesi ekleyin. Eğer değilse, yeni bir nesne oluşturmak ve sonuç diziye ekleyin.

B) kimlik harita tüm id dışlayan bir (belki BÜYÜK) sql sorgusu oluşturun. Yeni nesneler için sadece veri içeren bir kayıt kümesi olsun. Her satır için kimlik haritayı kontrol etmeden yeni nesneler oluşturun. Sorguyu oluşturmak için dize birleştirme işlemleri bir çok birleştirir, ama karma harita aramalarının bir sürü kaydedebilirsiniz.

Which approach would you take? (yes I know, I should just implement both versions and make a performance test, but maybe someone can answer this from practical experience)

1 Cevap

I'd go with B.

Ben bu karmaşık dize birleştirme alacağını sanmıyorum. Lütfen kimlikleri düz dizi tuşları varsayarsak, sadece yapabileceği:

$ids   = implode(',', array_keys($hashmap));
$query = sprintf('SELECT * from records WHERE id NOT IN (%s)', $ids);

Gerçi sorgu dizesi için bazı sanitizasyonunun eklemek isteyebilirsiniz.

Zaten bir HashMap için SplObjectStorage kullanıyorsanız, saklı nesneleri kimlikleri almak için harita üzerinde yineleme olurdu. Zaten orada öğelerin miktarı ve almak için miktarına bağlı olarak, A veya B Değişir ile daha iyi olabilir. Ama SplObjectStorage ile bu örneğin, zaten doğal olarak halledilir gibi zaten mevcut nesneleri takmak hakkında rahatsız olmazdı

$map = new SplObjectStorage;
$one = new StdObject;
$map->attach($one);
$map->attach($one);
$map->count(); // returns 1

Yani, evet. Ben bir kıyaslama soru ve belirli bir senaryoya bağlı sanırım.