현재 응용 프로그램의 경우 데이터베이스 변수를 비즈니스 로직에서 멀리 유지하고 데이터베이스 코드를 쉽게 바꿀 수 있으므로 모든 데이터베이스 기능을 단일 클래스에 배치하기로 선택했습니다. 다른 DBMS. 그러나 최근에 내 데이터베이스 클래스는 상당히 커졌으며 (정보 편집 : 약 53k), 일반적으로 각 요청에 대해 구문 분석되어야하기 때문에 볼륨으로 인해이 파일을 구문 분석하는 속도가 걱정됩니다.PHP : 하나의 거대한 데이터베이스 클래스 또는 여러 개의 작은 클래스?
보통 한 번에 하나의 데이터베이스 호출 (예 : 사용자 시스템 호출, 자산 시스템 호출, 시스템 호출 시스템 호출, 세션 시스템 호출 등)이 한 가지 또는 두 가지 유형으로 이루어 지므로 하나의 옵션 필자는 작업을 일련의 데이터베이스 개체 "조각"으로 분해 한 다음 함수 요청을 기반으로 런타임에 동적으로로드하는 방법을 고려했습니다.
다른 한편으로 나는 이렇게하는 것이 (a) 메모리에서 많은 양의 병렬 실행 (즉, 각 슬라이스에 이제 쿼리 메서드, 독립 쿼리 로그 등이 있음) 기존의 모든 코드를 수정하여 새로운 작은 객체를 가리 키도록 강요하거나 (b) 이미 작성된 코드로 작업하기 위해이 기능을 백 해킹 (back-hack) 할 때 상대적인 성능 손실을 야기합니다 부모의 쿼리 함수뿐만 아니라 직접 메서드 액세스 대신 장소 전체에서 __call을 갑자기 사용하여 발생하는 실적 적중률)에 영향을줍니다.
이 시나리오에서 더 정확한 행동 방침은 무엇입니까?
EDIT 추가 정보 :이 파일은 읽기 쉽도록 확장 된 SQL 모델을 사용하므로 비뚤어진 것으로 간주 될 수 있지만 현재 약 2,350 줄의 파일이 약 53kb입니다 (아직 완료되지 않았습니다).
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
~ 53kb, ~ 2350 lines, 비록 내가 확장 된 SQL을 사용하면 linecount가 비뚤어져 보일 수 있지만, 포스트를 업데이트 할 것입니다. – Dereleased
응용 프로그램이 모든 고유 쿼리에 대해 별도의 기능을 가지고 있음을 올바르게 알고 있습니까? – Mewp