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;
}