Я бы хотел использовать SQLite FTS3 (фактически FTS4) для индексации таблицы с целочисленными столбцами, концептуально что-то вроде этого:
CREATE VIRTUAL TABLE whole (document INTEGER, page INTEGER, content TEXT,
UNIQUE(document, page)) USING fts4();
Я знаю, что FTS3 обрабатывает все столбцы, кроме rowid, как TEXT, поэтому мне придется использовать две таблицы:
CREATE VIRTUAL TABLE data USING fts4();
CREATE TABLE metadata(document INTEGER, page INTEGER, UNIQUE(document, page));
Я хочу иметь возможность запрашивать документы или страницы в данном документе:
SELECT DISTINCT document FROM metadata NATURAL JOIN data WHERE content MATCH 'foo';
SELECT page FROM metadata NATURAL JOIN data
WHERE document = 123 AND content MATCH 'foo';
Я думаю, что ЕСТЕСТВЕННОЕ СОЕДИНЕНИЕ требует от меня обеспечения синхронизации строк, но каков наилучший способ сделать это? Должен ли я использовать FOREIGN KEY или другое ограничение? Будет ли дополнительный выбор лучше, чем объединение?
Я бы хотел, чтобы вставка для документа и страницы уже в базе данных перезаписывала текстовое содержимое. Это возможно программно через SQL, или мне придется проверить, существует ли строка в информационной таблице?
Я также хочу УДАЛИТЬ ИЗ обеих таблиц для данного документа - есть ли способ сделать это в одном выражении?
Все советы с благодарностью получены, но, поскольку я новичок в SQL, примеры кода особенно ценятся!
Обновление: Мне совсем не ясно, как я могу создать здесь ограничение внешнего ключа. Если я выберу metadata
в качестве родительской таблицы (что было бы моим предпочтением при отсутствии двунаправленного ограничения):
PRAGMA foreign_keys = ON;
CREATE TABLE metadata (document INTEGER, page INTEGER);
CREATE VIRTUAL TABLE data USING fts4(content TEXT, docid REFERENCES metadata);
Я получаю Error: vtable constructor failed: data
(неудивительно, потому что docid
является псевдонимом для rowid
, но, конечно, я не могу использовать другой столбец, потому что все столбцы, кроме rowid
, должны быть TEXT
).
Принимая во внимание, если я попробую наоборот:
PRAGMA foreign_keys = ON;
CREATE VIRTUAL TABLE data USING fts4();
CREATE TABLE metadata (document INTEGER, page INTEGER, docid REFERENCES data);
Построение таблицы успешно, но если я попытаюсь:
INSERT INTO data (docid, content) VALUES (123, 'testing');
INSERT INTO metadata (docid, document, page) VALUES (123, 12, 23);
Я получаю Error: foreign key mismatch
.