> -----Message d'origine-----
> De : Matt S Trout [mailto:[EMAIL PROTECTED] 
> Envoyé : jeudi, 25. janvier 2007 11:59
> À : [email protected]
> Objet : Re: [Dbix-class] plat-form contest starting soon
> 
> 
> Which reminds me, you and I still need to sit down and chat 
> about synergies.
> 
> I reckon I could re-implement the documented interface of 
> DBIx::DataModel atop DBIx::Class in ~3 days and it would 
> actually be quite natural to do so, so I'm more and more 
> suspecting the differences between the projects are largely 
> in terms of how we conceptualise the interface rather than 
> how we actually see the underlying domain.


Okay, now that plat-forms is over, let's start investigating some architectural 
points. For the discussion I will assume a database schema similar to the one 
in DBIx::Class::Manual::Example. In DBIx::DataModel, this would be written more 
or less as 

  # Create a schema class
  DBIx::DataModel->Schema('Music'); 

  # Create table classes
  #               Perl_class  DB_table  Primary_key
  #               ----------  --------  -----------
  Music->Table(qw/Artist      artist    artist_id    /);
  Music->Table(qw/Cd          cd        cd_id        /);
  Music->Table(qw/Track       track     track_id     /);

  # Declare UML associations 
  #                      Class   role_name  multiplicity
  #                      -----   ---------  ------------
  Music->Association([qw/Artist  artist         1        /],
                     [qw/Cd      cds            *        /]);

  Music->Composition([qw/Cd      cd             1        /],
                     [qw/Track   tracks         1..*     /]);


Now if I want information about all recent cds and tracks of some artist, I 
could write

  my $rows = $someArtist->selectFromRoles(qw/cds tracks/)
                          ->(-columns => [EMAIL PROTECTED],
                           -where   => {year => {">" => 2004}},
                             -orderBy => 'year');

The equivalent SQL is

  SELECT @some_column_list FROM cd INNER JOIN track ON cd.cd_id=track.cd_id
                           WHERE artist_id = $someArtist->{artist_id}
                             AND year > 2004
                             ORDER BY year

and each row returned by that query will be blessed into a new class 
Music::AutoView::Cd_INNER_Track, created on the fly (if not already there),
and which inherits from both classes Cd and Track. Multiple inheritance 
makes sense here because a row from that result set contains data from both 
tables (Cd and Track).

Now I have two questions :

1) would such an idea (creating classes on the fly and using multiple 
inheritance) be compatible with the architecture of DBIx::Class ? beneficial ? 
disastrous ?

2) as far as I understand, DBIx::Class also manipulates the namespace 
dynamically (loading classes and methods). Did you ever get in trouble when 
serializing/deserializing such classes through Catalyst sessions, as it just 
happened to me with DBIx::DataModel ? And if so, how did you solve it ?

Thanks in advance, L. Dami

_______________________________________________
List: http://lists.rawmode.org/cgi-bin/mailman/listinfo/dbix-class
Wiki: http://dbix-class.shadowcatsystems.co.uk/
IRC: irc.perl.org#dbix-class
SVN: http://dev.catalyst.perl.org/repos/bast/trunk/DBIx-Class/
Searchable Archive: http://www.mail-archive.com/[email protected]/

Reply via email to