“推土机”架构是一个灰机推荐的MediaWiki数据维护方法,由灰机团队在实践中不断摸索、改进并总结归纳。目前主要的维护者是SerGawenYuee


概述

“推土机”的直观意思就是“填坑”,旨在帮助站长们提高填充数据类内容的效率并降低维护成本。

版本 数据存储 核心工具 数据库 查询语法 需要灰机updater
1.0 data页面 SMW SPARQL SMW的解析器函数
2.0 data页面(JSON) Lua MongoDB MongoDB语句

推土机2.0

参考:帮助:模块

“推土机2.0”的核心是使用更为高级,敏捷的MongoDB作为数据库,在数据内容存储上,抛弃了SMW的Graphic结构,采用了通用性更强,处理多层级关系更为灵活的JSON。相较于1.0架构,优势主要体现在:

  • 简化了rawdata从本地到线上的处理环节,对于大部分游戏提供的JSON数据,可以直接使用
  • 极大优化了查询效率,藉由MongoDB的非关系型数据库特点,查询效率极大提升,有效杜绝了SMW滥用导致的“一键炸站”情况出现(扩展阅读::这么show的吗
  • 编程更加灵敏,使用真正的程序语言Lua作为编程主体,能够实现很多解析器函数无法实现的功能。

推土机1.0

“推土机”架构1.0示意图

“推土机”1.0的目的是将维基上数据化的内容结构性的剥离,通过bot和脚本工具藉由Semantic MediaWiki来更新、维护和展示。

  • 描述、介绍、解释文字由用户通过常规方式直接在页面编辑更新。
  • 数据通过存储在对应页面的data页面,可以由管理员手动维护,也可以通过脚本和bot批量更新,提高内容的准确性和更新速度。
  • 核心是Semantic MediaWiki

架构选择

架构 上手难度 技术核心 适合的主题
1.0 中等 解析器函数
SMW语法
影视、文学、动漫类数据,以及数据层级相对扁平(特指二维)的游戏,比如日系RPG
2.0 Lua语法
MongoDB语法
大型游戏,数据结构层级复杂,常常呈现多层树桩结构的(J特指SON)

发展过程

雏形

推土机的雏形在灰机平台最早出现在黑魂维基的实验性内容更新过程之中,由Namingishard通过pywikibot将dota的相关数据整理到文章页面上,为了避免bot和脚本在更新内容时覆盖、影响到页面上已有的内容,往往需要写很复杂的正则表达式或者预留替换字符。在发觉了其中的不便之后,SerGawen在制作dota维基的时候,开始将页面存在主页面的子页面中,例如"风行者/data"。后来发现这样data页面会被计入主空间,作为文章页被feed流推送,于是决定新建一个叫做“Data”的命名空间,通过dota维基制作过程中的反复摸索,结合国外的Starbounder维基中的相关方法,最终形成了一整套数据存储、调用的方法架构。并在factorio、Civ6等维基的创建过程中不断完善。

成熟

在第一阶段,数据仍借由线下整理文本,通过符合pywikibot格式的文本导入到线上,Yuee的excel表格更新工具为这一模式带来了质变,在结合灰机的接口、参数配置重新设计为灰机数据更新器后,这一工具能够快捷、高效的读写data命名空间的内容,由于自带GUI,大大降低了使用门槛,使得一般编辑者和站点管理员也能够快速学会使用,因而提供了更多可能性。现在“推土机”架构已经走出了游戏领域,在冰与火之歌等文学、影视体裁的站点也成功得到了广泛应用。

集成的Data命名空间(ns-3500)

现在,名为“Data”的命名空间已经不需要用户自行创建,在机长管理员面板中开启了“SMW”开关后,系统会自动生成序号为3500的Data命名空间,该空间默认开启Semantic MediaWiki功能并支持上传JSON等数据表。

需要注意的是,如果开启3500命名空间之前,站点存在虚假的Data页面(即使用“Data:”开头的ns-0页面),该部分页面会被MediaWiki隐藏,无法访问并操作,但如果该页面上有SMW的内容,依然可以被查询到,这种情况需要联系灰机职员使用MediaWiki提供的清洁脚本进行维护。

MongoDB的出现

在一段时间内,灰机出现了大批以SMW为核心构建的游戏类站点,很快,SMW通过MediaWiki的解析器钩调用php来查SQL的性能劣势被无限放大,由于各种无意的滥用查询语句(主要是查询不够经济),开始导致灰机的数据库频繁宕机(连接数超限)。

在经过研究后,Reasno决定引入MongoDB和JSON来存储数据,并封装了一系列函数供用户在模块中用Lua查询。比如FF14等大型MMO类游戏的数据库,太吾绘卷等数据较多的单机游戏等均采用了这一架构。

数据整理

Excel—Updater

在灰机Updater出现之后,已经不需要用户通过命令行来操作Pywikibot,现在所有的线下工作均可以通过Excel表格的整理来实现。这一方法适用性最广。

  • 需要使用者熟悉Excel的表达式、公式或者vba脚本。

本地/文件脚本—Updater

如果本地有现成的json或者数据文件,可以直接用Updater上传或者使用本地脚本(比如Python)进行预处理。

结构化数据支持

ExternalData

  1. 对于结构简单的JSON/CSV/XML,可以使用MediaWiki的扩展ExternalData来读写操作。
    1. ExternalData还可以直接读取站外的API。

Data命名空间

详情参考:帮助:MongoDB支持
  1. 对于复杂的通用数据格式,JSON/CSV/XML/YML等可以直接保存为页面,可以利用Lua模块处理为Lua Table格式,再通过{{#invoke}}访问其中的数据。这里介绍一个实践,可参阅Dota维基使用的Trans模板,其中的数据访问存储在MediaWiki:Huiji-translation-pairs


数据获取

数据获取不在推土机架构的范畴之内,由各位各显神通自行获得,可以是表格,也可以是爬虫,也可以是API,也可以是拆包、逆向得来的源文件。