在sqlite3中,假设我有一个索引数据库,其中索引是指所有表的行中的每个字符串信息都已用整数替换,并且所有表中的每个字段都有一个表,其中包含映射整数和字符串。
现在我想在索引数据库中添加另一个尚未以这种方式处理的数据库 - 即行中仍然存在实际的字符串。这些表具有完全相同的结构,因此对于新数据库中的每个表,我将所有行添加到旧数据库中的相应表中 - 但是用整数替换字符串w.r.t.旧数据库中的字符串整数映射(并更新旧数据库中未在旧数据库中看到的那些字符串的映射)。
有没有首选的方法呢?
应用程序将是一个分布式索引程序,我运行约。使用较小的数据库填充FIFO队列的10个作业,我运行1个作业从队列中挑选数据库,索引它们并将它们添加到最终的大数据库。
答案 0 :(得分:1)
索引表如下所示:
CREATE TABLE data ( ColX INTEGER, ColY INTEGER );
-- foreign key constraints omitted
假设索引表对字符串列具有UNIQUE约束:
CREATE TABLE ColX_strings ( ID INTEGER PRIMARY KEY, Text TEXT UNIQUE );
CREATE TABLE ColY_strings ( ID INTEGER PRIMARY KEY, Text TEXT UNIQUE );
然后我们可以简单地使用INSERT或IGNORE来添加那些新的新字符串,即不与任何旧字符串冲突的字符串:
INSERT OR IGNORE INTO ColX_strings(Text) SELECT ColX FROM newDB.data;
INSERT OR IGNORE INTO ColY_strings(Text) SELECT ColY FROM newDB.data;
现在所有字符串都是已知的,因此我们可以在复制时查看它们:
INSERT INTO oldDB.data(ColX, ColY)
SELECT (SELECT ID FROM ColX_strings WHERE Text = T.ColX),
(SELECT ID FROM ColY_strings WHERE Text = T.ColY)
FROM newDB.data AS T;
答案 1 :(得分:0)
我从python访问了数据库。
我最终做的是将内存中的索引结构维护为python对象,直到所有带内容的整数行都添加到新数据库中。这允许我通过executemany()函数进行批量插入。在将所有行添加到数据库之后,将python索引对象批量插入到数据库中。
与使用动态数据库作为索引结构相比,这非常快。但它至少有以下两个缺点:
存储的值不能是索引表条目的外键(但整数不是那么大)
(python)索引对象需要适合内存(在另一种语言中,它可能需要的内存比在python中少得多)
我不得不说我没有尝试使用SSD,这可能会使基于内存的方法变得不必要。