本周在 Joomla! CMS 开发中有个大新闻,即合并了对查询的大量重写。为什么?为什么要重写?因为这使得 Joomla! CMS 能够运行在许多不同的数据库上,而不仅仅是过去的 MySQL 和 MySQLi。
关注这些事情的人都知道,多年来一直有一个目标,就是让 Joomla! “与数据库无关”,也就是说允许 Joomla 在任何数据库上运行。一段时间以来,平台已经有了 Microsoft 数据库 SQLSrv 和 SQLAzure 的驱动程序。还有关于 Postgresql、Oracle、SQLite 和 PDO 驱动的合并请求。Gabriele Pongelli (Postgres)、Sudhi Seshachala 和 Hoodooku 团队(Microsoft 数据库)以及 Omar Ramos (Oracle、SQLite 和 PDO) 做了很棒的工作。如果你想要为另一个数据库(db2 有人想要吗?Drizzle?)编写驱动程序,你可以直接分叉平台然后开始工作!
下一步是什么?
那么我们接下来要做什么?在到达 2.5 之前,我们首先需要在新的数据库以及 MySQL 和 MySQLi 上对 CMS 进行大量测试。后者显然非常重要,因为我们必须完全确定那里没有任何东西被破坏。所以我们在这方面需要加大力度。
下一个问题实际上是针对扩展开发者的。你需要做什么才能说你支持多个数据库?[b]我将发布第二个博客,讨论一些具体的技术问题,但简而言之是
- 不要直接使用 MySQL 子句。
- 使用 JDatabasequery 在 setQuery 中构建你的查询。
- 如果你必须在 setQuery 中使用仅在 MySQL(或其他数据库)中可用的子句,请构建替代方案和检查。
为什么要使用其他数据库?
如果MySQL优秀且免费可用,我们为什么还要为CMS支持其他数据库呢?毕竟这对于维护CMS运行的人员来说是一项艰巨的工作和维护任务。最明显的答案是,有很多人因为使用其他应用程序或可能只是偏好那些数据库而绑定在其他数据库上。有些人也喜欢其他数据库,因为它们提供的功能。我询问了Gabriele关于Postgres有哪些特别之处。
PostgreSQL是一个ORDBMS,对象关系数据库管理系统,这个缩写意味着它是一个RDBMS,就像MySQL一样,但具有面向对象的数据库模型。
它完全由其社区开发,是“世界上最高级的开源数据库。”显然,它遵循ACID原则。
在9.0版本中,宣布了复制和热备份功能,这些对于云托管、RADIUS认证和许多其他功能非常有用,要查看完整列表,请访问https://postgresql.ac.cn/about/featurematrix
当我询问他喜欢Postgres的哪些方面时,他说:
PostgreSQL拥有一些MySQL只在特定引擎(如InnoDB)中包含的功能,但在MyISAM中却没有;事务、序列和外部键约束、类型继承以及从布尔值到IPv6和几何类型到用户定义类型的广泛支持类型是首先想到的。
关于类型继承的一个例子可以是用于连接数据库的角色或凭证:可以创建一个通用角色(如一个组)并赋予它一些权限,然后创建一个从第一个角色继承的另一个角色(如一个用户),并授予或撤销后者的其他权限。
可以定义自定义类型转换,对于C开发者来说,你可以在查询中创建自己的函数、类型和操作符。
另一个有趣的功能是可以有除了表约束之外的列约束,后者是MySQL中唯一存在的。
最后但并非最不重要的是,序列类型变量是典型“id”列中大整数的自然替代品,使用“currval”和“nextval”这样的函数更容易管理。
Sudhi讨论了为什么企业经常希望使用Microsoft和Oracle解决方案。
从企业的角度看,需求是不同的。许多企业公司在现有的与Microsoft软件栈的业务关系中投入了大量利益。他们已经有专家、资源、应用程序和流程在Microsoft栈上运行。同样,公司对Oracle数据库也有大量投资。使用开源公司可以自由选择适合他们需求的正确数据库。Joomla在企业的扩展性、ACL、大型扩展目录/应用商店方面表现很好。这里的唯一问题是,尽管Joomla的入门/采用门槛低,但企业公司仍然需要资源来管理MySQL资产资源等,当Joomla上的应用程序/服务上线时。在企业级数据库(如SQLServer、SQLAzure和Oracle)上拥有Joomla可以提升其在企业中的影响力和采用度。这意味着Joomla生态系统中所有参与者的机会更多。Joomla还支持Windows Azure Cloud,并内置了对Azure CDN的支持。还有其他几个扩展已经支持Amazon S3、Rackspace Cloud文件等。
这和支持不同服务器并没有太大区别。每个人都有他们认为有用的功能,这意味着并非每个人都使用Apache 2。数据库也是如此。
我很幸运能够在Sudhi和Gabriele工作期间与他们进行很多交流,他们都是非常伟大、积极的贡献者。Sudhi参加了许多Joomla!活动,我强烈推荐您参加他的其中一个会议。我询问了Gabriele与Joomla!开发社区合作的感受,他说:
这是一个了不起的社区,为Joomla开发的人们非常有才华,实际上,在平台源代码背后有一个我以前从未在PHP应用程序中见过的设计。
我有一些其他的想法,可能会在将来尝试添加到平台中,但现在我仅感兴趣在平台中添加PostgreSQL支持,并能够在CMS中使用它。
感谢这么多人的贡献,包括不仅仅是代码的三个主要作者,还有那些帮助测试(包括在应用程序和构建单元测试)以及提供其他反馈的人。所有这些工作也导致了基础类的真正改进,通常就是这样。这也显示了即使在没有CMS中的即时用例时,也能在平台上取得进展是多么伟大。更不用说,改进CMS的动力如何帮助使平台更强大。
这也显示了我们的架构愿景的力量,它说我们不想让Joomla仅运行在数据库X上,我们希望它运行在任何有人愿意编写驱动程序的数据库上。如果只是修改代码以适应一个数据库,而不考虑其他数据库,这将更简单,耗时也更少,但那将远远没有这么有用。