Для простого приложения для Android, которое я создаю как инструмент обучения для себя (для использования реляционных dbs / SQL среди прочего - простите за вопрос, если хотите). Я предварительно создаю базу данных sqlite для поставки вместе с приложением. Я делаю это, основываясь на следующем ТАК вопрос .
У меня есть две таблицы с отношением «многие ко многим» и соединительная таблица для определения этих отношений следующим образом:
CREATE TABLE Names (_id INTEGER PRIMARY KEY,
name TEXT
);
CREATE TABLE Categories (_id INTEGER PRIMARY KEY,
category TEXT
);
CREATE TABLE Name_Category (name_id INTEGER,
category_id INTEGER,
PRIMARY KEY (name_id, category_id),
foreign key (name_id) references Names(_id),
foreign key (category_id) references Categories(_id)
);
У меня есть наборы операторов вставки для заполнения таблиц имен и категорий. Теперь я столкнулся с задачей заполнения распределительной таблицы. Я уверен, что мог бы создать операторы вставки вручную, посмотрев идентификаторы имен и категорий, которым я хочу соответствовать, но это выглядит немного глупо.
Чтобы автоматически создавать операторы вставки для соединительной таблицы, я представляю, что мог бы создать сценарий на основе набора пар имен и категорий, который будет искать соответствующие идентификаторы и выводить оператор вставки. (Я придумал это, когда задавал вопрос, и буду исследовать его. Тебе не нравится, когда это происходит?)
У кого-нибудь есть предложения по способам сделать это?
РЕДАКТИРОВАТЬ Я добавил внешние ключи, потому что, как указано ниже, они помогут сохранить целостность между таблицами.
РЕДАКТИРОВАТЬ # 2 Чтобы решить эту проблему, я создал простой сценарий Perl, который берет текстовый файл с парами имя - категория и выгружает их в другой файл с соответствующими операторами SQL.
Текстовый файл имени - категории имеет следующий формат:
'Name' 'Category'
Скрипт Perl выглядит так:
use strict;
use warnings;
open (my $name_category_pair_file, "<", "name_category.txt") or die "Can't open name_category.txt: $!";
open (my $output_sql_file, ">", "load_name_category_junction_table.sqlite") or die "Can't open load_name_category_junction_table.sqlite: $!";
while (<$name_category_pair_file>) {
if (/('[a-zA-Z ]*') ('[a-zA-Z ]*')/) {
my $sql_statement = "INSERT INTO Name_Category VALUES (
(SELECT _id FROM Names WHERE name = $1),
(SELECT _id FROM Categories WHERE category = $2))\;\n\n";
print $output_sql_file $sql_statement;
}
}
close $name_category_pair_file or die "$name_category_pair_file: $!";
close $output_sql_file or die "$output_sql_file: $!";