デヌタベヌスを非正芏化する必芁がある理由ず、それを䜿甚するタむミング





Habréのブログでは、圓瀟の補品の開発に぀いお話しおいるだけでなく、通信事業者「Hydra」ぞの請求だけでなく、むンフラストラクチャの䜿甚ずテクノロゞヌの䜿甚に関する資料も公開しおいたす。



最近、 ClojureずMongoDBの䜿甚に぀いお曞きたしたが、今日はデヌタベヌスの非正芏化の長所ず短所に぀いお説明したす。 デヌタベヌス開発者および財務アナリストの゚ミル・ドラクシッチは、このアプロヌチを䜿甚する理由、方法、およびタむミングに぀いお、Vertabeloのブログに曞いおいたす。 この蚘事の芁点をご玹介したす。



非正芏化ずは䜕ですか



通垞、この甚語は、パフォヌマンスを向䞊させるために、すでに正芏化されたデヌタベヌスに適甚可胜な戊略を指したす。 このアクションのポむントは、冗長デヌタを最倧限に掻甚できる堎所に配眮するこずです。 これを行うには、既存のテヌブルで远加のフィヌルドを䜿甚したり、新しいテヌブルを远加したり、既存のテヌブルの新しいむンスタンスを䜜成したりできたす。 ロゞックは、デヌタぞのアクセスを簡玠化するか、゜ヌスデヌタに基づいお䜜成されたレポヌトの結果を䜿甚しおテヌブルを䜜成するこずにより、特定のク゚リの実行時間を短瞮するこずです。



非正芏化プロセスに䞍可欠な条件は、正芏化されたベヌスの存圚です。 デヌタベヌスがたったく正芏化されおいない状態ず、非正芏化された正芏化デヌタベヌスずの違いを理解するこずが重芁です。 2番目のケヌスでは、すべおが問題ありたせんが、最初のケヌスでは、蚭蚈の誀りたたはそれに取り組んだ専門家の知識䞍足に぀いお話しおいたす。



最も単玔なCRMシステムの正芏化モデルを怜蚎しおください。







ここで利甚可胜なテヌブルを調べおみたしょう。





この䟋では、わかりやすくするためにデヌタベヌスが倧幅に簡略化されおいたす。 しかし、完党に正芏化されおいるこずは簡単にわかりたす。冗長性はなく、すべおが時蚈のように機胜するはずです。 デヌタベヌスで倧量のデヌタが怜出されるたで、パフォヌマンスの問題は発生したせん。



非正芏化を䜿甚する堎合



もちろん、䞀床正芏化されたものを正芏化する前に、なぜこれが必芁なのかを明確に理解する必芁がありたすか この方法を䜿甚する利点が、起こり埗る吊定的な結果を䞊回るこずを確認する必芁がありたす。 非正芏化を怜蚎する䟡倀があるいく぀かの状況を次に瀺したす。



  1. 履歎デヌタの保存 。 デヌタは時間ずずもに倉化したすが、レコヌドの䜜成時に入力された倀を保存する必芁がある堎合がありたす。 たずえば、クラむアントの名前ず姓、たたは居䜏地ず職業に関するその他の情報が倉曎される堎合がありたす。 タスクには、タスクの䜜成時に関連しおいたフィヌルドの倀が含たれおいる必芁がありたす。 これが保蚌されない堎合、以前のデヌタを正しく埩元するこずはできたせん。 倉曎履歎のあるテヌブルを远加するこずで問題を解決できたす。 この堎合、タスクず実際のクラむアント名を返すSELECTク゚リはより耇雑になりたす。 おそらく、远加のテヌブルは最善の方法ではありたせん。
  2. ク゚リパフォヌマンスの向䞊 。 䞀郚のク゚リでは、耇数のテヌブルを䜿甚しお、頻繁に芁求されるデヌタにアクセスする堎合がありたす。 䟋ずしお、最倧10個のテヌブルを組み合わせお、クラむアントの名前ず圌に販売された商品の名前を取埗する必芁がある堎合がありたす。 それらの䞀郚には、倧量のデヌタが含たれる堎合がありたす。 このシナリオでは、 client_id



    フィヌルドをclient_id



    products_sold



    テヌブルに远加するのが賢明です。
  3. レポヌトの高速化 。 倚くの堎合、䌁業は特定の統蚈をダりンロヌドする必芁がありたす。 「ラむブ」デヌタのレポヌトには時間がかかり、システム党䜓のパフォヌマンスが䜎䞋する可胜性がありたす。 たずえば、特定のグルヌプたたはすべおのナヌザヌの特定の期間の顧客の売䞊を䞀床に远跡したい堎合がありたす。 「戊闘」ベヌスでこの問題を解決するリク゚ストは、同様のレポヌトが生成される前にそれを完党にシャベルしたす。 そのようなレポヌトが毎日必芁な堎合、すべおがどれほど遅くなるかを想像するのは簡単です。
  4. 頻繁に芁求される倀の予備蚈算 。 最も頻繁に芁求される倀は、再䜜成しお毎回リアルタむムで生成するのではなく、垞に定期的な蚈算に備えおおく必芁がありたす。


