文章摘要
文章核心内容:列式存储本质上是关系型数据库的规范化过程,它将行式数据转换为列式存储,既保留了关系型抽象的特性,又针对不同查询场景优化性能。行存储便于单行操作,而列存储则更适合聚合分析类查询。
文章总结
标题:列式存储本质上是数据规范化
文章核心观点: 列式存储并非完全独立于传统关系型数据库的概念,它本质上是一种极端的数据库规范化形式。
数据存储方式对比:
1. 行式存储示例:
json
data = [
{"name": "Smudge", "colour": "black"},
{"name": "Sissel", "colour": "grey"},
{"name": "Hamlet", "colour": "black"}
]
优势:
- 便于单行数据的增删改查
- 适合需要频繁访问整行数据的场景
- 列式存储示例:
json data = { "name": ["Smudge", "Sissel", "Hamlet"], "colour": ["black", "grey", "black"] }优势:
- 适合聚合分析(如统计颜色分布)
- 减少不必要的数据读取
规范化视角: 列式存储可以视为将宽表拆分为多个单属性表的极端规范化形式:
原始表:
+----+--------+-------+
| id | name | colour|
+----+--------+-------+
| 0 | Smudge | black |
| 1 | Sissel | grey |
| 2 | Hamlet | black |
+----+--------+-------+
规范化后: ``` 名称表: +----+--------+ | id | name | +----+--------+ | 0 | Smudge | | 1 | Sissel | | 2 | Hamlet | +----+--------+
颜色表: +----+-------+ | id | colour| +----+-------+ | 0 | black | | 1 | grey | | 2 | black | +----+-------+ ```
关键洞见: 1. 列式存储中的数组索引相当于隐式主键 2. 从列式数据重建行记录的过程本质上就是执行连接(JOIN)操作 3. 这种视角有助于统一理解查询处理和数据格式转换的关系
(注:已删除原文中关于磁盘访问、页面操作等过细的技术细节,保留了核心的存储方式对比和规范化视角的类比)
评论总结
这篇评论围绕列式存储与数据库规范化的关系展开讨论,主要呈现以下观点:
- 概念混淆的质疑
- 认为将规范化(逻辑设计)与列式存储(物理实现)混为一谈会产生误导 "The normalization analogy... papers over the fact that normalization is a logical design concept while columnar storage is a physical one" (immanuwell)
- 质疑是否在错误解释第六范式 "Is this meant to be a poor explanation of sixth normal form?" (orangepanda)
- 实践价值讨论
- 指出这种思考虽有趣但缺乏实际应用价值 "interesting thought, even if it doesn't come with practical consequences... excessive overthinking" (Lucasoato)
- 认为规范化主要优势在于可变值的去重管理 "biggest benefit of normalization was deduplicating mutable values... change in one place" (parpfish)
- 技术实现分析
- 提出列式存储需要数据对齐来避免连接操作 "To take full advantage of columnar... keep related contiguous columns" (juancn)
- 类比传统并行数组概念 "My mental model... parallel arrays used in FORTRAN" (wpollock)
- 格式适用性质疑
- 认为列式并非所有数据的最优格式 "columns aren't the end-all-be-all normalization format" (notepad0x90)
- 指出复杂嵌套结构在CSV中的表达困难 "one line of JSON... creating $array_size number of rows" (notepad0x90)
补充信息: - 有评论提到域键范式(Domain-key normal form)相关概念 - 推荐Apache Arrow文档作为延伸阅读材料