起因是我们的开发者社区小伙伴要开始按照产品功能点拆分,撰写文档了。那么首先就需要有一个样例数据库。
除了这个场景之外,还想到样例数据库可以使用在其他的一些场景
- Demo 数据
- 用于我们自己开发使用的测试场景
- 用于自动化测试
- 数据库的主题是用户熟悉的概念,最好能有趣味性
- 数据库 schema 和数据量都要有一定的复杂度,这样可以更全面地用于测试。比如我们 SQL Editor 场景就需要有复杂点的 schema 和数据量,才能看出更多可用性的问题。
构建思路还是找有没有现成的数据集。大数据/机器学习那边有不少数据集,但因为没有看到 SQL 格式的,所以就需要手工处理。最后还是锁定在了 MySQL 官网上的
https://dev.mysql.com/doc/index-other.html
MySQL 官网上绝大多数的样例数据库用的都是 Oracle 的 License,唯有 Employee 数据库
https://dev.mysql.com/doc/employee/en/
用的是 Creative Commons Attribution,而且还放在了 GitHub 上。MySQL 其他几个数据库 menagerie, world, airportdb 趣味性更加强一些,但因为 License 的潜在风险就只能放弃了。
不过从主题来说 Employee 也很合适,概念大家都很熟悉,而且是公司职业场景,也和我们的用户群更加契合。同时也可以运用到 Tenant mode 的场景,因为我们可以把每一家公司的 Employoee 对应到一个 Tenant。
Employee 数据库还有一个吸引点,就是他还做了一个数据导入验证的 SQL 脚本,用来验证全部数据是否导入了。
使用了一下后,感觉还是可以改进一些开发者体验和可用性的问题。
原始数据集有 ~170 MB,员工记录有 300000 条。但一般的场景其实也不需要那么多的数据。
所以我先把原始数据集命名为了 dataset_full。然后又创造了一份 dataset_small,截取了原数据集前 10000 条员工数据,把数据量压缩到了 ~6MB。
比如 employees -> employee。虽然在表名单复数上,业界没有定论。但在 Bytebase 内部我们是采用单数形式的,我们其他的比如 API,变量命名也是用单数形式的。如果是复数,我们会加 List 的后缀,比如 employeeList。我们采用单数形式的原因是:
英文的单复数拼写规则有点复杂,如果按照语法,有些单词单复数形式是一样的,那就看不出来单复数。所以就会在语法正确和可读性上产生分歧。
用复数像 users_and_roles 就会比较别扭。
毕竟样例数据库之后我们自己的同学也会使用,所以为了知行合一,防止同学们的脑裂,也就把样例数据库的表名都改成了单数。
既然改变了表的名字,就需要重新生成 Schema 图示,顺手也把本来仓库里缺失的 View 的定义也加上了。我用的是 phpMyAdmin,因为图上的连接线是自动生成的,所以为了摆出一个看起来清晰的 schema 图,还花了一点时间。
有些文件其实已经不起作用了,就删除掉了。同时也把 SHA 的导入数据验证方式给删了,只留了 md5 的。这么做也是为了降低认知成本。
因为创建了两套数据集,所以表结构的文件是会重复的。最终还是选择了保留重复,分别放在两个目录下。原因是为了让一个目录下的内容形成闭环 (self-contained)。因为有可能用户只需要其中一份,比如那份小的数据集就可以了。
我在本地和 AWS RDS 对两份数据集按照修改后的 README 进行了测试,确保用户可以按照 README 完成。确实也发现了一个 AWS RDS 导入 Function 的问题。所以也在 README 上注明了。
云上数据库从云服务商安全性和管控性的角度考量,都会把数据库的超级用户以及其他一些功能给去掉,这往往会导致一些兼容性的问题,所以需要单独进行测试。
准备一个样例数据库,看似任务不难,但自己整个互联网找了一圈,却也没有找到一个满意的。不过 MySQL Employee 这个样例数据库还是提供了不错的基础。但即使如此,也还有不少开发者体验的点可以优化。前后光准备这个样例数据库,也花了笔者大几个小时的时间。不过你一定猜不到笔者在哪一步花了最多的时间:)
Bytebase 内部从技术栈的选型,代码的风格,内部文档,链接的组织,文章术语的大小写规范,以及标点符号格式,都有一致性的要求。自然我们也希望有一套统一的样本数据库能用于我们的技术文章输出,内部测试,Demo 数据这些场景。
我们把这个样例数据库也开源在了 https://github.com/bytebase/employee-sample-database-mysql。虽然本来基于的仓库采用了 Creative Commons License,但因为 Bytebase 所有的项目都是用的 MIT,所以就也用了 MIT。
Bytebase
Bytebase 是一款开源数据库工具, 像 GitLab 管理代码一样, 帮助 DBA 和开发者管理数据库 schema 的生命周期。
28篇原创内容
Official Account