写点什么

设计解析 Excel 文件

作者:麦兜
  • 2024-10-13
    浙江
  • 本文字数:2590 字

    阅读完需:约 8 分钟

在设计解析 Excel 文件并存储到数据库的过程中,处理不同格式的 Excel 文件(例如 A 表有 10 个字段,而 B 表有 20 个字段)是常见的挑战。你需要一个灵活且扩展性强的设计,以便应对不同行头信息和字段数量的变化。以下是几种常见的设计思路,分别从数据库设计、数据解析、以及未来扩展方面进行分析:

1. 通用的动态数据库结构

这种设计可以应对每个 Excel 文件格式和字段的变化,保持灵活性。

A. 表结构设计

采用“键值对存储”的设计模式,以支持不同行的字段数量和格式。


  1. 通用的主表 (metadata)

  2. File_Metadata 表:存储每个上传的 Excel 文件的元数据信息,比如文件名、上传时间、表的描述等。

  3. Row_Metadata 表:存储每行记录的基础信息,比如 Excel 文件的来源,行号等。

  4. 键值对存储表 (Key-Value Storage)

  5. Key_Value_Store 表:用于存储每行的字段名和值,采用类似键值对的方式,每一行代表一个 Excel 字段。该表结构如下:

  6. id: 主键

  7. row_id: 外键,指向 Row_Metadata 表的具体行

  8. field_name: 字段名(如 Excel 的表头)

  9. field_value: 字段值(对应 Excel 单元格的值)

  10. 示例数据:


   File_Metadata:   ------------------------------------------------   file_id   |   file_name   |  upload_date   | ...   ------------------------------------------------   1         |  A表.xlsx     |  2024-10-13    | ...
Row_Metadata: ------------------------------------------------ row_id | file_id | row_number | ... ------------------------------------------------ 101 | 1 | 1 | ... 102 | 1 | 2 | ...
Key_Value_Store: ------------------------------------------------ id | row_id | field_name | field_value ------------------------------------------------ 1001 | 101 | 姓名 | 张三 1002 | 101 | 年龄 | 28 1003 | 101 | 地址 | 北京 1004 | 102 | 姓名 | 李四 1005 | 102 | 年龄 | 34
复制代码

B. 优点

  • 灵活性高:适应不同的 Excel 文件结构,不论是 10 个字段还是 20 个字段都能存储。

  • 易于扩展:后续添加新的字段或数据类型时,不需要修改数据库结构,只需要新增行即可。

  • 字段动态解析:通过 field_name 可以动态获取每行数据的字段名称和值,无需为每种 Excel 格式专门设计表结构。

C. 缺点

  • 查询复杂度较高:由于数据存储为键值对的方式,查询特定字段的数据可能需要更多的操作,比如要通过多个 JOIN 连接取回所有字段的数据。

  • 性能问题:对于大数据量的查询场景,键值对结构在复杂查询时性能可能不如关系型数据库中的传统列存储结构,需要进行优化(如增加索引)。

2. 半结构化存储方案(JSON 格式)

这是另一种灵活应对不同行格式的方案,可以考虑使用 JSON 格式存储 Excel 中的行数据。

A. 表结构设计

  1. File_Metadata:和上面一样,用于存储文件的元数据。

  2. Excel_Data:每行的所有字段值以 JSON 格式存储,这样可以灵活处理不固定的字段结构。

  3. id: 主键

  4. file_id: 外键,关联文件

  5. row_data: 存储 Excel 数据的 JSON 格式

  6. 示例数据:


   Excel_Data:   ------------------------------------------------   id     | file_id  | row_data   ------------------------------------------------   101    |   1      | {"姓名": "张三", "年龄": 28, "地址": "北京"}   102    |   1      | {"姓名": "李四", "年龄": 34, "公司": "腾讯"}
复制代码

B. 优点

  • 灵活性高:JSON 格式非常适合存储结构化或半结构化数据。每个行记录的数据格式可以完全不同。

  • 简化数据存储:所有字段信息都可以存储在单一列中,读取和存储操作非常简单。

  • 查询能力:现代关系型数据库如 PostgreSQLMySQL 都支持在 JSON 字段上执行查询、筛选和索引操作,因此在查询特定字段时仍有较好的性能。

C. 缺点

  • 复杂查询不便:虽然 JSON 字段支持查询,但对于频繁复杂的查询场景,解析 JSON 数据可能效率不如传统的表结构。

  • 存储效率:由于 JSON 存储的是原始数据格式,可能在大数据量下存在一定的存储冗余问题。

3. 固定表结构 + 动态字段扩展

这种方法是在数据库中设计一个相对固定的表结构,处理核心字段(比如文件 ID、行号等),同时通过添加一个扩展字段(例如使用 JSON 或键值对)来处理额外的字段。

A. 表结构设计

  1. Common_Data:用于存储所有 Excel 文件共有的字段(如文件 ID、行号等)。

  2. Additional_Fields:处理不同 Excel 文件中额外的字段,可以使用键值对或 JSON 来存储。

  3. 示例结构:


   Common_Data:   ------------------------------------------------   id    | file_id  | row_number  | 姓名    | 年龄   ------------------------------------------------   101   | 1        | 1           | 张三    | 28   102   | 1        | 2           | 李四    | 34
Additional_Fields: ------------------------------------------------ id | common_data_id | extra_data (JSON) ------------------------------------------------ 1001 | 101 | {"地址": "北京"} 1002 | 102 | {"公司": "腾讯"}
复制代码

B. 优点

  • 核心字段性能更高:常用或通用字段存储在 Common_Data 表中,可以快速查询和筛选常用字段。

  • 动态扩展字段:对于不确定的字段(比如不同 Excel 的不同字段),可以使用 Additional_Fields 来扩展,不影响主表的结构。

C. 缺点

  • 需要额外的维护成本:需要保持两个表之间的一致性,增加了数据库设计的复杂度。

  • 字段分类问题:需要事先定义哪些字段是“通用字段”,哪些是“动态字段”,可能在实际业务中需要频繁调整。

总结与推荐

  • 如果你的 Excel 文件格式差异较大(字段数量和名称变化较多),推荐使用 键值对存储JSON 存储 方式,这两者都能提供很高的灵活性和扩展性,方便未来不同格式文件的兼容。

  • 如果某些字段是通用的,而额外的字段变化较多,可以采用 固定结构+动态扩展 的设计,保持核心字段的查询效率,同时具备灵活性。

  • 数据库支持:如果你使用 PostgreSQLMySQL 等现代数据库,它们对 JSON 和键值对的查询支持良好,推荐将字段以 JSON 存储的方式进行设计。


根据你处理数据的复杂性和未来需求,选择一个适合的设计方案,确保系统灵活应对不同格式的 Excel 文件,并能够高效地进行查询和扩展。

用户头像

麦兜

关注

与一只鸟生活在杭州 2023-01-19 加入

企业ERP,企业供应链,业务财务一体化老兵

评论

发布
暂无评论
设计解析Excel文件_麦兜_InfoQ写作社区