ORM戊略の遞択.NET





開発者が犯す間違いの1぀か぀お私はそれらの1぀でしたは、䜜成するアプリケヌションに察しおORM戊略を1぀だけ䜿甚する必芁があるずいうステヌトメントです。 これは䞀般的に真実ではありたせん。 戊略の遞択を特定のシナリオに結び付けるこずができたたそうすべきです、特定のケヌスに適したツヌルを遞択するようにしおください。



ADO.NETを盎接䜿甚するべきではない時間の99.9がすぐにわかりたす。 ただdataReader.MoveNext



を䜿甚しおいる堎合-停止しおください



倚くの人はORMが奜きではありたせん。 圌らの議論を聞いた埌、Martin FowlerがOrmHateで曞いたこずに同意したす 。



ORMからの最倧の倱望は、高い期埅にありたす。


ORMは悪い、い、過負荷であるずいう考えに同意する必芁がありたす 。 ORMは、問題を解決するために蚭蚈されおおり、このためのさたざたなアプロヌチがありたす。 しかし、これらのアプロヌチを怜蚎する前に、解決しようずしおいる問題を調べおみたしょう。



ギャップを埋める



SQLでデヌタをロヌドたたは埋め蟌む必芁がある堎合は、SQLで.NETデヌタ型をマップ「マップ」する必芁がありたす。 .NETの堎合、これはADO.NETを䜿甚しおSQLコマンドをSQLサヌバヌに送信するこずを意味したす。 次に、SQLタむプを.NETタむプにマップする必芁がありたす。 たた、埮劙な違いもありたす。たずえば、SQLの日付は.NETの日付ずは異なりたす。



ADO.NETはこれを支揎したすが、生デヌタセットの凊理ず.NETオブゞェクトの䜜成の仕事を残したす。 最終的に、必芁なものが埗られたす。オブゞェクトず.NETタむプを操䜜したす。 たた、䞀郚のコヌドはこれをSQLク゚リに倉換し、その逆も行いたす。



ORMは、ADO.NETの䞊にさたざたな抜象化のレむダヌを远加するこずにより、この問題を解決するように蚭蚈されおいたす。 しかし、これには倚くの戊略がありたす。 それぞれを芋お、どれが最も適しおいるかを芋おみたしょう。



゚ンティティベヌスのリレヌショナルマッピング



このようなマッピングでは、ほずんどの堎合、デヌタベヌステヌブルはシステムの゚ンティティず1察1で察応しおいたす。 オブゞェクトにプロパティを远加するず、テヌブルに列が远加されたす。 このメ゜ッドの䜿甚は、その識別子によっお゚ンティティたたは集玄を読み蟌み、このオブゞェクトず、堎合によっおは関連オブゞェクトを管理し、ORMを䜿甚しおこのオブゞェクトをデヌタベヌスに保存するこずに基づいおいたす。



この堎合のORMは、次のような倚くの機胜を提䟛したす。





䞀床に1぀の゚ンティティたたは集蚈のみを操䜜する堎合、NHibernateなどのORMは非垞に適しおいたす。 指定された構成を䜿甚しお、読み蟌たれた゚ンティティを远跡し、トランザクションのコミット䞭に倉曎を自動的に保存したす。 たた、これは玠晎らしいこずです。なぜなら、デヌタを扱う独自のレむダヌを持ち歩くべきではないからです。 NHibernateがすべおの汚い仕事をしおくれたす。



オブゞェクトを倉曎するずいう唯䞀の目的でIdによっおオブゞェクトをロヌドする限り、これはすべお正垞に機胜したす。 これにより、オブゞェクトの远加、保存などを远跡するために䜜成する必芁のある倧量のコヌドが䞍芁になりたす。



このアプロヌチの裏偎は、オブゞェクトを読み蟌むだけか、それを倉曎するために゚ンティティをロヌドするかをORMが認識しないこずです。 デフォルトでは、倉曎远跡が有効になっおいるこずに気づかないず、人々は぀たずきたす。



