php数据库行,关于php:OOP:一类用于数据库表,一类用于数据库表行

当前,我为每个数据库表构建两个类。 例如,如果我有表person,则将有类Person_List和person。

从设计角度来看,是否更好

为Person_List输出person数组; 要么

使其输出包含表中行数组的数组。

性能方面,哪个更好?

我认为,从设计角度考虑并考虑到性能,将是(如果您坚持使用Person_List类代表表,而Person代表单个记录):

对Person_List类使用Iterator接口,因此您可以遍历表而无需一次提取所有记录(在某些情况下应该会显着提高性能),

此外,对于Person_List类使用Countable接口,因此如果需要,您可以通过直接从数据库获取计数来计算所有结果,

这应该给您灵活性,并允许您类似于数组使用Person_List类对象。

如果您在使用这两个接口时仍然遇到问题,这里有一些解释:

每次执行foreach ($table as $record)(其中$table是Person_List的实例)时,都会调用Person_List类的current()方法(因为它是Iterator接口的一部分-请参见此处的文档) ,应返回Person类的对象;这应该使用例如发生。 mysql_fetch_object();

当您调用count($table)(其中$table是Person_List的实例)时,将调用Person_List类的count()方法,而该方法又可以使用例如。 mysql_num_rows()函数返回所有结果,而不是从数据库中提取结果然后进行计数(这将再次显着提高性能),

从内存的角度来看,Iterator将使他获得性能提升。但是,这可能会降低迭代成本。

@AdamWagner:这里的问题可能是数据库中的记录数。如果该数字很大,那么除了仅一次获取记录而不是一次获取所有记录,可能别无选择。

如果是这样,那么通常这是正确的解决方案。有时,额外的用户空间调用(对于非常高的迭代次数)的开销可能令人惊讶。

我将使用具有10000个条目的表尝试这些建议。

@Dave:您是否必须一次遍历所有记录?

不,每页大约50行。我只是担心每个页面加载都会导致50个数据库调用。如果我错了,请纠正我。

@Dave:您不必担心-只有一个查询仅执行一次(当然,如果不再次调用),并且您仅可以像通常的做法那样分别获取每一行,例如while($row=mysql_fetch_array($res)) {...。该函数仅使用MySQL的一些低级API提取一条记录,而不执行另一条查询。

我知道了。感谢您澄清这一点。

您标记了此OOP,所以我想您想使用对象。在这种情况下,您希望它返回PersonRow对象,例如代表db表中一行的对象。看一下

RowData网关模式

行数据网关模式的说明

您不必担心性能。设计出可读且可维护的坚固设计。当您将设计付诸实践,对其进行了概要分析并发现它不满足性能要求时,只会担心性能。

这实际上取决于您对记录的处理方式。使用数组访问记录中的列的速度不应该快(有多少?)。不足以证明不使用对象

数组比对象更轻(尤其是在内存上要小),但是如果像@Tadeck所提到的那样使用Iterator,这应该不是问题,因为一次只在内存中有一个实例。

总之,从接口的角度来看,对象几乎总是一个更好的设计,但是,如果从性能的角度不确定,请对候选实现进行基准测试。如果差异不够明显,请使用对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值