SQLite,多个具有相同列的表还是一张大表?什么是更好的?

Ros*_*s F 5 c# database sqlite

我目前正在使用 SQLite 用 c# 编写一个锻炼历史记录跟踪应用程序(有一天我会使用 xamarin 将其移植到移动设备)。每次完成练习(EG俯卧撑、仰卧起坐等)时,我都想将其与大量其他信息(时间、地点等)一起存储在表格中。

我应该将所有历史数据存储在表中,然后使用 ID 或其他内容来分隔每个练习,还是应该将每个练习存储在自己的表中?哪种方法会更快、更有效,选择一种方法会不会给我以后带来麻烦?

每个练习很可能始终具有相同的列,最坏的情况是,我可能有多达 100 个不同的练习,其中有 2000 个历史条目。计划是绘制这些数据的统计数据以显示给用户

提前致谢

Gri*_*lin 6

经验丰富的数据库程序员通常会忽略一个非常重要的 SQLite 特性:一个数据库文件。

这种特殊性创建了一些非常意外的 SQLite 单表行为,这使得 SQLite 单表行为不应该仅仅因为通用关系数据库理论告诉您不要这样做而表面上忽视。

  1. 使用单个表而不是多个表的整体存储总是更便宜。整体文件读写速度更快。

    由于 SQLite 使用一个文件来存储整个数据库(只有当您为不同的表打开不同的数据库时才能创建不同的文件),因此 SQLite 的行为与其他传统数据库不同,每个表使用一个或多个文件。这就是为什么有时单表的性能优于多表方法,特别是对于磁盘 IO 相关操作。

  2. 在 SQLite 中,有效负载(表 B 树数据或索引 B 树键)始终采用“记录格式”。记录格式定义与表或索引中的列相对应的值序列。记录格式指定列数、每列的数据类型以及每列的内容。记录格式广泛使用可变长度整数或 64 位有符号整数的 varint 表示形式。这些变体称为“串行类型”。串行类型 NULL 使用的空间是 1 个字节。 在 SQLite 中拥有许多保存 NULL 的列非常便宜。这可能会鼓励您将许多列存储到同一个表中,特别是如果您的某些行是可选的,并且传统上您可能会试图仅在它们存在时将它们写入单独的表中(例如:一个表的 1 到 10 个不同的可选属性)目的)。