c++ - 用于序列化目的的 SQLite3

标签 c++ sql serialization

过去几天我一直在研究 SQLite3,它似乎是一个不错的数据库,但我想知道它在序列化方面的用途。

我需要序列化一组链接到另一个表的键/值对,这是我到目前为止一直在做的方式。

首先是项目表:

CREATE TABLE items (id INTEGER PRIMARY KEY, details);

 | id | details |
-+----+---------+
 |  1 | 'test'  |
-+----+---------+
 |  2 | 'hello' |
-+----+---------+
 |  3 | 'abc'   |
-+----+---------+

然后每个项目都会有一个表格:

CREATE TABLE itemkv## (key TEXT, value);  -- where ## is an 'id' field in TABLE items

 | key | value |
-+-----+-------+
 |'abc'|'hello'|
-+-----+-------+
 |'def'|'world'|
-+-----+-------+
 |'ghi'| 90001 |
-+-----+-------+

在我注意到每个表有 1 KB 的开销之前,它工作正常。如果我只处理少数项目,这是可以接受的,但我需要一个可以扩展的系统。

不可否认,这是我第一次使用任何与 SQL 相关的东西,所以也许我不知道表应该用于什么,但我找不到任何“子”的概念表”或“结构”数据类型。理论上,我可以将键/值对转换成这样的字符串,“abc|hello\ndef|world\nghi|90001”并将其存储在列中,但这让我想知道这是否违背了使用数据库的目的首先,如果我要麻烦地将我的结构转换为可以轻松存储在平面文件中的东西。

我欢迎任何人提出任何建议,包括更适合此类序列化目的的不同库的建议。

最佳答案

您可以尝试 PRAGMA page_size = 512; 在创建数据库之前,或者在创建第一个表之前,或者在执行 VACUUM 语句之前。 (手册有点矛盾,而且还依赖sqlite3版本。)

我认为以高速率动态创建表也很少见。规范化模式很好,但是列依赖于主键是可以的,虽然重复组是较低规范化级别的标志,但外键在合理的模式中重复是正常的。也就是说,我认为您很可能只需要一个键/值对表,其中包含一个标识客户端实例的列。

请记住,平面文件也有分配单元开销。观察当我创建一个单字节文件时会发生什么:

$ cat > /tmp/one

$ ls -l /tmp/one
-rw-r--r-- 1 ross ross 1 2009-10-11 13:18 /tmp/one
$ du -h /tmp/one
4.0K    /tmp/one
$ 

根据 ls(1) 它是一个字节,根据 du(1) 它是 4K。

关于c++ - 用于序列化目的的 SQLite3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1551643/

相关文章:

mysql - 计算 2 个表的相等字段,并与第 3 个表进行内部连接

mysql - 在用 ER 图表示关系之后,在 SQL 中创建表时如何说明它们?

c# Xamarin SQLite.Net 序列化模式无法正常工作?

C++:缓存 JSON 而不是对象会减少内存消耗吗?

c++ - tensorflow源码中bool变量的初始化

c++ - 如何在 GTK+ 中显示 PostScript 文件?

c++ - 有什么方法可以欺骗 std::make_shared 使用默认初始化吗?

c++ - 模板参数适用于不同的 STL 容器?

SQL Case 语句正确的别名

c++ - 将原始对象写入/读取到文件