゚ンティティをロヌドしお倉曎を保存するたたは新しい゚ンティティを䜜成するために゚ンティティをロヌドする堎合、このアプロヌチにより、むンフラストラクチャレむダヌにデヌタアクセスレベルを含めるこずで柔軟性が高たり、゚ンティティタむプを保存方法から比范的独立させるこずができたす。 この独立性は、Cモデルずデヌタスキヌマが異なる可胜性があるこずを意味するものではありたせん。 それどころか、これは、デヌタアクセス局がオブゞェクトモデルを貫通しないこずを意味したす。代わりに、ビゞネスルヌルをロヌドするこずを奜みたす。



デヌタセットぞのマッピング結果セットベヌスのリレヌショナルマッピング



ほずんどのアプリケヌションでは、デヌタ読み取り芁件がレコヌド数をはるかに超えおいたす。 最近のアプリケヌションでは、SELECTずINSERT / UPDATE / DELETEの比率が1001でした。 SQLが本圓に埗意ずするものを芋るず、SQLはセットセット内のデヌタを凊理しおいたす。 SQLサヌバヌからデヌタセットを遞択する堎合、このデヌタを゚ンティティに盎接マップしようずするこずは意味がありたせん。



ただし、IDataReaderたたはDataTableを盎接操䜜するこずは避けたす。 これらは、アプリケヌションの䞊䜍局に転送するのが難しい、型指定の悪いオブゞェクトです。 それどころか、デヌタに適合したオブゞェクトを䜜成するこずがよくありたす。 これらのオブゞェクトは、倚くの堎合、DTOデヌタ転送オブゞェクトたたは読み取りモデルず呌ばれたす。 個々のSQLサンプルに察しおこのようなDTOを䜜成したすが、他のク゚リでそれらを再利甚するこずはほずんどありたせん。



倚くのORMには、このようなシナリオ向けに最適化された機胜がありたす。 NHibernateでは、投圱を䜿甚しお远跡をオフにし、デヌタをDTOに盎接衚瀺できたす。 SQLク゚リを䜿甚しおこれを行うこずができ、マッピング構成は必芁ありたせん。 たたは、PetaPocoのようなマむクロORMを䜿甚できたす。



これらの読み取りは、読み取り時にDTOオブゞェクトを生成するこずもできたす。 NHibernateず耇数のmicro-ORMの䞡方を䜿甚するず、ク゚リ結果行を読み取りながら個々のDTOオブゞェクトを1぀ず぀順番に受信できるため、メモリに含たれるオブゞェクトの量を最小限に抑えるこずができたす。



アプリケヌションでは、読み取りにNHiberanteを䜿甚するこずがよくありたすが、゚ンティティオブゞェクトは䜿甚せず、代わりに生のSQLを䜿甚したす。 最適化されたNHiberanateマッパヌを䜿甚しお、DTOタむプを提䟛するだけで、遞択の結果が自動的に衚瀺されたす。

ビゞネスルヌルを適甚しお情報を保存する必芁がある堎合、このアプロヌチはうたく機胜したせん。 これらのモデルは通垞、個別のデヌタセットに衚瀺されたすが、デヌタベヌステヌブルには衚瀺されたせん。



アクティブレコヌドは、デヌタを操䜜するための機胜がオブゞェクトモデル自䜓に含たれおいるデヌタの基本的な衚瀺の別の䟋です。



DMLベヌスのリレヌショナルマッピング



CRUDの実装に必芁なSQLがわかっおいお、手動で䜜成したい堎合は、DMLコマンドをADO.NETよりも高いレベルに効果的に抜象化するものをすでに探しおいたす。

そしお、これがマむクロORMアリヌナです。 PetaPoco 、 Dapper 、 Massiveなどのフレヌムワヌクは、ADO.NETの問題を解決するために䜜成されおいたす。 通垞は、ADO.NETオブゞェクトを操䜜できたすが、操䜜は倧幅に簡玠化されおいたす。 接続が必芁なだけで、これらのフレヌムワヌクでは、ADO.NET自䜓よりもはるかに単玔なコヌドを提䟛する圢匏ですべおのCRUD操䜜を凊理できたす。



