December 30, 2024
By: Kevin

sqlite疯狂的有趣的一些事实

  1. 事实
  2. 参考

本文翻译自slqite的一些事实

事实

  1. SQLite是部署和使用最广泛的数据库. 目前有超过一万亿(1000000000000)个SQLite数据库在活跃使用.

    全球人均100多个...

    它由三个人维护, 且不接受外部贡献.

  2. SQLite的使用量可能超过所有其他数据库引擎的总和.

    数十亿份SQLite副本存在于世界各地, 无处不在.

  3. 它也可能是部署最多的前五大软件模块之一.

  4. Hwaci是SQLite背后的公司. 他们似乎还对音乐感兴趣???.

  5. SQLite起源于一艘美国军舰.

    D. Richard Hipp(DRH)在为美国海军驱逐舰USS Oscar Austin开发软件时, 发现现有软件在服务器宕机时会停止工作(这是在2000年代).

    对于一艘战舰来说, 这是不可接受的. 于是DRH提出了一个问题: 如果数据库不需要服务器就能运行会怎样? 这在当时是一个创新的想法.

  6. 比开源更开源(版权在公共领域, 或者说完全开放版权).

    SQLite在法律意义上不是开源的, 因为"开源" 有特定的定义, 并且需要获得开源倡议(OSI)批准的许可证.

    相反, SQLite属于公共领域, 这意味着它比任何开源许可证的限制都更少.

  7. 他们不接受外部贡献. 你不能简单地提交一个拉取请求并期望补丁被接受.

  8. 不是谁都能贡献代码.

    贡献SQLite是邀请制的(我没有具体来源). 只有在你被邀请并签署了一份将你的贡献奉献给公共领域的宣誓书后, 你才能提交补丁.

  9. SQLite中每行代码对应超过600行的测试代码.

    测试覆盖了库中100%的分支(以及100%的MC/DC). 测试套件非常多样化, 包括模糊测试, 边界值测试, 回归测试, 以及模拟操作系统崩溃, 断电, I/O错误和内存不足的测试.

  10. 测试代码更加重要.

    有趣的是, 一些SQLite测试是专有的. 实现100%分支覆盖的测试套件TH3(Test Harness 3)是专有的, 不对外开放. 我不知道还有哪个项目将代码免费, 但测试套件收费. 然而, 他们一份TH3都没卖出去. DRH在一次播客中说: "100% MCD测试, 也就是TH3, 是专有的. 我原本以为我们可以把这些测试卖给航空电子制造商并以此赚钱. 但我们一份都没卖出去, 所以这个计划没成功. " 要获得访问权限, 需要加入SQLite联盟, 年费为12万美元.

  11. 这是一个有趣的商业模式. 通过付费支持, 维护服务, 联盟会员和商业扩展来创收.

  12. SQLite没有行为准则(CoC).

    采用了源自<圣本笃规则>第四章"善工工具" 的道德准则.

  13. 在SQLite中: 没有法律声明, 只有一句祝福:

  14. SQLite非常快, 甚至可以与系统调用 fopen 一争高下.

    在某些用例中, 使用SQLite代替文件系统可以快35%.

  15. SQLite vs Redis(猜猜哪个更快?)

    在某些用例中, 由于网络栈和(反)序列化开销, SQLite可能比Redis更快.

  16. 但与大多数数据库不同, SQLite采用单写模型. 你不能有多个并发写入者.

    这一情况在2010年通过引入WAL模式有所改变. 在此之前, 你只能有多个读取者或一个写入者, 但不能同时存在.

  17. 其他数据库中常见的功能在SQLite中并不常见:

    • 默认是回滚日志模式, 限制你只能有多个读取者或一个写入者
    • 外键是禁用的, 需要手动启用
    • 它是" 弱类型" 的. SQLite称之为" 类型亲和性" . 这意味着即使你定义了类型, 你也可以在列中插入任何内容. 强类型列需要手动启用.
    • 许多你期望在其他数据库中使用的ALTER命令在SQLite中不起作用. 例如, 你不能为现有列添加约束. (他们最近增加了重命名列名的功能)

    其他SQLite的怪癖.

  18. 我讨厌它没有类型. 完全是YOLO风格:

    CREATE TABLE user(id INTEGER);
    INSERT into user VALUES ("YOLO!"); --- 这居然能行!
    

    不仅如此, 如果你给出一个随机类型, 它也不会抛出任何错误.

    CREATE TABLE t(value TIMMYSTAMP);
    

    没有TIMMYSTAMP类型, 但SQLite愉快地接受了. 它有五种类型: NULL, INTEGER, REAL, TEXT, BLOB. 想知道更离谱的吗? 类型亲和性是通过子字符串匹配实现的!

    CREATE TABLE t(value SPONGEBLOB) --- 这是BLOB类型!
    
  19. 这是我最喜欢的轶事之一. 当用户开始在半夜给开发者打电话时, SQLite不得不将默认前缀从 sqlite_ 改为 etilqs_.

  20. SQLite非常重视向后兼容性

    SQLite 3的所有版本都可以读取和写入由最早的SQLite 3版本(3.0.0, 发布于2004年6月18日)创建的数据库文件.

    这就是"向后兼容性". 开发者承诺在未来所有SQLite 3版本中保持数据库文件格式的向后兼容性.

  21. 重视向后兼容性, 以至于即使他们发布了一个错误, 也不会修复它.

  22. SQLite的作者D. Richard Hipp(DRH)认为现有的版本控制系统不合适, 于是他编写了自己的版本控制系统, 名为Fossil. 当然, Fossil是由SQLite驱动的. 这让我想起了Linus编写Git的故事. DRH还编写了自己的解析器生成器, 名为Lemon.

  23. DRH基于Donald Knuth的<计算机程序设计艺术>(TAOCP)中的算法编写了B-Tree, 并在飞机上完成了编码(非常硬核).

  24. SQLite的发音是" Ess-Cue-El-Lite" . 虽然没有官方指南, 但DRH在SQLite论坛中提到:

    " 我编写了SQLite, 我认为它应该发音为' S-Q-L-ite' , 就像一种矿物. 但我对你们怎么发音都无所谓. :-)"

今天就到这里! 如果我漏掉了什么, 请告诉我. 节日快乐, 新年快乐! 🎄 ☃️


参考

  1. 来源: 最广泛部署, 公共领域和贡献, 测试, 付费支持, 比文件系统更快, SQLite历史.
  2. 作者在Twitter上发布了这个帖子, 许多人提供了更多来源. 在此致谢: 1, 2, 3.
Tags: clojure sqlite