目前,我为每个数据库表构建两个类。例如,如果我有表person
,我将有类Person_List
和Person
。
从设计角度看,是不是更好?
- for
Person_List
输出Person
数组;或 - 用于输出包含表中行数组的数组。
性能方面,哪个更好?
我相信设计明智,并考虑到性能,将是(如果您坚持使用Person_List
类来表示表和Person
来表示单个记录):
- 为
Person_List
类使用Iterator
接口,因此您可以遍历表,而不需要一次拉出所有记录(在某些情况下,这应该是显著的性能增益), - 另外使用
Countable
接口Person_List
类,所以你可以计数所有的结果,如果有必要,通过直接从数据库,
这应该给你灵活性,允许你像使用数组一样使用Person_List
类对象。
如果你在使用这两个接口时仍然有问题,这里有一些解释:
- 每次执行
foreach ($table as $record)
(其中$table
是Person_List
的实例)时,Person_List
类的current()
方法将被调用(因为它是Iterator
接口的一部分-参见这里的文档),它应该返回Person
类的对象;这应该用eg。mysql_fetch_object()
; - 当您调用
count($table)
(其中$table
是Person_List
的实例)时,将调用Person_List
类的count()
方法,该方法反过来可以使用eg。mysql_num_rows()
函数返回所有结果,而不是从数据库中取出它们,然后计数(这将再次显著的性能增益),
这实际上取决于您对记录做了什么。访问记录上的列应该不会比使用数组快多少。不足以证明不使用对象
数组比对象更轻(尤其是在内存中更小),但是如果你像@Tadeck提到的那样使用Iterator
,这应该不是问题,因为你一次只有一个实例在内存中。
总之,对象几乎总是更好的设计(从接口的角度来看),但是,如果从性能的角度不确定,请对候选实现进行基准测试。如果差异不够明显,可以使用对象。
你标记了这个OOP,所以我猜你想使用对象。在这种情况下,你会想让它返回PersonRow对象,例如,在db表中表示一行的对象。看一下
- RowData网关模式
- 行数据网关模式的描述
你不应该担心性能。想出一个可靠的设计,可读性和可维护性。只有当你把你的设计付诸实践,对它进行分析,发现它不符合性能要求时,才会担心性能。