Как объединить несколько файлов базы данных в SQLite? - PullRequest
3 голосов
/ 06 февраля 2011

У меня есть несколько файлов базы данных, которые существуют в нескольких местах с точно такой же структурой. Я понимаю, что функция присоединения может использоваться для подключения нескольких файлов к одному соединению с базой данных, однако это рассматривает их как отдельные базы данных. Я хочу сделать что-то вроде:

SELECT uid, name FROM ALL_DATABASES.Users;

Также

SELECT uid, name FROM DB1.Users UNION SELECT uid, name FROM DB2.Users ;

НЕ является правильным ответом, потому что у меня есть произвольное количество файлов базы данных, которые мне нужно объединить. Наконец, файлы базы данных должны оставаться отдельными. Кто-нибудь знает, как этого добиться?

РЕДАКТИРОВАТЬ: ответ дал мне идею: можно ли создать представление, которое представляет собой комбинацию всех разных таблиц? Можно ли запросить все файлы базы данных и какие базы данных они «смонтировать», а затем использовать их в запросе представления для создания «главной таблицы»?

Ответы [ 2 ]

6 голосов
/ 06 февраля 2011

Поскольку SQLite накладывает ограничение на количество баз данных, которые могут быть присоединены за один раз, в одном запросе нет способа сделать то, что вы хотите.

Если число может гарантированно находиться в пределах лимита SQLite (что нарушает определение «произвольный»), ничто не мешает вам сгенерировать запрос с правильным набором UNION s в тот момент, когда вам нужно выполнить это.

Чтобы поддерживать действительно произвольное количество таблиц, ваш единственный реальный вариант - создать таблицу в несвязанной базе данных и многократно INSERT строк от каждого кандидата:

ATTACH DATABASE '/path/to/candidate/database' AS candidate;
INSERT INTO some_table (uid, name) SELECT uid, name FROM candidate.User;
DETACH DATABASE candidate;
0 голосов
/ 25 января 2014

Об этом позаботится некоторая хитрость в схеме.

Обычно у вас есть 2 типа таблиц: справочные таблицы и динамические таблицы.Справочные таблицы имеют одинаковое содержимое во всех базах данных, например, коды стран, коды отделов и т. Д.

Динамические данные - это данные, которые будут уникальными для каждой БД, например, временные ряды, статистика продаж и т. Д.

Справочные данные должны храниться в главной БД и реплицироваться в динамические базы данных после изменений.

Все динамические таблицы должны иметь столбец для DB_ID, который будет частью составного первичного ключаНапример, ваш временной ряд может использовать db_id, measure_id, time_stamp.Вы также можете использовать хэш DB_ID для генерации первичных ключей, использовать один и тот же генератор pk для всех таблиц в БД.При объединении их из разных DBS данные будут уникальными.

Таким образом, у вас будет 3 типа баз данных:

  • Мастер ссылок -> реплицируется на все остальные

  • отдельная динамическая -> реплицируется в полную динамическую

  • полная динамическая -> реплицируется из эталонного мастера и всех отдельных динамических.

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

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