PHP:一个大型数据库类还是几个较小的类?
对于我正在编写的当前应用程序,我选择将所有数据库功能放在一个类中,因为它允许我将数据库代码远离业务逻辑,并在需要切换到其他DBMS时轻松替换数据库代码。然而,最近我的数据库类变得相当大(EDIT for info:大约53k),我担心解析这个文件的速度,因为它的容量太大了,因为通常每个请求都必须解析它 通常,在任何给定的时间,只进行一个或两个不同“类型”的数据库调用(例如,用户系统调用、资产系统调用、映射系统调用、会话系统调用等),因此我考虑的一个选项是将任务分解为一系列数据库对象“切片”然后在运行时根据函数请求动态加载这些函数 另一方面,我担心这样做会(a)导致内存中大量并行执行(即,每个片现在都有一个查询方法、一个独立的查询日志等),并迫使我修改所有现有代码以指向新的较小对象,或者(b)导致相对性能损失,因为我对该功能进行了回击,以使用已编写的代码(例如,让每个切片指向父级的查询函数,以及突然在所有地方使用_调用而不是直接方法访问导致的性能损失) 在这种情况下,更正确的做法是什么 编辑以获取更多信息:该文件大约53kb,目前约有2350行(尚未完成),尽管这可能被认为是不正确的,因为我使用扩展的SQL模型来提高可读性,例如PHP:一个大型数据库类还是几个较小的类?,php,performance,oop,optimization,Php,Performance,Oop,Optimization,对于我正在编写的当前应用程序,我选择将所有数据库功能放在一个类中,因为它允许我将数据库代码远离业务逻辑,并在需要切换到其他DBMS时轻松替换数据库代码。然而,最近我的数据库类变得相当大(EDIT for info:大约53k),我担心解析这个文件的速度,因为它的容量太大了,因为通常每个请求都必须解析它 通常,在任何给定的时间,只进行一个或两个不同“类型”的数据库调用(例如,用户系统调用、资产系统调用、映射系统调用、会话系统调用等),因此我考虑的一个选项是将任务分解为一系列数据库对象“切片”然后在
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;
}
public function alarm\u getActiveAlarmsByAsset($tier,$id){
如果(!修订::检查编号($tier,$id)
||$id<0
||$tier>修订::资产\最低\层
||$tier<修订::资产层客户
) {
返回false;
}
$sql=”
选择
alarmId,
警报时间,
服务器
来源
原因
火车
服务器_sites.siteId为`siteId`
从…起
警报
";
$join='';
交换机($层){
案例修订::资产层客户:
$join='1
左入红濸校园
在red_campus.campId=red_site.campId上
';
案例编辑::资产层校园:
$join='1
左加入红濸站点
在红色的\u site.siteId=服务器\u sites.siteId上
“.$join;
案例编辑::资产层网站:
$join='1
左加入服务器\u站点
在服务器上\u sites.servId=alarm\u 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。“
哪里
ackId为空
和{$table}.{$field}Id={$Id}
";
$r=$this->query($sql);
如果(!$r){
返回false;
}
$alarms=array();
而($alarm=mysql\u fetch\u assoc($r)){
$alarms[]=$alarm;
}
返回$alarms;
}
不知道db scheme很难判断,但维护几个类总是比维护一个大类容易(例如每个逻辑实体一个类/db表)
您不必担心解析时间,因为对数据库的请求(以及任何网络请求)总是需要更长的时间在不知道数据库方案的情况下很难判断,但是维护几个类总是比维护一个大类(例如,每个逻辑实体/db表一个类)更容易
您不应该担心解析时间,因为对数据库的请求(以及任何网络请求)总是需要更长的时间如果您担心解析时间,而不是代码质量,您可以使用一些编译器缓存,例如 然而,如果你有一个大类,你很可能应该把它重构成更小的类,只是为了可读性。如果您无法在类中轻松找到所需内容(例如,修改它),那么它可能太大而无法维护。
如果您决定重构,请记住,可维护性和代码质量远比执行速度重要(无论如何,数据库I/O比执行代码慢)。如果您担心的是解析时间,而不是代码质量,您可以使用一些编译器缓存,例如 然而,如果你有一个大类,你很可能应该把它重构成更小的类,只是为了可读性。如果您无法在类中轻松找到所需内容(例如,修改它),那么它可能太大而无法维护。
如果您决定重构,请记住可维护性和代码质量远比执行速度重要(无论如何,数据库I/O比执行代码慢)。通常,维护许多小型类更容易。对于MySQL(主要用于PHP),有几个类生成器可用:
也许你可以在那里找到新的想法。通常,维护许多小班比较容易。对于MySQL(主要用于PHP),有几个类生成器可用:
也许你可以在那里找到新的想法。据我所知,你的数据库类基本上包含了在整个应用程序中进行的所有可能的硬编码查询 实现数据库层抽象的更好方法是将查询抽象为内部一致的格式,并使用模型和数据库
$customer = $Customer->find(array(
'fields' => array('name', 'id'),
'condition' => array('ssn' => $ssn)
));
class Customer extends BaseModel {
public $table = 'xe_a3_cstmr';
public $schema = array(
'name' => 'ze_42_nm',
…
);
}
SELECT `xe_a3_cstmr`.`ze_42_nm`, `xe_a3_cstmr`.`…` FROM `xe_a3_cstmr`
WHERE `xe_a3_cstmr`.`ssn` = 123235;