使用分层结构与数据库进行交互(PHP和WordPress)

3
我经常在PHP中,特别是在WordPress插件中看到人们直接在他们的插件中编写SQL...按照我的学习方式,所有的事情都应该分层处理...这样,如果有一天某个层的要求改变了,我只需要担心更改与所有接口相关的那个层。
现在我正在编写一个用于与数据库交互的层,以便如果以后与数据库交互的方式发生变化,我只需要更改一个层,而不是我创建的X个插件。
我感觉其他人可能也曾经遇到过这种情况,我的方法可能效率低下。
我正在编写诸如:
Table
Column
Row

这使我能够使用给定的对象和特定的方法来处理它们的所有功能,创建数据库表、列和行:

$column = new \Namespace\Data\Column ( /* name, type, null/non-null, etc... */ );
$myTable = new \Namespace\Data\Table( /* name, column objects, and indexes */ );

\Namespace\TableModel.create($myTable);

我的问题是...
是否已经有人写过一些东西来提供不同层次之间的分离?
如果没有,那么我的方法从长远来看是否有帮助,或者我是在浪费时间;我应该像其他人一样分解并硬编码sql吗?
如果自己编写确实有帮助,那么我可以采取哪种方法来更有效地处理它?
2个回答

0

是的,谢谢。我已经有一段时间没有练习编程了... HTML、CSS等。过去一周我一直在努力回忆如何处理这样的问题所需的术语。 - Matt

-1

说实话,我会直接硬编码SQL,因为:

  1. 其他人也都这么做。如果WordPress想要从MySQL更改到其他数据库,那么很多部分都需要重写。如果整个系统仍然只能使用硬编码的SQL,那么为插件编写完美的层将是浪费时间。

  2. 我们生活在一个不完美的世界中。过度的抽象最终会导致性能和其他问题,而我甚至还没有考虑到。保持简单。此外,使用SQL可以从一些性能“技巧”中受益,这些技巧可能对其他系统无效。

  3. SQL是广泛接受的标准,已经可以看作是抽象层。例如,甚至有可能通过类似SQL的语法(参见FQL)访问Facebook的Graph。如果您想更改到另一个数据源,您可能会发现支持SQL语法的某些层!从这个意义上说,您甚至可以说 SQL已经是某种抽象层

但是:如果您决定使用SQL,请务必使用WordPress的$wpdb。使用它,您就处于安全的一面,因为WordPress会负责连接到数据库、形成查询等。如果有一天,WordPress决定从数据库更改为其他内容,他们将需要创建一个$wpdb层来适应新的源-以实现向后兼容性。此外,许多常规请求已经作为函数(例如$wpdb->insert())在$wpdb中,因此没有直接硬编码SQL的需求。

然而,如果您决定使用这样的抽象层:维基百科有更多信息

更新:我刚刚发现CMS Drupal使用数据库抽象层-但是他们仍然使用SQL来形成所有不同数据库的查询!我认为这非常清楚地表明了SQL已经可以用作抽象层。


很好的观点,我不会过度致力于抽象层。我仍然觉得抽象的好处足以证明编写它的必要性,部分原因是因为并不是每个人都在使用良好的编程实践,我也不应该这样做。WordPress特定原因:即使他们从未改变过MySQL,我听说像$wpdb这样的东西可能会发生变化,并且将来可能会有新的更好的与WordPress数据库交互的方式。在这种情况下,拥有那个抽象层进行更改而不是更改10-20个插件会很好。 - Matt
我意识到这并不会立即带来任何回报,并且它也有其缺点。但我会确保在这里保持良好的平衡。再次感谢! - Matt
2
强烈不同意 - 许多CMS和框架都具有数据库抽象层,其中一些提供对象到表单查询的功能(其他使用ORM)。在我看来,DB抽象是您必须执行的第一个抽象。 - Maxim Krizhanovsky
我同意你的观点,不应该因为其他人都这么做就“错误”地去做。但我也认为使用硬编码 SQL 并不是一件坏事,因为 - 正如文章所述 - 你可以把 SQL 视为一个抽象层。我非常确定 WordPress 将始终保持 $wpdb 的向后兼容性,即使他们改变了他们的数据库。使用 SQL 语法创建一个抽象层也不会那么难! - anroesti
此外,我认为使用SQL的抽象层在性能和内存使用方面表现更佳,因为它不需要为每个查询创建一个对象。此外,SQL拥有相当好的文档,并且有着庞大的用户群体 - 这意味着更多和更好的支持。 - anroesti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接