by shigemk2

当面は技術的なことしか書かない

Ruby会議2011のまとめ 3日目 その7

データベース

リファクタリングとは

大きいものを小さくする
小さいものから大きいものを組み立てる
小さいものに名前をつけて抽象化する

select * from sales
where deleted_at is null order by amount desc limit 10

SQLには、リファクタリングに用いられる3つの用途で
コマンドは打てない

別言語でスクリプトは書けるけど、SQLそのものを抽象化出来ない。

Sales.active.top(n)

アセンブラ→C,PascalOOP,Functional

抽象化能力を高めるために言語は開発された
SQLに抽象化能力はない
より高次元の抽象化能力を有するDBはDBI,ORM,ModernORMなどがある。

SQLアセンブラの一種
抽象化能力を持たないSQLを補完するのが、ORMやModernORM

Rails3では、メソッドチェーンによりDB検索の条件を指定出来る

queryが返ってくる
query = Member.where('age >= ?', val)


ORMによって、名称が変わってくる。

Method Call vs Query Op
Rails3ではqueryオブジェクトを操作する
メソッドチェーンに目がいきがちだが、
あくまでもqueryオブジェクトを操作する事が目的

従来なら文字列のみで条件を指定していたのに
対し、Rails3なら条件をオブジェクトに格納し、
オブジェクトに対して演算を行う事が出来る

オブジェクトを組み合わせる事によって、
条件を決める事が出来る

オブジェクトそのものを配列として利用し、
ブロックを使ってイテレータを働かす事も出来る

メソッドにオブジェクトを格納するのではなく、
オブジェクトに対してメソッドで操作する
(やっている事は一応一緒)

##Data Mapper
class Sales
def self.active
where(:deleted_at=>nil)
end
end

集合演算が可能なので、必ずしも
関数型言語で言うところの、関数の部分適用

Query can abstract SQL.

View層のcache
ビューでの操作をするのはMVCに違反している
push-style vs pull-style
キャッシュの存在をコントローラーで確認すべし

オブジェクトを作成するだけでは、DBにアクセスしない
ビュー層に一切変更はない。

MVCとフラグメントは相性が悪い(push-style vs pull style)
が、クエリオブジェクトの操作により、解決する

SQLの発行の際に、別データも取っておく(but変更に弱い)

datamapping 必要なデータを過不足なく取得する必要がある
関連データを指定してやる必要がある

eagar loadingを使うと、必要なデータをいちいち取り揃える必要はない
(Rails2,3では無理)


Ruby ⇔ AST ⇔ SQL
ASTをせば、Rubyの書き方で、SQLを発行出来る
rubyの書き方をSQLが読み取ってくれる(逆も然り)