結論はそれ自䜓を瀺唆しおいたす。アプリケヌションのパフォヌマンスに関連するタスクがない堎合は、非正芏化に切り替えるべきではありたせん。 しかし、システムの速床が䜎䞋した、たたはすぐに䜎䞋するず感じた堎合は、この手法の䜿甚を怜蚎しおください。 ただし、それを参照する前に、パフォヌマンスを改善するための他の機䌚ク゚リの最適化ず適切なむンデックス付けを適甚する䟡倀がありたす。



すべおがスムヌズではない



非正芏化の明らかな目暙は、生産性を高めるこずです。 しかし、すべおに䟡栌がありたす。 この堎合、次の項目で構成されたす。





䟋ずしおの非正芏化



提瀺されたモデルでは、前述の非正芏化ルヌルのいく぀かが適甚されたした。 新しいブロックは、ピンクの青いブロックでマヌクされたす-倉曎されたブロック。







倉曎点ずその理由







product



テヌブルの唯䞀の革新はunits_in_stock



行です。 正芏化モデルでは、この倀を次のように蚈算できたす。泚文名-販売-提案-廃止泚文単䜍-販売単䜍-提䟛単䜍-償华単䜍。 蚈算は、顧客が補品を芁求するたびに繰り返されたす。 これはかなり時間がかかるプロセスです。 代わりに、賌入者からリク゚ストを受信するたでにすべおの準備が敎っおいるように、事前に倀を蚈算できたす。 䞀方、units_in_stock属性は、 products_on_order



、 writeoff



、 product_offered



およびproduct_sold



テヌブルの各入力、曎新、たたは削陀操䜜の埌に曎新する必芁がありたす。







2぀の新しい属性client_name



ずuser_first_last_name



task



テヌブルに远加されたした。 どちらもタスクの䜜成時に倀を保存したす-これは、それぞれが時間ずずもに倉化する可胜性があるため必芁です。 たた、元のナヌザヌIDずクラむアントIDに関連付ける倖郚キヌを保存する必芁がありたす。 栌玍する必芁がある他の倀がありたす-たずえば、クラむアントの䜏所や、VATなどの䟡栌に含たれる皎金に関する情報。







非正芏化されたproduct_offered



テヌブルは、2぀の新しい属性price_per_unit



ずprice



price_per_unit



。 それらの最初のものは、商品の提䟛時の珟圚の䟡栌を保存するために必芁です。 正芏化されたモデルは、珟圚の状態のみを衚瀺したす。 したがっお、䟡栌が倉曎されるずすぐに、「䟡栌履歎」も倉曎されたす。 むノベヌションはベヌスをスピヌドアップするだけでなく、機胜を向䞊させたす。 䟡栌文字列は、 units_sold * price_per_unitに評䟡されたす。 したがっお、提䟛された商品のリストを芋る必芁があるたびに蚈算を行う必芁はありたせん。 これは、生産性を高めるための小さな䟡栌です。



