ORM
Object-relational mapping
オブジェクト関係マッピング
#WIP
インピーダンス・ミスマッチの解消
上手く言語化できないが、「SQLの代替手段としてのORM」という戦略自体がズレている気がする
だからORMいる、いらん論争が起きる
なんだろう、例えば型付きSQL文を使うとか
ORMが担う役割
個人的には、EntityとMappingしている部分が「ほんまにええんか?」という気持ちにもなる
EntityとTableは1対1対応させる必要はない
Entityとtable構造が密結合している感じがするが、本当に良いのか
「SQL書くとDBのことを知りすぎ」という意見もわからんではないが、それはレイヤー作れば問題ないと思うし
ORMなら確かにDBが変わっても修正不要なのか
途中でDB変えることなんて殆どないと思うけど
「筋の良いORM」にちゃんと触れたことがないので、そういうのに触れると考え方が変わるかもしれない
いまのところちゃんと触ったことあるのDoctrine ORMぐらいだし。
PrismaやHRRをもうちょいちゃんと使ってみれば「ええやん」になるかもしれない
classのinstanciateダルすぎ問題もある
そもそもここがめんどいので、そこを自動化するORMは嬉しい、となる
統一をやめる
SQLかORMかの二元論をまずやめる
全体として効率が上がれば良し
ORMを9割ぐらい使って、無理なところだけSQL書く
即ち、良いORM Libraryは、「無理なところだけSQL書く」ときも楽に書けるようにしたい
その余地を残しておく、というかなんというか
というか、queryはSQLで書いてmappingだけ自動化するのが一番良いんじゃないのか..mrsekut.icon
取捨選択するにしても、
1つのSQLを組み立てるときに
methodで書いたSQLの部分と、
nativeで書いたSQLの部分
を合成して使えないと意味ない
そうじゃないと、「今までの仕様ではこの部分はmethodで書いていた」が、
仕様変更に無理になった場合に、そのSQLをすべてnativeに書き直す必要がある
それなら最初からnativeで書いとけば良いじゃん、になる
プロダクト全体で取捨選択できる、というのは当たり前なので。
今のとこ、めちゃくちゃORMにヘイトが溜まっているが、
Doctrineしか使ったことがないので、
一般的なORMがそもそもクソなのか、Doctrineがクソなだけなのかは判別がついていないmrsekut.icon
Prismaも触ったことあるけど、軽くしか触ったこと無いので評価できない
軽く触った感じは良かった
複雑なことしようとするとキレるかもしれない
https://qiita.com/ts7i/items/c23e50b5ee29887c446c
ORMには抽象度の5つのレベルがある
高い抽象度のものはより簡潔にかけるが柔軟性が低い
そういったレベル感を知った上で目的とマッチしているかを見て採用する必要がある
この記事はJavaを使っていて各レベルに相当する実際のORMで話をすすめる
レベル 1: 低レベル API
queryはSQLで文字列で書く
結果は手動でsetterを使ってinstanceを作っていく
リソース管理や例外処理も必要
これってORMって呼ぶの?ってぐらい特に何もやっていない
レベル 2: 前後処理の抽象化
queryはSQLで文字列で書く
結果は手動でsetterを使ってinstanceを作っていく
レベル 3: クエリと単純なオブジェクトのマッピング
queryはSQLで文字列で書く
mappingはやってくれる
がtable結合した際の他のobjectを取ってこれないらしい
つまり、単体のEntityしか取得できない
レベル 4: クエリと関連ナビゲーション可能なオブジェクトのマッピング
queryはSQLで文字列で書く
XMLやらで結合込みのmappingの指定をする
結合込みのmappingのためにannotationとかが必要になるのかmrsekut.icon
レベル 5: テーブルとオブジェクトのマッピング
Entityにannotationでmappingの指定などをする
パフォーマンスの問題になりがち
N+1問題
Symfonyもここだな
mappingがだるいのはOOPのせいだと思うので、class指向を辞めればマシになそうな気はするmrsekut.icon
/keroxp/Gormが本番テーブルの数億件のデータを消そうとした話
こわーいmrsekut.icon*2
アンチORM
https://www.kaitoy.xyz/2015/09/13/orm-is-offensive-anti-pattern/
https://martinfowler.com/bliki/OrmHate.html
Martin Fowler
https://www.kaitoy.xyz/2015/09/13/orm-is-offensive-anti-pattern/
https://gallu.hatenadiary.jp/entry/2019/05/08/001034
https://blog.jnito.com/entry/20100528/1274998429
https://blog.jnito.com/entry/20101223/1293060036
https://ogin-s57.hatenadiary.org/entry/20130417/1366222047
https://scrapbox.io/keroxp/Gorm%E3%81%8C%E6%9C%AC%E7%95%AA%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AE%E6%95%B0%E5%84%84%E4%BB%B6%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E6%B6%88%E3%81%9D%E3%81%86%E3%81%A8%E3%81%97%E3%81%9F%E8%A9%B1
https://speakerdeck.com/harrisoneagle/godeormwozi-zuo-sitemiru
ormの自作