我的想法:
由于各种原因,我绝对鄙视存储过程:成本、可伸缩性和兼容性。
成本:我可以用一台好的 MySQL 服务器的成本获得 2-3 台好的轻量级 Web 应用程序服务器。
可扩展性:当然我可以缓存查询结果,但是当使用存储过程时,我失去了获得更精细的缓存粒度的机会,而且它将应用程序与始终使用 MySQL 联系起来(谁有钱从MySQL到别的东西?)
兼容性:在某些时候 list_foo_widgetsByUser() 存储过程可能不适合客户端 #123 的需求。修改 list_foo_widgetByUser() 的签名将是自杀……所以我必须编写一个新的 sproc cl123_list_foo_widgetByUser(),这样会导致疯狂或杀人的 DBA。
我的解决方案:
从应用程序的存储库中提取模型并将它们放入外部存储库。然后,每个应用程序都会有一个指向外部存储库的 models/Base 子目录。然后在前面放置一个简单的工厂方法,例如 GetModel("FooWidgets"),它将 baseFooWidget 类作为实例或应用程序特定的子实例返回。这将允许单个应用程序继承 FooWidget 的类或与 Liquabase 等工具结合使用,从而允许更大的可变性基础。
我脑后有个声音说这太容易了……我在这里错过了什么?
参考资料:我知道 PHP Kohana 框架在这些方面做了一些事情,以允许应用程序设计人员用附加功能包装 Kohana 的基本库,如果 PHP 可以做到,我看不出任何其他语言有问题。