什么是数据播种以及为什么我们需要它
流线型开发过程对于任何软件公司来说都至关重要,尤其是像Rise这样快速增长的公司。使用生产数据作为应用程序初始数据集的工程师可能会严重影响性能。他们可能正在处理敏感的客户信息,这些信息可能需要增加额外的清洗步骤而延长处理时间。此外,由于各自国家的潜在限制性法律,生产数据可能会阻止位于其它地区的工程师访问数据。最后,当其他工程师需要为其功能添加新的SQL语句时,他们可能很难更新数据库备份文件。因此,管理初始数据集变得非常困难,而且非常耗时。
拥有数据播种机制可以使性能测试和数据库管理更加准确、高效和可管理。作为一名工程师,你可能希望应用程序从已经装载并清洗的最小数据集开始,或者你可能需要一组特定的数据来进行测试。无论哪种情况,你都已经到达了一个称为数据播种的过程。从长远来看,一组易于管理的合成数据肯定会改善你的开发过程。
如何填充数据库
在研究Rise的解决方案时,我们发现了一些有趣的方法来填充数据库以进行开发。最常见的方法是直接从生产环境检索数据。但这并不是一个理想的开发体验,因为可能会涉及PII(个人身份信息)数据。
另一种方法是使用SQL备份文件,其中包含表结构的记录和数据库中的数据——但该方法也不够理想,而且可能难以管理。例如,当你的服务具有多个微服务时,由于表之间的复杂关系,你的数据库可能会以出现数据完整性问题而告终。
现在,一些简单的可选方法是使用第三方库(如“Faker”)来生成虚拟数据,或者仅通过调用API调用来创建数据库。
为了使开发过程更具效率,数据播种应该是可读的、可共享的、易修改的,并且需要生成没有PII的真实数据。为了满足这些需求,我们最终使用typeScript创建了一个框架,混合使用了SQL语句和API。
数据播种架构
通过这种方法,我们可以使用“引导 SQL语句”为每个服务保留最少的引导数据,并且可以发送多个HTTP请求来生成特定数据集的记录。
使用此过程为开发团队提供了三个主要益处:
因为我们指向的是真实的API端点,所以不需要关心数据库约束或表关系(与在SQL中添加语句的做法截然不同)。
只需简单地创建一个新的API函数来生成初始数据,就可以更容易地更新新特性。脚本也变得具有很高的可读性,尤其是与一个SQL文件中的无数行相比,这些行读起来可能很乏味。
脚本是从命令行运行的,只要一个命令可以随时运行。
1. 引导SQL语句
引导语句做什么?这个装载器是在所有服务启动时运行的第一段代码,负责生成发送给API请求所需的最小数据集。因此它充分依赖于你的服务或业务逻辑。例如,在Rise中,为了进行API调用以生成组织和用户表,支持提供者的授权标记应该与数据一起传递。所以,引导包含一个用于创建支持提供者用户的语句。
2. 对应编码
这个简单的代码片段将清空组织表,并且创建一个具有组织的支持提供者用户。
TRUNCATE organizations RESTART IDENTITY CASCADE;
— Insert a Organization into Organization table
— Insert Support Role User into User table
— Insert a Role into that user
— Code is needed below
3. API请求
我们目前使用Axios产生HTTP请求。Axios是一个基于promise的HTTP客户端,用于浏览器和Node.js,可以简单发送异步请求并执行CRUD操作。它通过在发送这些请求时提供自动JSON字符串化来实现这一点,而“Fetch API”没有提供这种功能。总之,axios是一个轻量级库,提供了许多有用的功能。
4. 对应编码
在本节中,你将向项目中添加Axios,并生成可以创建组织的API函数。
要将Axios添加到项目中,运行以下命令以安装Axios:
$ npm install axios
在TypeScript项目的src文件夹中,创建一个名为organization.ts的新组件。
将以下代码添加到该组件中:
首先,要导入axios和env,以便两者都可以在组件中使用。然后创建一个名为createOrganization的异步函数来执行POST请求。
之后使用axios.post(url、data、option)获得一个promise,该promise返回一个响应对象。第二个参数“data”应该包含创建Organization记录所需的实际数据。这里好处是,当作为第二个参数传递给POST函数时,axios会自动将JavaScript对象序列化为JSON,因此我们就不需要再做处理了。
结论
总而言之,拥有数据播种管理工具对于开发高质量软件非常重要,因为它有助于提高数据安全性,增加组织对数据的可访问性,减少数据冗余,并提供更好的数据完整性和数据一致性。通过实施这个相对简单的过程,大大提高了我们在Rise的效率和生产力。
原文:https://medium.com/rise-engineering/seeding-a-database-for-development-ac414f2134bc
声明:本文由CSDN翻译,转载请注明来源。