当前,我为每个数据库表构建两个类。 例如,如果我有表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,这应该不是问题,因为一次只在内存中有一个实例。
总之,从接口的角度来看,对象几乎总是一个更好的设计,但是,如果从性能的角度不确定,请对候选实现进行基准测试。如果差异不够明显,请使用对象。