對於我正在編寫的當前應用程序,我選擇將所有數據庫功能放入單個類中,因爲它允許我將數據庫代碼從業務邏輯中分離出來,並且如果我們需要切換到另一個DBMS。然而,最近我的數據庫類已經變得相當大(信息編輯:大約53k),並且由於它的體積,我擔心解析這個文件的速度,因爲它通常必須針對每個請求進行解析。PHP:一個巨型數據庫類或幾個較小的類?
通常在任何給定的時間只有一個或者兩個不同的「類型」的數據庫調用(例如,用戶系統調用,資產系統調用,地圖系統調用,會話系統調用等),因此一個選項我正在考慮將任務分解爲一系列數據庫對象「切片」,然後根據函數請求在運行時動態加載這些任務。另一方面,我擔心這樣做會導致在內存中大量的並行執行(也就是說,每個片現在具有查詢方法,獨立的查詢日誌等)以及強迫我修改所有現有代碼以指向新的較小對象或(b)導致相對性能損失,因爲我在此功能中反向使用已編寫的代碼(例如,使每個切片指向後面到父母的查詢功能以及由於突然使用__呼叫而不是直接訪問方式而導致的性能問題)。
在這種情況下更正確的行動方案是什麼?
編輯更多信息:該文件大約53kb,目前有大約2,350行(並且沒有完成),但這可能會被認爲是傾斜的,因爲我使用擴展的SQL模型來提高可讀性。
SELECT
foo,
bar,
baz
FROM
someTable st
LEFT JOIN someOtherTable sot
ON st.id = sot.stId
WHERE
cond > otherCond
有70個查詢功能,每一個執行一些獨特的任務,很少重疊(如果我需要兩個驚人相似的結果集,我可以簡單地忽略什麼,我不需要每次都和重用相同的查詢)。
編輯:實例功能:
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;
}
「相當大」有多大,並且可能沒有通過更好地重用代碼來優化內部類的可能性? – deceze 2010-06-22 22:59:15
〜53kb,〜2350行,雖然linecount可能會被視爲傾斜,因爲我使用擴展SQL - 將更新後。 – Dereleased 2010-06-22 23:00:41
我是否正確理解,您的應用程序對每個唯一查詢都有單獨的功能? – Mewp 2010-06-22 23:11:46