对Joomla进行数据增量备份的复杂性

这段内容讨论了在 Joomla! 内容管理系统中,定义和管理“内容”(content)的复杂性和不确定性,尤其是当涉及到跨站点同步或迁移内容时。以下是内容的详细解释:

1. 内容定义的模糊性

  • 问题的起点:内容的定义非常宽泛(loose),这导致了许多问题(a source of a lot of grief)。
  • 尝试定义内容:假设将内容定义为“由 Joomla! 内置的文章组件(com_content)管理的任何文章”。这个定义看似合理,但实际上并不充分,因为它忽略了内容的复杂性和多维度。

2. 内容的复杂性

2.1 媒体文件

  • 媒体文件的多样性
    • 文章可以包含一个或多个媒体文件(如图片、视频)。
    • 有些媒体文件可能通过“媒体字段”(如文章缩略图和正文图片)链接到文章,这些容易被识别。
    • 其他媒体文件可能嵌入在 HTML 内容中,可能有或没有元数据,这使得程序化发现变得困难。
  • 文件的历史问题
    • 文件不是数据库记录,没有历史记录,因此无法确定它们是新增的、修改过的还是之前就存在的。
    • 如果远程站点(site B)与本地站点(site A)不在同一网络中,就无法知道远程站点是否也有这些文件。

2.2 分类和权限

  • 分类的复杂性
    • 文章属于分类,分类有访问级别和权限,这些权限依赖于用户组。
    • 无法确定两个站点上是否存在相同的分类、访问级别和用户组,也无法确定它们的 ID 映射关系。
  • 权限的复杂性
    • 用户组是组件级别基础权限的容器,每个分类都可以为每个用户组提供不同的权限。
    • 这使得权限管理变得极其复杂,尤其是当分类和用户组的层级结构不同。

2.3 自定义字段

  • 自定义字段的复杂性
    • 文章可以有自定义字段,这些字段可以属于自定义字段组。
    • 自定义字段和字段组与特定组件和分类相关联,而每个自定义字段的值又与特定文章相关联。
    • 这导致了多维度的复杂性,很难确定哪些内容是新增的或修改过的,尤其是在无法与远程站点通信的情况下。

2.4 用户和权限

  • 用户和权限的关联
    • 文章、分类、自定义字段等都与用户相关联,因为 Joomla! 需要知道谁创建、修改或签出了这些内容。
    • 两个站点之间没有用户映射关系,也无法查询远程站点的用户信息。

2.5 权限存储问题

  • 权限存储的复杂性
    • 权限存储在 #__assets 表中,这是一个树形结构。
    • 无法直接将一个站点的权限记录移植到另一个站点,即使有完整的分类、用户组、访问级别和用户 ID 映射,也需要定制代码来处理。

2.6 标签和 UCM

  • 标签的复杂性
    • 标签不是以文本形式存储,而是以 ID 形式存储。
    • 需要知道每个站点上哪些标签 ID 对应哪些标签文本,才能确定是否有新增或修改的标签。
  • UCM 的复杂性
    • Joomla! 有一个名为 UCM(Universal Content Model)的辅助结构,用于处理标签、历史记录和智能搜索。
    • 需要知道 UCM 的状态和属性,这些属性不会出现在用户界面中,但可能会影响内容的变更。

2.7 格式化和模板

  • CSS 格式化问题
    • 文章的格式可能依赖于模板中的 CSS。
    • 无法期望这种格式化能够在两个站点之间自动迁移。

2.8 扩展和跨链接

  • 扩展内容的复杂性
    • 文章可能包含来自其他扩展的内容,例如跨链接到特定菜单项、组件的深层链接、插件短代码或嵌入模块。
    • 确定哪些内容是新的或修改过的,需要分析两个站点上安装的所有扩展及其内容定义。
    • 这几乎是不可能的,因为每个扩展都需要定制代码来处理。

3. 跨站点内容迁移的困难

  • 问题的演变
    • Joomla! 1.5 时,内容迁移相对简单,只要处理媒体文件、分类名称匹配和站点间通信即可。
    • Joomla! 1.6 引入了自定义权限、用户组、访问级别和嵌套分类,问题变得更加复杂。
    • Joomla! 3.2 引入标签后,问题进一步复杂化。
    • Joomla! 3.7 引入自定义字段后,确定哪些内容是新的或修改过的变得完全不可预测,使得开发可用的解决方案变得几乎不可能。

4. 解决方案的局限性

  • 人工处理的必要性
    • 由于内容的定义和变更检测是非确定性的,人工手动决定哪些内容是新的或修改过的,并手动在两个网络隔离的站点之间迁移,可能是唯一可行的方法。
  • 完整克隆的局限性
    • 如果只需要站点 A 的完整克隆,可以备份整个站点并恢复到站点 B,但这需要手动传输备份文件,因为站点 B 的网络与互联网完全隔离。

5. 问题的普遍性

  • 其他 CMS 的类似问题
    • 这个问题不仅存在于 Joomla!,WordPress 也存在类似问题。
    • 作者推测,基于 Drupal 的内容组织方式(内容图节点)和对 Drupal 7 的了解,Drupal 也可能存在类似问题。
  • 内容管理的普遍挑战
    • 一旦内容不仅仅是简单的文本,而是包含多种元素(如媒体文件、自定义字段、权限、标签等),确定什么是内容以及它是否发生了变化就变得越来越困难。

总结

这段内容强调了在 Joomla! 中,内容的定义和管理极其复杂,尤其是在跨站点迁移或同步时。由于内容的多维度和依赖关系,很难确定哪些内容是新的或修改过的,这使得自动化解决方案几乎不可能实现。作者认为,人工干预可能是唯一可行的解决方案,除非接受站点 A 的完整克隆。