http://www.perlmonks.org?node_id=1022813


in reply to DBI relation between tables tutorial

This is a beginner database question, go to the next library and get an introduction to RDBMS design/SQL book.

You are describing a Junction table.

$ echo ' create table articles (id integer not null, parsed text, primary k +ey (id)); create table information (id integer not null, something text, pri +mary key (id)); create table articles_information (articles_id integer not null, i +nformation_id integer not null, primary key (articles_id, information +_id), foreign key (articles_id) references articles (id), foreign key + (information_id) references information (id)); ' | sqlite3 M15U.sqlite
This example is already complicated enough that you should not bother with raw SQL in DBI, but use a higher-level ORM. DBIx::Class sample code:
use DBIx::Class::Schema::Loader qw(); DBIx::Class::Schema::Loader->naming('preserve'); my $schema = DBIx::Class::Schema::Loader->connect('DBI:SQLite:db=M15U. +sqlite'); my $foobar = $schema->resultset('Articles')->create({ id => 1, parsed +=> 'foo bar' }); $foobar->add_to_informations({ id => 1, something => 'quux' }); $foobar->add_to_informations({ id => 2, something => 'fnord' });
As long as the foreign keys are set up properly, the junction table is filled automatically:
$ echo .dump | sqlite3 M15U.sqlite | grep INSERT INSERT INTO "articles" VALUES(1,'foo bar'); INSERT INTO "information" VALUES(1,'quux'); INSERT INTO "information" VALUES(2,'fnord'); INSERT INTO "articles_information" VALUES(1,1); INSERT INTO "articles_information" VALUES(1,2);