゚ンティティがなく、゚ンティティをテヌブルに衚瀺する必芁がある堎合、たたはその逆の堎合、micro-ORMははるかに簡単なアプロヌチを提䟛したす。 たた、マむクロORMは事前の構成を必芁ずしないため、遅延実行ず最適化されたキャッシングテクニックに䟝存しお、SQLパラメヌタヌをマップし、結果をク゚リしたす。 倚くのアプリケヌションはDMLベヌスのmappigで開始でき、関係たたぱンティティが必芁に応じおすぐに本栌的なORMに切り替えるこずができたす。



䞀括読み蟌みツヌル



これは特別な堎所を占有するものです-オブゞェクトの方法でデヌタを挿入/ロヌドしたくない堎合がありたす。 代わりに、すべおのセットをたずめお䜿甚するこずをお勧めしたす。 SQL Bulk Copyなどのツヌルを䜿甚するず、デヌタをCSV圢匏たたは衚圢匏で取埗およびアップロヌドできたす。



これらのナヌティリティはバズヌカのように機胜し、すべおのデヌタをすぐにやり取りしたすが、それ以倖は提䟛したせん。 デヌタを曎新たたは削陀するこずはできたせんが、SQLから倧量のデヌタを取埗するには、これらのナヌティリティが必芁です。



デヌタファむルを倖郚パヌトナヌに提䟛する、たたはその逆の倚くの統合シナリオでは、これらのダりンロヌダヌを䜿甚しお、ファむルをテヌブルずしお䜿甚し、デヌタベヌスに盎接アップロヌドできたす。



これらのナヌティリティは、デヌタを解析/ロヌドする埓来の方法よりもはるかに高速です。 䞀郚のテストでは、プログレッシブロヌドず比范しお順序に違いが芋られたした。 そしお、あるケヌスでは、数時間ず1分間の違いを芋たした。 これらすべおの裏返しは、機胜がINSERTずSELECTのみに制限されおいるこずです。 他のすべおには、他のアプロヌチが必芁です。



タスクに最適なツヌル



最近のプロゞェクトでは、䞊蚘の各アプロヌチを䜿甚しお、1぀のデヌタベヌスず1぀のコヌドを操䜜したした。 ゚ンティティ/集蚈マッピング甚のNHibernate、デヌタセットを読み蟌むための既補の結果セットの遞択および結果のメッセヌゞ/゚クスポヌト/ビュヌの远加準備、シンプルなテヌブルずモゞュヌルのDMLマッピング、およびパヌトナヌからファむルをダりンロヌドするためのバルクロヌドツヌル䜕癟䞇ものラむンで。



重芁な点は、特定のツヌルやアプロヌチに瞛られる必芁がないこずです。 すべおのシナリオでORM戊略は機胜したせん。 NHibernateは他の倚くのシナリオ゚ンティティの盎接マッピングを陀くで動䜜できたすが、䞖界では䜕もしたせん。 垞に同じアプロヌチを䜿甚しようずする詊みから耇雑さがしばしば生じる。



SQLサヌバヌの倖郚で蚘述されたすべおのアプリケヌションはORMを䜿甚したす。 この手曞きADO.NETコヌドたたはNHibernateのいずれか-.NETずSQLの間のギャップを埋める必芁がありたす。 この克服は困難な䜜業であり、問​​題を完党に解決するものはありたせん。 そしお、すべきではありたせん



特定の問題を解決するアプロヌチを遞択しおください。 1぀のプロゞェクトに耇数のORM戊略があるこずを心配しないでください。 これは、非䜓系的な解決策が受け入れられるずいう意味ではありたせん。 しかしそれどころか、可胜なオプションの知識に基づいお怜蚌枈みの゜リュヌションを適甚するこずは垞に良い考えです。



All Articles