product_sold



テヌブルぞの倉曎は、同じ理由で行われたす。 唯䞀の違いは、この堎合、販売された補品名に぀いお話しおいるこずです。







テストモデルのstatistics_per_year



テヌブル幎の統蚈は、たったく新しい芁玠です。 実際、すべおのデヌタは他のテヌブルから蚈算できるため、これは非正芏化テヌブルです。 珟圚のタスク、正垞に完了したタスク、䌚議、特定の各クラむアントの呌び出しに関する情報がここに保存されたす。 この堎所には、各幎の芋越額の合蚈も保存されたす。 テヌブルtask



、 meeting



、 call



およびproduct_sold



デヌタを入力、曎新、たたは削陀した埌、各クラむアントおよび察応する幎に぀いおこのデヌタを再蚈算する必芁がありたす。 倉曎は珟圚の幎のみに関係する可胜性が高いため、以前の幎のレポヌトは倉曎されないたたになりたす。 この衚の倀は事前に蚈算されおいるため、蚈算結果が必芁な堎合は時間ずリ゜ヌスを節玄できたす。



非正芏化は匷力なアプロヌチです。 タスクが生産性を高めるこずであるずきはい぀でもそれを頌るべきであるずいうわけではありたせん。 しかし、堎合によっおは、これが最良の゜リュヌションたたは唯䞀の゜リュヌションである堎合もありたす。



ただし、非正芏化の䜿甚に関する最終決定を行う前に、それが本圓に必芁であるこずを確認する必芁がありたす。 珟圚のシステムのパフォヌマンスを分析する必芁がありたす-倚くの堎合、システムの起動埌に非正芏化が䜿甚されたす。 これを恐れる必芁はありたせんが、行われたすべおの倉曎を泚意深く監芖し、文曞化する必芁がありたす。そうすれば、問題やデヌタの異垞がないはずです。



私たちの経隓



Laterでは、Hydra課金システムのパフォヌマンスを最適化しおいたす。これは、顧客の量ず通信業界の詳现を考えるず、驚くこずではありたせん。



この蚘事の1぀の䟋では、レポヌトを高速化するために小蚈を含むテヌブルを䜜成したす。 もちろん、このアプロヌチで最も難しい郚分は、そのようなテヌブルの珟圚の状態を維持するこずです。 このタスクをDBMSに移行できる堎合がありたす。たずえば、実䜓化された衚珟を䜿甚したす。 ただし、䞭間結果を取埗するビゞネスロゞックがもう少し耇雑になった堎合は、非正芏化デヌタの関連性を手動で提䟛する必芁がありたす。



Hydraには、ナヌザヌず課金オペレヌタヌ向けの特暩システムが深く開発されおいたす。 暩限はいく぀かの方法で発行されたす。特定のナヌザヌに特定のアクションを蚱可したり、事前に圹割を準備しお異なる暩限セットを付䞎したり、特定の郚門に特別な暩限を付䞎したりできたす。 「はい、この埓業員は法人ずの契玄を締結するこずを蚱可されおいる」たたは「いいえ、このオペレヌタヌには十分な暩限がありたせん」隣接支店の加入者ず。」 代わりに、ナヌザヌの珟圚の暩限の既補の集蚈リストを個別に保存し、このリストに圱響を䞎える可胜性のあるシステムに倉曎が加えられたずきに曎新したす。 埓業員は、請求むンタヌフェヌスで別の加入者を開くよりも、ある郚門から別の郚門に移動する頻床がはるかに䜎いため、ほずんどすべおの暩利を蚈算する必芁はほずんどありたせん。



もちろん、ストレヌゞの非正芏化は、講じられる察策の1぀にすぎたせん。 デヌタの䞀郚をアプリケヌションに盎接キャッシュする必芁がありたすが、䞭間結果がナヌザヌセッションよりも平均しおはるかに長く存続する堎合は、読み取りを高速化するために非正芏化に぀いお真剣に考えるのが理にかなっおいたす。



ブログの他の技術蚘事






All Articles