PHP: Bir dev veritabanı sınıfı ya da birkaç küçük sınıfları?

0 Cevap php

Geçerli uygulama için ben şimdiye kadar başka bir DBMS geçmek gerek varsa bana veritabanı kodunu değiştirmek uzak iş mantığı ve kolayca veritabanı kodunu tutmak için izin verir gibi, tek bir sınıfın tüm veritabanı işlevselliği yer seçtiği yazıyorum . Ancak, son zamanlarda benim veritabanı sınıfı oldukça büyük (bilgi için DÜZENLEME: yaklaşık 53k) haline gelmiştir ve genellikle her istek için ayrıştırılması gerekir çünkü ben nedeniyle hacminin bu dosyayı ayrıştırma hızı endişeleniyorum.

Genellikle veritabanı aramaları sadece bir ya da belki iki, farklı "Türleri" yapılır (örneğin, kullanıcı sistem çağrıları, varlık sistem çağrıları, harita sistem çağrıları, oturum sistem çağrıları, vb) herhangi bir zamanda, bu yüzden düşündüğünü bir seçenek olduğunu veritabanı nesne "dilim" bir dizi içine görevleri kırma ve ardından dinamik fonksiyonları talepleri doğrultusunda çalışma zamanında bu yükleniyor.

Öte yandan, ben bunu yaparken (a) paralel bellekte yürütme (yani, her dilim şimdi bir sorgu yöntemi, bağımsız bir sorgu günlük, vb vardır) yanı sıra beni zorluyor büyük miktarda yol açacağını da endişeliyim Zaten örneğin (yazıldığı kod ile çalışmak için bu işlevselliği geri kesmek gibi, yeni, daha küçük nesneleri işaret veya (b) göreceli performans kayıplarına neden tüm varolan kodunu değiştirmek için geri ebeveynin sorgulama için her dilim nokta var işlevleri yanı sıra aniden kullanılarak oluşacak performans isabet __) yerin yerine direkt yöntem erişim üzerinde her diyoruz.

Bu senaryoda eylem daha doğru ders nedir?

Daha Fazla Bilgi için EDIT: Ben okunabilmesi için genişletilmiş SQL modelini kullanmak gibi bu örneğin, çarpık kabul edilebilir, ancak dosya, şu anda yaklaşık 2.350 hatları (ve o bitmiş değil) yaklaşık 53kb olduğunu

SELECT
    foo,
    bar,
    baz
FROM
    someTable st
    LEFT JOIN someOtherTable sot
        ON st.id = sot.stId
WHERE
    cond > otherCond

70 sorgulama fonksiyonları, çok az çakışma ile bazı benzersiz görevi yerine her biri, (ben iki şaşırtıcı benzer sonuç kümelerini gerekirse ben sadece her zaman ihtiyacım var ve aynı sorguları yeniden yok ne sayabilirsiniz) vardır.

DÜZENLEME: Örnek fonksiyonu:

public function alarm_getActiveAlarmsByAsset($tier, $id) {
    if (    !Redacted::checkNumber($tier, $id) 
        ||  $id < 0 
        ||  $tier > Redacted::ASSET_LOWEST_TIER 
        ||  $tier < Redacted::ASSET_TIER_CUSTOMER
    ) {
        return false;
    }

    $sql = "
        SELECT
            alarmId,
            alarmTime,
            server,
            source,
            reason,
            train,
            server_sites.siteId AS `siteId`
        FROM
            alarm_alarms
    ";

    $join = '';

    switch ($tier) {
        case Redacted::ASSET_TIER_CUSTOMER:
            $join = '
                LEFT JOIN red_campus
                    ON red_campus.campId = red_site.campId
            ';
        case Redacted::ASSET_TIER_CAMPUS:
            $join = '
                LEFT JOIN red_site
                    ON red_site.siteId = server_sites.siteId
            ' . $join;
        case Redacted::ASSET_TIER_SITE:
            $join = '
                LEFT JOIN server_sites
                    ON server_sites.servId = alarm_alarms.server
            ' . $join;
    }
    $table = isset(self::$dbTierMap[$tier + 1]) ? self::$dbTierMap[$tier + 1]['table'] : 'server_sites';
    $field = isset(self::$dbTierMap[$tier + 1]) ? self::$dbTierMap[$tier + 1]['parent'] : 'site';
    $sql .= $join . "
        WHERE
                ackId IS NULL
            AND {$table}.{$field}Id = {$id}
    ";

    $r = $this->query($sql);

    if (!$r) {
        return false;
    }

    $alarms = array();
    while ($alarm = mysql_fetch_assoc($r)) {
        $alarms[] = $alarm;
    }
    return $alarms;
}

0 Cevap