过去几天我一直在研究 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/