CREATE TABLE Session ( SessID INTEGER PRIMARY KEY AUTOINCREMENT, DoneDate TEXT, Topic TEXT ) CREATE TABLE Person ( PersId INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT ) CREATE TABLE Role ( RoleId INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT ) CREATE TABLE PersonRoles ( PersID INTEGER, RoleID INTEGER, PRIMARY KEY(PersID, RoleID) ) CREATE TABLE PersonSessions ( SessID INTEGER, PersID INTEGER, PRIMARY KEY(SessID, PersID) ) #### sub getActiveSessions { my ($self, @ids) = @_; my $idPlaces = (join ', ', ('?') x @ids) || ''; return $self->{'dbh'}->selectall_arrayref( <getActiveSessions(1..7) ); #### $VAR1 = [ [ 'Doug', 'Learner', 'Fun with JSON', '2015-06-27' ], [ 'Bert', 'Teacher', 'Fun with Origami', '2015-06-27' ], [ 'Greg', 'Learner', 'Fun with Origami', '2015-06-27' ], [ 'Fred', 'Learner', 'Fun with Origami', '2015-06-27' ], [ 'Fred', 'Learner', 'Fun with JSON', '2015-06-27' ], [ 'Carl', 'Teacher', 'Fun with JSON', '2015-06-27' ] ]; #### use strict; use warnings; use DBI; use feature qw/ say /; use Data::Dumper; my $dbh = DBI->connect('dbi:SQLite:monks.sqlite','','', {RaiseError => 1}); my $self = bless { dbh => $dbh }; $dbh->do(<do(<do(<do(<do(<do( < '2015-06-20', 'Fun with SQL' => '2015-06-20', 'Fun with JSON' => '2015-06-27', 'Fun with Origami' => '2015-06-27', ); while (my ($topic, $done_date) = each %sessions) { $dbh->do( < { role => 1, sessions => [1,4] }, 'Bert' => { role => 1, sessions => [2] }, 'Carl' => { role => 1, sessions => [3] }, 'Doug' => { role => 2, sessions => [1,3] }, 'Eric' => { role => 2, sessions => [1,4] }, 'Fred' => { role => 2, sessions => [2,3] }, 'Greg' => { role => 2, sessions => [2,4] }, ); while ( my ($pers_name, $properties) = each %people ) { $dbh->do( <{dbh}->last_insert_id(undef, undef, undef, undef); $dbh->do( <{'role'} ); INSERT INTO PersonRoles (PersID, RoleID) VALUES (?,?) SQL for (@{ $properties->{'sessions'} }) { $dbh->do( <{'dbh'}->selectall_arrayref( <getActiveSessions(1..7) );