2010-02-18 5 views

Antwort

3

Sie können Elch mit DBIC kein Problem verwenden. Eigentlich MooseX ich viel Freude mit :: erklären, da ich die erweiterte Syntax finden ist sehr nützlich, wenn feste öffentliche apis Gestaltung, zum Beispiel:

use MooseX::Declare; 
class MyApp::Schema::Result::Geo::Division 
extends MyApp::Schema::Result { 
    use Locale::Geocode::Division; 
__PACKAGE__->table('division'); 
__PACKAGE__->add_columns(
    fk_territory_id => { 
    data_type => 'char', 
    size => '36', 
    }, 
    division_id => { 
    data_type => 'char', 
    size => '36', 
    }, 
    code => { 
      data_type => 'varchar', 
    size => '5', 
    }, 
    created => { 
    data_type => 'datetime', 
    set_on_create => 1, 
    }, 
); 

__PACKAGE__->set_primary_key('fk_territory_id','division_id'); 
__PACKAGE__->uuid_columns('division_id'); 
    __PACKAGE__->add_unique_constraint(['fk_territory_id','code']); 

__PACKAGE__->belongs_to(
    territory => 'MyApp::Schema::Result::Geo::Territory', 
    {'foreign.territory_id' => 'self.fk_territory_id'}, 
); 
    method as_geocode_division { 
     Locale::Geocode::Division->new($self->code); 
    }  
__PACKAGE__->meta->make_immutable(inline_constructor => 0); 
} 1; 
+0

Wie würden Sie die Moose-Attribute deklarieren, wenn das Schema bereits von der DB definiert ist (dh, DBIx :: Class liest das Schema ein, anstatt es durch die Methodenaufrufe zu definieren, die Sie oben ausführen)? – Ether

+0

Sie meinen * Laufzeit * Schema Laden? Ich werde nicht nett spielen. :) – hobbs

1

Es klingt wie Sie beschreiben genau das, was ich vor kurzem, um schrieb Moose zur Karte Attribute Werte auf Rose::DB::Object Werte (mit dem db-Objekt und Objektmanager in privaten Attributen enthalten) und umgekehrt. Ich habe ursprünglich Auslöser für jedes Moose-Attribut verwendet, um sofort auf das Rose-Objekt zu schreiben, gab aber später diesen Ansatz auf und schrieb die Werte nur bei Bedarf (d. H. Zum Zeitpunkt einer ->save()-Operation). Ich habe es implementiert, indem ich einige Rollen und eine Zuckerklasse verwendet habe, die automatisch ein Attributmerkmal installiert hat, das "Ich bin ein Tabellenfeld" für die relevanten Attribute anzeigt.

Aber nicht tun, was ich tat - einfach DBIx::Class direkt verwenden! Die nächste Hauptversion wird sowieso in Moose umgeschrieben, also höre ich.

+0

* Die nächste Hauptversion wird sowieso in Moose umgeschrieben, also höre ich. * Das geht schon seit Jahren. –

+1

Matt hatte letzten Monat in der Perl Oasis eine erfinderische Rede darüber. – perigrin

6

Wenn Sie zwischen Moose-Klassen und einem DBIC-Schema hin und her mappen müssen, sollten Sie stattdessen einen permanenten Objektspeicher wie KiokuDB betrachten.

Sie verlieren einige Funktionen einer relationalen Datenbank, insbesondere, wenn Sie ein vorhandenes Schema haben, aber viele Funktionen erhalten, wobei die wichtigste eine stille Zuordnung zwischen dem Datenspeicher und Ihrem Objektmodell ist. Das DBI-Backend für KiokuDB ist wahrscheinlich das beste Beispiel für diese Abwägung. Die Datenbank ist stark de-normalisiert, aber das liegt daran, dass sie als Keystore funktioniert.

KiokuDB kann jedoch mit Speicher-Engines arbeiten, die für diese Art von Daten optimiert sind. Es unterstützt mehrere aktuelle NoSQL-Stars wie CouchDB und MongoDB. Es unterstützt auch die ältere Fan-Favorit BerkelyDB.

Kioku ist nicht die Antwort für jedes Problem, aber es wird sehr erfolgreich für Parking Mobility verwendet, um den gesamten Datenspeicher nahtlos zu behandeln.

+0

+1 für mich gegen die Erwähnung von KiokuDB zu schlagen. –

Verwandte Themen