Оптимизация пространства хранения для базы данных SQLite - PullRequest
0 голосов
/ 08 октября 2019

У меня есть база данных SQLite, которую я использую для хранения в основном файловой системы. Существует огромное количество повторяющихся путей, и использование диска растет очень быстро. Данные выглядят следующим образом:

16  1570041298  0   4   C:\PROGRAM FILES (X86)\GOOGLE\CHROME\APPLICATION\77.0.3865.90\CHROME_CHILD.DLL      86634480
16  1570041298  0   1420    C:\PROGRAM FILES (X86)\GOOGLE\CHROME\APPLICATION\77.0.3865.90\CHROME_CHILD.DLL      86634480
16  1570041298  0   1420    C:\PROGRAM FILES (X86)\GOOGLE\CHROME\APPLICATION\77.0.3865.90\CHROME_CHILD.DLL      86634480
16  1570041298  0   4   C:\PROGRAM FILES (X86)\GOOGLE\CHROME\APPLICATION\77.0.3865.90\CHROME_CHILD.DLL      86634480
16  1570041298  0   2840    C:\PROGRAM FILES (X86)\GOOGLE\CHROME\APPLICATION\77.0.3865.90\CHROME_CHILD.DLL      86634480
16  1570041299  0   2840    C:\PROGRAM FILES (X86)\GOOGLE\CHROME\APPLICATION\77.0.3865.90\CHROME_CHILD.DLL      86634480
16  1570041299  0   3192    C:\PROGRAM FILES (X86)\GOOGLE\CHROME\APPLICATION\77.0.3865.90\CHROME_CHILD.DLL      86634480
16  1570041299  0   3192    C:\PROGRAM FILES (X86)\GOOGLE\CHROME\APPLICATION\77.0.3865.90\CHROME_CHILD.DLL      86634480

Я видел похожие приложения, заменяющие длинные строки длинным целым числом и в основном использующие его для ссылки на него. Мой вопрос заключается в том, что, поскольку это не поддерживается изначально в SQLite, каковы мои варианты дизайна для достижения наилучшей оптимизации (какой алгоритм использовать, я все еще смогу использовать транзакции для одновременной вставки нескольких записей и т. Д.?)

Спасибо!

1 Ответ

1 голос
/ 08 октября 2019

Вы на правильном пути и хотите использовать числовые идентификаторы вместо строк для путей. Вы хотите таблицу, которая сопоставляет уникальные имена путей с номерами идентификаторов, и используете эти идентификаторы в качестве внешних ключей в исходной таблице.

Что-то вроде:

CREATE TABLE pathnames(id INTEGER PRIMARY KEY, path TEXT NOT NULL UNIQUE);
CREATE TABLE activity(id INTEGER PRIMARY KEY
                    , path_id INTEGER NOT NULL REFERENCES pathnames(id)
                    , timestamp INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))
                    , etc);
CREATE INDEX activity_idx_path_id ON activity(path_id);

Тогда легко добавить путь, еслион не существует, и ищите его по имени при вставке строки в таблицу activity:

BEGIN;
INSERT OR IGNORE INTO pathnames(path) VALUES ('C:\whatever');
INSERT INTO activity(path_id, etc)
 VALUES ((SELECT id FROM pathnames WHERE path = 'C:\whatever'), 'created');
COMMIT;

и поиске всего для определенного файла, например,

SELECT timestamp, etc
FROM activity
WHERE path_id = (SELECT id FROM pathnames WHERE path = 'C:\whatever')
ORDER BY timestamp;

за исключением, конечно, в вашем приложении вы будете использовать параметры вместо литеральных строк для всех этих операторов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...