几年来,我一直在做一个新的项目,以同样的方式做事。然而,我第一次不断地想到scalability and performance的application code和database。
因此,在过去的时间里,我非常乐意insert一个新行,然后获取last_insert_id,然后通过在使用的持久性框架中调用getObjectById(id)方法将其转换为object。我发现这是一个很好的实践,因为它将确保您正在准确地返回存储在数据库中的内容,并且在那里并随后会发现任何错误,而不是下次您请求对象时。
另一种方法是,由于前面有构建对象所需的所有数据,因此只需根据所提供的数据创建新对象,并在语句验证为完整后只设置objectId。我一直觉得仍然有一些未知数是可以发生的,如果数据库中有任何triggers以任何方式转换数据,那么您的状态就会不匹配,这是不好的。
但是,纯粹考虑性能,我显然是通过运行多个queries来创建添加了overhead的对象(insert + select)而受到影响的,我希望使应用程序尽可能地成为fast和secure。
我的问题是,对于performance、scalability、security以及3之间的权衡,最合适的方法是什么?
发布于 2014-05-08 05:09:28
当您的系统不能满足其功能要求时,您的性能就会出现问题。
因此,除非您的用户正在抱怨,或者您未能满足服务级别协议,否则您没有性能问题。
在您的情况下,额外的"insert"/"select“不太可能涉及到对最终用户来说明显的开销,或者根据系统的总体性能来衡量。
毕竟,无论如何,您可能会在某个时候插入数据,并且对不到一毫秒前插入的对象调用select不会涉及任何数据库I/O。事实上,在“提交”工作之前,不会因为IO活动而导致任何延迟。更早地插入将使数据库有机会在提交之前记录您的更改,因此您的进程实际上可能比其他方法更快。
“如果它没有坏,就不要修理它”
发布于 2014-05-08 07:58:45
首先,@JamesAnderson的回答指出了一些非常好的观点。我也认为你在这一点上对表演有不必要的偏执。
说到你的问题,我的做法通常不一样。我通常先创建类的实例,然后使用像$obj->save()这样的方法将数据插入到数据库中;但是这样做实际上取决于您设计数据库和类的健壮程度,而不是将数据插入到数据库中,然后再次加载数据并创建基于这些数据的类实例。
例如:
setter?或者您是否通过public访问器公开了任何重要的类属性,在这些属性中它们可能被修改得失控?NULL值,而不是失败操作?或者,您是否为某些字段设置了一些默认值,这些字段在将来可能并不明智,也可能会出现问题?上面的列表可能要长得多,但关键是,如果您可以信任对象中的数据,并且可以信任您的数据库,它将插入正确的数据,或者在任何其他情况下都会失败--那么就不会返回任何InsertID,这是失败的迹象;如果您在设计和实现中遇到了这些问题,那么您就不需要插入数据,然后再加载数据以确保数据的完整性。
https://softwareengineering.stackexchange.com/questions/238333
复制相似问题