3

私はLiftフレームワークで最初のプロジェクトを開始しようとしています。どの永続ライブラリを選択するかを決定する必要があります。MapperとRecordの両方が機能するように、リレーショナルバックエンドを使用しようとしています。

Mapperの場合(私が最も見逃しているのは、RDBMSに送信されるクエリを制御する機能です)、特にSQLの結合や集計などによって解決される、より複雑なクエリに関してはそうです。次の例を見てみましょう-次の2つのエンティティを作成しましょう:

class BaseProduct extends LongKeyedMapper[BaseProduct] with IdPK {
  // some fields
}
object BaseProduct extends BaseProduct with LongKeyedMetaMapper[BaseProduct]

class MyProduct extends LongKeyedMapper[MyProduct] with IdPK {
  // some fields
  object base extends MappedLongForeignKey(this, BaseProduct)
}
object MyProduct extends MyProduct with LongKeyedMetaMapper[MyProduct]

エンティティMyProductの専門分野の1つはどこにありますか。BaseProductこれらのエンティティ間には明らかに1対1の関係があります。MyProductただし、正確なものと一緒にクエリを実行するために私が思いついた最良の可能性はBaseProduct、次のようなクエリでした。

MyProduct.findAll(PreCache(MyProduct.base))

これは2つのクエリを発行します(さらに、選択するMyProductエンティティのフィールドを制御できないのではないかと思います。

Mapperライブラリには十分に悪い。Record / Squeryl APIに関する私の主な懸念は、ProtoMapperAPIの周りに存在するすべてのクラスが不足しているという事実です。レコードのこれらのクラスの機能に近いものはありますか?Squerylのデータベース固有の機能(PostgreSQLの幾何学的クエリなど)にアクセスすることは可能ですか?

これらのレイヤーのいずれかに他の長所と短所はありますか?または、データベースとの通信をタイプセーフに適切にカプセル化し、クエリを適切に制御したい場合に注意が必要な他の抽象化レイヤーはありますか(PHPのPDOレイヤーを使用してクエリを直接発行することに慣れていました-Iこのような直接クエリインターフェイスは必要ありませんが、クエリを制御できる可能性は素晴らしいでしょう)Liftフレームワークとの統合は間違いなく利点です。

ありがとうございました!

4

1 に答える 1

5

私たちはLiftでSquerylをかなり長い間使用しており、非常に満足しています。上記のケースに基づいて、Squerylの現在のリリースバージョン(0.9.5)では、次のようなことができます。

class BaseProduct(id:Long, some more fields) extends KeyedEntity[Long] {

}

class MyProduct(id:Long, some more fields) extends KeyedEntity[Long] {

}

次に、次のような関係を定義するスキーマが作成されます(IDフィールドで結合されていると想定しています)。

val baseProducts = Table[BaseProduct]("base_products")
val myProducts = Table[MyProduct]("my_products")
val myProductsToBaseProducts = 
  oneToManyRelation(myProducts, baseProducts).via((mp, bp) =>
    mp.id === bp.id)

両方のレコードをクエリするには、次のようにします。

from(myProducts, baseProducts) ( (mp, bp) =>
  where(mp.id === bp.id and mp.id === LOOKUPVAL) 
  select(bp, mp) )

上記のクエリは、単一のSQL選択から(BaseProduct、MarketProduct)のタプルを返します。

MyProductこのメソッドを次のように追加するなどして、リレーションシップを使用して関連アイテムを取得することもできます。

def baseProduct = myProductsToBaseProducts.left(this)

ただし、Mapperの例のように、2番目のクエリが発行されます。データベース固有のクエリを作成&する場合、サーバーで式を評価できる演算子があります。関数がSquerylで使用できない場合は、カスタム関数を作成できます。

全体として、Squerylは非常に柔軟性があり、ORMとストレートSQLの優れたハイブリッドであることがわかりました。非常に優れたパフォーマンスを発揮し、Squerylが必要なデータベース機能を簡単に利用できない場所をあまり多く見つけていません。0.9.6ではカスタムタイプの柔軟性が大幅に向上するため、次のバージョンではさらに簡単になります。

于 2013-02-05T22:35:42.430 に答える