4-数据存储和可视化
结构化数据存储
LibianCrawler 将清洗后的结构化数据采用 增量更新 的方式存储到 PostgreSQL 数据库的 清洗结果专用表 中,确保数据管理和访问的高效性。
在数据清洗完成后,我们使用 Kysely 框架将 清洗结果数据 插入或更新(Insert or Update) 到 PostgreSQL 数据库中的 清洗结果专用表 中。
Why Kysely
Kysely 是一个类型安全的 TypeScript SQL 生成工具。
Kysely 通过 TypeScript 实现类型安全,保证了 以下三者 保持一致:
- 清洗+合并后的服务层对象属性
- 数据库持久层对象属性
- 数据库表的列和索引
以下是数据更新的具体规则:
- 当数据库中不存在新数据的 ID 时:插入一条新的记录。
- 当数据库中存在旧数据但与新数据不一致时:更新旧数据为新数据。
- 当旧数据和新数据一致时:不会进行任何更改。
这种增量更新机制确保了数据保持最新,并减少重复存储,从而提升系统性能。
pandas/polars 笑传
曾经做过一个项目,jupyter 下面有几十个 csv 和 excel 文件,而我根本找不到到底是哪个脚本输出了它们...
现在,通过强行限制使用数据库 ID 更新存储,可以确保结果数据文件不会拉的到处都是。
自动化数据库迁移
响应新清洗需求时,我们使用 Kysely Migrations 进行数据库迁移,确保代码变更与数据库模式同步。
具体操作包括:
- 新建结果表:当需要存储新的数据格式时,我们可以通过定义迁移脚本快速创建对应的数据库表。
- 添加新列:在现有表中新增字段以适应新的数据需求,Kysely Migrations 会自动处理列的创建和类型验证。
迁移过程完全自动化,系统检查并运行必要操作,确保开发环境与生产环境一致性,减少手动错误。
非结构化数据存储
对于非结构化数据(如图片、音频和视频),LibianCrawler 使用 MinIO 进行存储。
Why MinIO
MinIO 是一个高性能的对象存储服务,非常适合处理大量非结构化数据。
具体流程如下:
- 数据上传:在数据采集阶段,非结构化数据被直接上传到 MinIO 存储系统中。
- 元数据记录:为了便于后续管理和检索,相关元数据(如文件名称、存储位置等)会被记录在数据库中。
这种分离存储的方式既保证了非结构化数据的高效访问,又保持了元数据的结构化管理,从而实现了资源的优化利用。
数据可视化: NocoDB View + MinIO CDN
我们利用 NocoDB 的视图功能,并将 MinIO 作为内容分发网络(CDN),以高效展示结构化与非结构化数据。
Why NocoDB
LibianCrawler 支持 NocoDB 的兼容性。NocoDB 是一个开源的无代码数据库前端工具,可以帮助用户轻松实现数据的可视化、编辑和协作。
NocoDB 可以与外部数据源进行深度集成。例如,它能够读取 LibianCrawler 清洗结果 schema 中的所有表, 并将其展示在 Web 界面中,且可以自动检查 schema 更新。因此它实现了数据的高效预览。
通过 NocoDB,用户可以将结构化数据转换为直观的可视化形式,其主要功能包括:
- 多样化的可视化方式:支持以表格、画廊、看板等多种形式展示数据,便于用户快速理解和分析信息。
- 强大的查询器功能:NocoDB 提供傻瓜式的 条件、排序和分组 查询器,即使是 没有编程经验 的新手也能轻松上手,高效完成数据筛选和分析。
- 片段展示: 用户可以将经过条件查询后的特定数据集片段分享给无需登录的外部访问者。同时,未在查询结果中的数据不会被泄露,确保数据安全性。
- 便捷的数据导出: 用户能够轻松地将数据导出为 CSV、Excel 格式,以满足不同的需求和应用场景。
总结
LibianCrawler 的数据存储和可视化模块通过以下方式为用户提供高效、直观的体验:
- 结构化数据管理:采用 PostgreSQL 数据库进行结构化数据的存储,结合 Kysely 框架实现高效的增量更新。
- 非结构化数据处理:使用 MinIO 对象存储系统来处理非结构化数据,并通过元数据库记录相关信息。
- 可视化与协作:支持 NocoDB 工具,提供多样化的数据可视化方式和实时更新功能,大幅提升了数据管理效率。
这种模块化设计不仅保证了系统的灵活性和扩展性,还为用户提供了卓越的 可视化和条件查询 体验。