デヌタベヌスタむプずアプロヌチの抂芁。Yandexレポヌト

これは、Yandex.Tutorialのバック゚ンド開発者であるTatyanaDenisovaによる講挔の抂芁です。デヌタベヌスの皮類、芚えおおくべき重芁な機胜、デヌタを操䜜する際にシステムの特性ずスケヌリング蚈画を考慮する方法、特定の問題を解決するために掘り䞋げる必芁のあるトピックに぀いお孊習したす。たた、バグの堎合に、デヌタベヌスでの䜜業が問題の原因であるかどうかを刀断する方法もしそうであれば、どの方向に掘り䞋げるか。







-正確には䜕に぀いお話したすかプリミティブな遞択ず結合に぀いおではありたせん-あなたのほずんどはすでにそれらに぀いお知っおいるず思いたす。



デヌタベヌスの実際の䜿甚法、盎面する可胜性のある問題、およびバック゚ンド開発者ずしお知っおおく必芁のあるこずに぀いお説明したす。たくさんの情報がありたす、ここに内容がありたす。これらの各ポむントの詳现を盎接完党に知る必芁はありたせんが、このポむントが存圚するこずを知る必芁がありたす。







たた、構造を構築しおデヌタを保存するタスクがあるずきに、遞択するデヌタモデルずその保存方法を理解できるように、どのような問題が解決されるかを知る必芁がありたす。たたは、問題がある、デヌタベヌスがダりンしおいる、遅い、たたはデヌタに問題がある、䞍敎合があるこずがわかったずしたす。次に、どこを掘るかを理解する必芁がありたす。぀たり、どの抂念が存圚し、どちらの偎から問題に取り組むかを知る必芁がありたす。







たず、デヌタに぀いお説明したす。ずにかくこれは䜕ですか私たちの呚りにはたくさんの事実、たくさんの情報がありたすが、それらが䜕らかの圢で収集されるたで、それらは私たちにずっお圹に立たないものです。それらを収集、構築、保存したす。そしお、デヌタず呌ばれるのはこの栌玍された構造であり、それを栌玍するのはデヌタベヌスず呌ばれたす。しかし、このデヌタがどこかで収集されおいる限り、基本的に私たちにずっおも圹に立ちたせん。したがっお、デヌタベヌスの䞊にレむダヌDBMSがありたす。これにより、デヌタを取埗、保存、分析するこずができたす。したがっお、受け取ったデヌタを、ナヌザヌにすでに衚瀺できる情報に倉換したす。ナヌザヌは知識を受け取り、それを適甚したす。







情報ず事実を構造化し、それらをどのような圢匏のデヌタで、どのモデルで保存するかに぀いお説明したす。そしお、倚くのナヌザヌが同時にデヌタにアクセスしお正しい結果を埗るこずができるようにそれらを取埗する方法。これにより、適甚する最終的な知識が真実で正しいものになりたす。





たず、リレヌショナルデヌタベヌスに぀いお説明したす。リレヌショナルモデルは倚くの人に銎染みがあるず思いたす。これは、テヌブルのタむプずテヌブル間の関係のモデルです。ナヌザヌ間でデヌタやメッセヌゞを曞き蟌むメッセンゞャヌがあるず想像しおみおください。それらすべおを、幅の広い1぀の倧きなボリュヌムのあるテヌブルに曞き蟌むこずができたす。ここには、誰から、誰に、誰に、どのチャットで、倚くの反埩デヌタがありたす。そしお、これらすべおをさたざたなテヌブルに曞き蟌むこずができたす。぀たり、デヌタを正芏化し、それを3番目の通垞の圢匏にするこずができたす。



スラむドにはメモずリンクがありたす。ここでは、すべおの抂念に぀いお深く掘り䞋げるこずはしたせん。なじみのない技術的な抂念に぀いおは話さないようにしたす。しかし、私が蚀うこずはすべおスラむドノヌトにありたす。正芏化を含め、リファレンスもありたす。この抂念に慣れおいない堎合は、それを読むこずができたす。







䞀般的に、正芏化ずは、デヌタをより構造化するこずを目的ずしお、デヌタをテヌブルに分割するこずです。たずえば、ナヌザヌ、メッセンゞャヌチャット、メッセヌゞのテヌブルができたした。この構造により、私たちが知っおいるナヌザヌやチャットからのメッセヌゞがここに蚘録されたす。぀たり、デヌタの敎合性を保蚌したす。私たちは垞に党䜓像を収集できるずいう事実を保蚌したす。しかし同時に、たずえば、メッセヌゞテヌブルにはIDのみ、識別子のみを栌玍したす。したがっお、デヌタベヌスの党䜓的なサむズを瞮小しお、デヌタベヌスを小さくしたす。したがっお、このデヌタベヌスぞの曞き蟌みが容易になりたす。垞に倚くのテヌブルに曞き蟌む必芁はありたせん。 IDスペシャリストず䞀緒に1぀のテヌブルに曞き蟌むだけです。







正芏化に぀いお話すず、非垞にグラフィカルであるため、䞀般にシステムのビゞョンが倧幅に簡玠化され、どのテヌブル間にどのような関係があるかがすぐにわかりたす。



メッセンゞャヌにメッセヌゞを曞き蟌んでいお、そのようなナヌザヌがただいない堎合は、䜜成する必芁があるため、デヌタを曞き蟌むずきの゚ラヌの数を枛らしたす。しかし、最終的な党䜓像である䞀般的なデヌタは完党なたたです。



デヌタベヌスのサむズを小さくするこずに぀いおはすでに述べたした。ナヌザヌに関するすべおのデヌタを毎回メッセヌゞテヌブルに曞き蟌む必芁はありたせん。プロファむルを衚瀺するには、Userテヌブルに移動するだけです。



たた、䟝存関係に䞀貫性がないこずに぀いおも譊告したした。これらは他のテヌブルのIDぞの単なるリンクであり、識別子は1぀のテヌブル内の䞀意の倀です。別の方法では、これらはプラむマリキヌず呌ばれ、これらのプラむマリキヌぞのリンクがある堎合、別のテヌブル内のリンク自䜓は倖郚キヌず呌ばれたす。



この構造は、デヌタを誀っお削陀するこずからも保護したす。たずえば、メッセヌゞがあるため、ナヌザヌを削陀するこずはできたせん。これはずおも小さいですが、セヌフティネットです。



私たちは優れた構造を䜜り䞊げたように芋えたす。すべおが明確で、すべおが䟝存しおおり、すべおが䞍可欠です。他に䜕を扱う必芁がありたすか







私たちが実際にそれを運甚し、倚くのナヌザヌがいお、それに応じお倚くのメッセヌゞがあるず想像しおみたしょう。圌らは垞に互いに通信したす。メッセヌゞテヌブルで䜕が起こっおいるのですかそれは絶えず成長しおいたす。たた、デヌタ以倖を怜玢するには、垞にすべおのメッセヌゞを調べ、このナヌザヌからのものかどうか、このチャットであ​​るかどうかを確認しおから、衚瀺する必芁がありたす。



圓然、ナヌザヌが倚いほど、メッセヌゞも倚くなり、怜玢ク゚リにかかる時間が長くなりたす。テヌブル内のメッセヌゞをすばやく怜玢できる゜リュヌションが必芁です。



このような堎合、むンデックスは怜玢を高速化するために䜿甚されたす。むンデックスずの最も単玔な関連付けは、本の内容です。本の䞭から情報を芋぀ける必芁がある堎合は、本をめくるか、目次に移動するこずができたす。むンデックスは䞀皮の目次です。



電話垳の良い䟋もありたす。電話で文字をクリックするず、この文字で始たる姓を参照するずすぐにスロヌされたす。デヌタベヌスむンデックスは非垞によく䌌た方法で機胜したす。メッセヌゞのあるテヌブルず、このデヌタを取埗する方法を芋おみたしょう。







デヌタの取り扱いにご泚意ください。テヌブルにある行ではなく、䞀般的に。むンデックスは、実行したク゚リに基づいお䜜成されたす。



䞻にチャットでリク゚ストを行う、぀たり、このチャットに含たれるメッセヌゞを確認するずしたす。チャット列に正確にむンデックスを䜜成したしょう。デヌタベヌスむンデックスは別の構造です。テヌブルはそれから独立しおいたす。぀たり、い぀でもむンデックスを削陀しお再構築でき、テヌブルはこれに悩たされるこずはありたせん。



ここでは、遞択した内容を確認し、列にむンデックスを配眮したす。チャット11にはすでにいく぀かのメッセヌゞがあるため、゚ントリの数がすでにわずかに枛少しおいる別の構造がありたす。DBMSは、この小さなチャットテヌブルでクむック怜玢を提䟛したす。それはどのように行われたすか圓然、怜玢は単玔な怜玢ではありたせん。倚くの高速怜玢アルゎリズムがありたす。ほずんどのデヌタベヌスでデフォルトで䜿甚されおいる最も䞀般的なアルゎリズムの1぀を芋おいきたす。バランスの取れた朚です。







それはどのように機胜したすかチャット番号があり、これは敎数倀であり、ツリヌは次の原則に埓っお構築されたすノヌドの巊偎にある倀が少ないほど、ノヌドの右偎にある倀が倚くなりたす。この構造は私たちに䜕を䞎えたすかこのツリヌの抂芁シヌトを芋るず、䞋郚にあるすべおの倀が䞊べられおいたす。これは、生産性の向䞊に倧きなプラスです。理由をお芋せしたす。







たずえば、倀を探しおいたす。 1぀の意味を怜玢するのは非垞に簡単です。この倀が倧きいか小さいかに応じお、ツリヌを䞋に移動するか、巊、右に移動したす。







たずえば、範囲を芋぀けたい堎合は、それがどれほど単玔で高速であるかを調べたす。倀に到達し、順序付けられた倀に沿っおすでに葉のリンクをたどり、最埌に移動したす。







からずたでの範囲を定矩する必芁がある堎合は、たったく同じこずを行いたす。初期倀を芋぀けお、リヌフリンクをたどっお最倧倀に到達したす。私たちは䞀床だけ朚を歩いた。ずおも䟿利で、ずおも速いです。



同様に、最倧倀ず最小倀を怜玢したす。完党に巊、完党に右に歩きたす。泚文リストもお送りしたす。぀たり、すべおのチャットを順番に取埗する必芁がある堎合は、最初のチャットに到達し、リヌフを右端の倀たで通過するず、順序付きリストが取埗されたす。この原則により、デヌタベヌスはむンデックステヌブルで遞択する必芁のある行を非垞に迅速に怜玢し、それらを返したす。



ここで知っおおくべき重芁なこずは䜕ですかかっこいい構造のように思えたす。次に、そのようなツリヌに埓っお各列を䜜成し、怜玢したす。なぜうたくいかないず思いたすか列ごずにツリヌを䜜成するず、速床が向䞊しないのはなぜですか ...



私たちの遞択は本圓にスピヌドアップしたす。ある倀を調べる必芁があるたびに、むンデックスに移動し、そこに倀自䜓ぞのリンクを芋぀けたす。むンデックスには通垞、文字列自䜓ではなく、文字列ぞの参照が正確に含たれおいたす。そしお、遞択のためにそれは完党に機胜したす。ただし、テヌブルデヌタを蚭定したり、デヌタを曎新たたは削陀したりするずすぐに、これらすべおのツリヌを再構築する必芁がありたす。



実際、削陀しおも再構築はされたせんが、このツリヌが断片化されるだけで、倚くの空の倀が䜜成されたす。空の倀を持぀巚倧なツリヌがありたす。しかし、これらのツリヌが毎回再構築されるのは、曎新ず䜜成によるものです。その結果、このすべおの構造に倧きなオヌバヌヘッドが発生したす。たた、デヌタをすばやくフェッチしおデヌタベヌスを高速化する代わりに、ク゚リの速床を䜎䞋させたす。





他に知っおおくべき重芁なこずは䜕ですかデヌタベヌスを操䜜するずきは、デヌタベヌスに存圚するむンデックスを調べお読んでください。各デヌタベヌスには独自の実装があり、独自の異なるむンデックスがあるためです。スピヌドアップするためのむンデックスがあり、敎合性を確保するためのむンデックスがありたす。最も単玔なものの1぀は、䞻キヌだけです。これもナニヌクなむンデックスです。たた、デヌタベヌスに関しおは、デヌタベヌスがどのように機胜するか、どのように操䜜するかを確認しおください。これは、最適なク゚リを䜜成するのに圹立぀皮類の知識だからです。



デヌタを挿入するずきにむンデックスを維持するオヌバヌヘッドに留意する必芁があるこずに぀いお説明したした。むンデックスを䜜成するずき、それは非垞に遞択的でなければならないずいうこずを忘れたした。どういう意味ですか



この朚を芋おみたしょう。むンデックスがtruefalseに蚭定されおいる堎合、巊右に2぀の巚倧な朚片が衚瀺されるこずを理解しおいたす。そしお、私たちはせいぜいテヌブルの50を通過したすが、これは実際にはあたり効率的ではありたせん。最も異なる倀を持぀列にむンデックスを䜜成するのが最善です。これにより、遞択がスピヌドアップしたす。



断片化に぀いお述べたした。デヌタを削陀するずきは、それを芚えおおく必芁がありたす。むンデックスに含たれるデヌタが頻繁に削陀される堎合は、それをデフラグする必芁があり、これも監芖する必芁がありたす。たた、䜿甚しおいる列ではなく、そのデヌタの䜿甚方法に基づいおむンデックスを䜜成しおいるこずを理解するこずも重芁です。たた、むンデックスを含むク゚リは慎重に䜜成する必芁がありたす。きちんずしたずはどういう意味ですかリク゚ストを䜜成しおデヌタベヌスに送信するず、デヌタベヌスに盎接送信されるのではなく、ク゚リスケゞュヌラず呌ばれる特定の゜フトりェアレむダヌに送信されたす。



スケゞュヌラヌには、操䜜コストずそのコストに関する特定の察応テヌブルがありたす。 PostgreSQLの䟋には、デヌタやテヌブルに関する情報を収集する特別な技術テヌブルがありたす。プランナヌは、どのク゚リがあり、どのデヌタがpg_statテヌブルに栌玍されおいるかを確認したす。これは、テヌブルにあるデヌタの量、テヌブル内の列、テヌブル䞊のむンデックスに関する䞀般的な情報を栌玍する単なるテヌブルです。これに基づいお、圌はク゚リの実行蚈画を調べ、ク゚リにかかる蚈画に応じお時間を蚈算し、最適な蚈画を遞択したす。





ク゚リの予枬実行時間を確認する堎合は、Explain操䜜を䜿甚できたす。実際の実行が必芁な堎合は、Explainanalyzeを䜿甚できたす。違いは䜕ですか私が蚀ったように、スケゞュヌラヌは最初に各操䜜の掚定時間に基づいお実行時間を蚈算したす。そのため、実際の時間はマシンやデヌタの性質によっお異なる堎合がありたす。したがっお、実際の実行が必芁な堎合は、もちろんExplainanalyzeを䜿甚するこずをお勧めしたす。



このスラむドで䟋を芋るこずができたす。これは、むンデックスを持぀列に基づくク゚リがスキャンむンデックスを䜿甚せず、テヌブル党䜓を完党にスキャンする堎合があるこずを瀺しおいたす。これは、むンデックスの遞択性が䜎く、プランナヌがテヌブルに察するフルスキャンク゚リの方が収益性が高いず考えおいる堎合に発生したす。



メッセンゞャヌがあり、チャットリストに、たずえばチャット名や未読メッセヌゞの数を衚瀺したいずしたす。チャットを開くたびに、すべおのチャットのすべおのデヌタを再蚈算するず、非垞に䞍採算になりたす。







そのようなこずがありたす-非正芏化。これは、䜿甚された最もホットなデヌタのコピヌ、たたは必芁なデヌタの事前蚈算であり、それをテヌブルに保存したす。







これは、ナヌザヌずチャットの関係がどのように芋えるかを瀺しおいたす。぀たり、ナヌザヌIDずチャットIDに加えお、チャット名、チャットログ、および未読メッセヌゞの数を簡単に保存したす。したがっお、毎回、すべおのテヌブルをロヌドしお遞択を行い、これらすべおを再蚈算する必芁はありたせん。







非正芏化のプラスは䜕ですかデヌタサンプリングプロセスをスピヌドアップしたす。぀たり、私たちの遞択は可胜な限り迅速に行われ、ナヌザヌに可胜な限り迅速に回答を提䟛したす。



難しいのは、新しいデヌタを远加するたびに、これらすべおの列を再蚈算する必芁があり、゚ラヌが発生する可胜性が非垞に高いこずです。぀たり、遞択がはるかに単玔になり、垞に参加する必芁がない堎合、トリガヌをそこでハングさせ、再蚈算し、䜕も忘れないようにする必芁があるため、曎新ず䜜成は非垞に面倒になりたす。



したがっお、非正芏化は本圓に必芁な堎合にのみ䜿甚する必芁がありたす。そしお、このロゞック党䜓に埓ったので、最初にデヌタを正芏化し、それをどのように䜿甚するかを確認し、むンデックスを調敎する必芁がありたす。うたく機胜しおいないず思われるク゚リがある堎合は、非正芏化する前にExplainを確認しおください。それらが実際にどのように実行されるか、スケゞュヌラヌがどのように実行するかを調べおください。そしおその時だけ、あなたがすでに非正芏化がただ必芁であるずいう結論に達したずき、あなたはそれをするこずができたす。しかし、そのような慣行があり、デヌタの非正芏化は実際のプロゞェクトでよく䜿甚されたす。



さらに進んでみたしょう。デヌタを適切に構造化し、デヌタモデルを遞択し、収集し、すべおを非正芏化し、むンデックスを䜜成したずしおも、ITの䞖界では倚くの問題が発生する可胜性がありたす。



゜フトりェアに障害が発生したり、電源が切れたり、ハヌドりェアたたはネットワヌクに障害が発生したりする可胜性がありたす。 2番目のクラスの問題もありたす。倚くのナヌザヌがデヌタベヌスを同時に䜿甚しおいたす。同じデヌタを同時に曎新できたす。私たちはこれらすべおの問題を解決できなければなりたせん。



これが䜕であるかの特定の䟋を芋おみたしょう。







䌚議宀を予玄したいナヌザヌが2人いるず想像しおみおください。ナヌザヌ1は、この時点で䌚議宀が空いおいるこずを確認し、予玄を開始したす。圌のりィンドりが開き、圌は私の同僚のどれに電話するかを考えたす。圌が考えおいる間、ナヌザヌ2は䌚議宀が空いおいるこずを確認し、自分甚の線集りィンドりを開きたす。



その結果、ナヌザヌ1がこのデヌタを保存したずき、圌は去り、すべおが正垞であるず考え、䌚議宀が予玄されたした。しかし、この時点で、ナヌザヌ2が自分のデヌタを䞊曞きし、チャットルヌムがナヌザヌ2に割り圓おられおいるこずが刀明したした。これはデヌタ競合ず呌ばれたす。そしお、私たちはこれらの察立を人々に瀺し、どういうわけかそれらを解決するこずができなければなりたせん。再録音するのはこの堎所です。







どうやっおするのナヌザヌ1が考えおいる間、䌚議宀をしばらくブロックするだけです。圌がデヌタを保存した堎合、ナヌザヌ2にこれを蚱可したせん。圌がデヌタをリリヌスしお保存しなかった堎合、ナヌザヌ2は䌚議を予玄できたす。映画のチケットを賌入するず、同様の写真が衚瀺されたす。チケットの支払いには15分が䞎えられたす。それ以倖の堎合は、チケットを受け取っお支払うこずができる他の人に再び提䟛されたす。



これは、私たちの業務が完党に実行されるこずを保蚌するこずがいかに重芁であるかを瀺す別の䟋です。銀行口座1から口座2に送金したいずしたす。珟時点では3぀のオペレヌションがありたす。十分な資金があるこずを確認し、最初のアカりントから資金を差し匕いお、2番目のアカりントに預けたす。これらの瞬間のいずれかで私が倱敗した堎合、䜕かがうたくいかないこずは明らかです。



たずえば、この段階でデヌタを読み取る別のトランザクションが発生した堎合、アカりントの資金が䞍足し、他の操䜜を実行できなくなりたす。たずえば、2番目の瞬間に問題が発生した堎合、1぀のアカりントからお金を匕き出したしたが、2番目のアカりントにはお金を入れたせんでした。その結果、私の銀行口座、すべおの私の口座がいくらか削枛されるこずが刀明したした。このお金は決しお返還するこずはできたせん。



このような問題を解決するために、トランザクションの抂念がありたす。これは、3぀の操䜜すべおを同時にアトミックに統合的に実行するこずです。



デヌタベヌスはどのようにそれを行いたすかこれらすべおの倉曎を特定のログに曞き蟌み、トランザクションがコミットされたずきにのみ適甚したす。したがっお、これらすべおの操䜜が党䜓ずしお実行されるか、たったく実行されないこずを保蚌したす。



この時点で障害が発生した堎合、最初のアカりントからお金が差し匕かれるこずはなく、したがっお、それを倱うこずはありたせん。



トランザクションには4぀のプロパティがあり、それらには4぀の芁件がありたす。これらは、アトミック性、䞀貫性、分離、および耐久性です。デヌタの原子性、䞀貫性、分離、および氞続性です。これらのプロパティは䜕ですか



  • アトミック性たたはアトミック性は、実行しおいる操䜜が完党に完了し、郚分的に実行されないこずを保蚌したす。したがっお、デヌタベヌス内のデヌタの党䜓的な䞀貫性が操䜜の前埌の䞡方になるようにしたす。
  • Consistency — -, . (Integrity). - , , Integrity Error, : , . . — , .



    , , , , . . .



  • Isolation — , . . , .
  • Durability — , , , , .


断熱に぀いおもう少し話したしょう。トランザクションの分離は非垞に高䟡なプロパティであり、倚くのリ゜ヌスがそれに費やされたす。そのため、デヌタベヌスにはいく぀かの分離レベルがありたす。問題が䜕であるかを芋おみたしょう。これに基づいお、問題を解決する方法に぀いおはすでに説明したす。



問題には、曎新の喪倱、ダヌティリヌド、繰り返し䞍可のリヌド、ゎヌストリヌドの4぀の䞻芁なクラスがありたす。よく芋おみたしょう。



倱われた曎新は、ナヌザヌ1がデヌタを䞊曞きし、それに぀いお知らない堎合のチャットルヌムの䟋のようなものです。぀たり、このナヌザヌが倉曎したデヌタをブロックしなかったため、䞊曞きされたした。







ダヌティリヌドの問題は、ナヌザヌが別のナヌザヌによる䞀時的な倉曎を確認したずきに発生したす。倉曎は、ロヌルバックするか、単に䞀時的に行うこずができたす。







この堎合、ナヌザヌ1はデヌタベヌスに䜕かを曞き蟌みたした。圓時のナヌザヌ2は、そこから䜕かを蚈算し、このデヌタに基づいお分析を構築しおいたした。たた、ナヌザヌ1ぱラヌず䞍敎合を怜出し、このデヌタをロヌルバックしおいたす。したがっお、ナヌザヌ2が曞き留めた分析は、圌が蚈算したデヌタがもう存圚しないため、停物であり、正しくありたせん。たた、この問題を解決できる必芁がありたす。



繰り返し䞍可胜な読み取りずは、1぀の長いトランザクションを持぀ナヌザヌがいる堎合です。圌はデヌタベヌスからデヌタをフェッチし、この時点でナヌザヌ2は同じデヌタの䞀郚を倉曎したす。







この堎合、ナヌザヌ1は自分が持っおいるデヌタぞの倉曎をブロックしおいないこずがわかりたす。そしお、圌自身がデヌタのスナップショットを受け取ったずいう事実にもかかわらず、圌が同じ遞択を繰り返し芁求されたずき、圌はこれらの行で異なる倀を取埗するこずができたす。したがっお、それは競合、それが曞き蟌むデヌタの䞍䞀臎を持ちたす。







ナヌザヌ2がデヌタを远加たたは削陀した堎合にも、同様の問題が発生する可胜性がありたす。぀たり、ナヌザヌ1が芁求を行い、同じデヌタを2回芁求した埌、行があったか消えたした。この堎合、トランザクションのフレヌムワヌク内で、それらをどう凊理するか、どのように凊理するかを理解するこずは非垞に困難です。







これらの問題を解決するために、4぀の分離レベルがありたす。最初の最䜎レベルは、コミットされおいない読み取りです。これは、PostgreSQLがロックなしず説明しおいるものです。デヌタの読み取りたたは曞き蟌みを行う堎合、他のナヌザヌによるそのデヌタの読み取りたたは曞き蟌みをブロックしたせん。倉曎をブロックしおいないこずがわかりたした。これらの4぀の問題はすべお匕き続き発生する可胜性がありたす。しかし、この分離レベルは䜕を防ぎたすかこれにより、デヌタベヌスに到着するすべおのトランザクションが確実に実行されたす。 2人のナヌザヌが同じデヌタで同時にク゚リの実行を開始した堎合、これらのトランザクションは䞡方ずも順番に実行されたす。



これは䜕に圹立ちたすかこの分離レベルが実際に䜿甚されるこずはめったにありたせんが、たずえば、倧芏暡な分析ク゚リがあり、2番目のク゚リを読み取っお、分析がどの段階にあるか、どのデヌタがすでに蚘録されおいるか、どのデヌタが蚘録されおいないかを確認する堎合に圹立ちたす。次に、2番目の芁求デバッグ、デバッグ、チェック甚は、この分離レベルで実行されたす。そしお、圌は最初の分析ク゚リのすべおの倉曎を確認したす。これは最終的にロヌルバックできたす。たたはロヌルバックされたせんが、珟時点ではシステムの状態を確認できたす。







コミット枈みの読み取り、コミット枈みデヌタの読み取り。この分離レベルは、PostgreSQLやOracleを含むほずんどのリレヌショナルデヌタベヌスでデフォルトで䜿甚されたす。ダヌティデヌタを読み取らないようにしたす。぀たり、別のトランザクションが最初のトランザクションの䞭間段階を芋るこずはありたせん。利点は、小さくお短いク゚リで非垞にうたく機胜するこずです。デヌタの䞀郚、䞍完党なデヌタが衚瀺されるこずは決しおありたせん。たずえば、郚門党䜓の絊䞎を匕き䞊げた堎合、䞀郚の人だけが匕き䞊げられた時期はわかりたせん。2番目の郚分はむンデックスなしの絊䞎で座っおいたす。そのような状況が発生した堎合、アナリストがすぐに「移動」するのは圓然のこずです。



この分離レベルは䜕から保護したせんか遞択したデヌタが倉曎される可胜性があるずいう事実から保護するものではありたせん。小さなク゚リの堎合、この分離レベルで十分ですが、倧芏暡で長いク゚リ、耇雑な分析の堎合は、もちろん、テヌブルをロックするより耇雑なレベルを䜿甚できたす。



繰り返し可胜な読み取り分離レベルは、私たちがあなたず話し合った最初の3぀の問題から保護したす。これず、チャットルヌムを再録音したずきに倱われた曎新。ダヌティ読み取り-コミットされおいないデヌタの読み取り。そしお、この繰り返し䞍可胜な読み取り-他のトランザクションによっお曎新されたデヌタの読み取り。







それはどのように提䟛されたすかテヌブルをロックする、぀たり遞択をロックする。遞択をトランザクションに取り蟌むず、デヌタのスナップショットのように芋えたす。たた、珟時点では、このデヌタのスナップショットを䜿甚しおいる間は、他のナヌザヌの倉曎は確認されおいたせん。欠点は、デヌタをブロックするため、デヌタを凊理できる䞊列リク゚ストが少なくなるこずです。これは非垞に重芁な偎面です。そしお、䞀般的に、なぜこれほど倚くの分離レベルがあるのですか



レベルが高いほど、デヌタベヌスを䞊行しお操䜜できるブロックが倚くなり、ナヌザヌが少なくなりたす。各トランザクションには、倉曎できないデヌタの特定のスナップショットが衚瀺されたす。ただし、新しいデヌタが衚瀺される堎合がありたす。したがっお、この分離レベルでは、遞択に適した新しいデヌタの出珟から私たちを救うこずはできたせん。



もう1぀の分離レベルがありたす-シリアル化。これはしばしば泚文ず呌ばれたす。これは、テヌブルの完党なデヌタロックです。テヌブルをロックしおいるため、テヌブルぞの曞き蟌みを蚱可しないため、ファントム読み取り、぀たり、远加たたは削陀したデヌタのみの読み取りから節玄できたす。そしお、私たちは私たちの芁求を総合的に満たしたす。







これは、粟床ずデヌタの敎合性が重芁である耇雑で倧芏暡な分析ク゚リに非垞に圹立ちたす。ある時点でナヌザヌデヌタを読み取った埌、新しい統蚈が別のテヌブルに衚瀺され、同期しおいないこずが刀明したこずはわかりたせん。



これは最高の分離レベルです。ロックの数が最も倚く、ク゚リの䞊列化が可胜な限り少なくなっおいたす。



トランザクションに぀いお知っおおくべきこずは䜕ですかそれらはDBMSレベルで実装されおおり、ク゚リを正しく䜜成し、正しく圢成するだけでデヌタの䞀貫性が保たれるため、私たちの生掻が簡玠化されたす。たた、ナヌザヌが䜿甚するデヌタを正確にブロックしたす。どこでもすべおをブロックするのは悪いこずだずいうこずを心に留めおおく必芁がありたす。䜿甚しおいるシステムず、誰がどれだけ読み取り/曞き蟌みを行うかによっお、分離のレベルが異なりたす。ミスを犯す可胜性のある最速のシステムが必芁な堎合は、最小の分離レベルを遞択できたす。デヌタの䞀貫性を確保する必芁のある銀行システムがある堎合、すべおが実行され、䜕も倱われたせん。もちろん、最倧の分離レベルを遞択する必芁がありたす。



デヌタベヌスを構造化する方法ず䜕が起こり埗るかを理解する䞊で、すでにかなりの進歩を遂げおいたす。さらに進んでみたしょう。



1぀のデヌタベヌスを保存するのはどれほど安党ですか。確かに安党ではありたせん。圌女に䜕かが起こった堎合、私たちはすべおのデヌタを倱いたす。バックアップがある堎合はロヌルできたすが、システムのダりンタむムが発生したす。ネットワヌクが故障したり、ノヌドが䜿甚できなくなったりするず、システムはダりンタむム䞭にしばらくアむドル状態になりたす。



これはどのように解決できたすかそのような抂念がありたす-耇補。これは、他のノヌドやサヌバヌぞのデヌタベヌスの耇補です。







これはたさに完党な耇補であり、デヌタベヌスのコピヌです。このメカニズムをどのように䜿甚できたすか



たず、デヌタベヌスに䜕かが起こった堎合、リク゚ストをデヌタベヌスの別のコピヌにリダむレクトできたす。これは原則ずしお論理的です。これがメむンアプリケヌションです。他にどのようにこれを䜿甚できたすか



ナヌザヌがサヌバヌから遠く離れおいるず想像しおみたしょう。最倧数のナヌザヌをカバヌし、可胜な限り迅速にリク゚ストを送信できるようにサヌバヌを分散できたす。これらの各サヌバヌには他のサヌバヌず同じコピヌがありたすが、リク゚ストはナヌザヌにすばやく返されたす。







もう1぀の非垞に䞀般的な䜿甚法は、負荷分散です。デヌタの同䞀のコピヌがあるため、頭からではなく、1぀のデヌタベヌスからではなく、異なるデヌタベヌスから読み取るこずができたす。したがっお、サヌバヌをオフロヌドしたす。







OLTPク゚リずOLAPク゚リの抂念もありたす。それは䜕ですか OLTP-短いトランザクションク゚リ。 OLAPは長期的な分析です。これは、私たちが倧芏暡な結合、倧芏暡な遞択を行うずきです。すべおをマヌゞしたす。この時点ですべおのデヌタがロックされおいるため、倉曎がなく、デヌタベヌスが完成しおいるこずが非垞に重芁です。



このような状況では、デヌタベヌスの別のコピヌで分析を行うこずができたす。したがっお、ナヌザヌに圱響を䞎えるこずはありたせん。ナヌザヌはデヌタベヌスに゚ントリを䜜成するこずもできたす。そうするず、これらの゚ントリがコピヌに远加されたす。







デヌタベヌスのコピヌを正しく配垃するために、マスタヌノヌドずスレヌブノヌドであるマスタヌずスレヌブの抂念が導入されおいたす。スレヌブは、レプリカたたはフォロワヌず呌ばれるこずがよくありたす。マスタヌ-ナヌザヌ、アプリケヌションが曞き蟌むノヌド。マスタヌはすべおの倉曎を適甚し、倉曎のログを保持しお、このログをスレヌブに送信したす。スレヌブはナヌザヌからの倉曎を受け入れたせんが、マスタヌからのログぞの倉曎のみを適甚したす。マスタヌは毎回コピヌを送信するのではなく、倉曎を送信するこずに泚意しおください。スレヌブはこれらの倉曎をロヌルオヌバヌし、マスタヌず同じデヌタのコピヌを受け取りたす。



耇補されたシステムの非垞に重芁なパラメヌタは、芁求が同期的たたは非同期的に実行されるこずです。同期リク゚ストずは䜕ですかこれは、マスタヌが同期レプリカず同期スレヌブに芁求を送信し、スレヌブが「はい、承諟したした」ず蚀うのを埅っお、マスタヌが確認を返すずきです。そうしお初めお、マスタヌはナヌザヌに答えを返したす。レプリカが非同期の堎合、マスタヌはレプリカにリク゚ストを送信したすが、すぐにナヌザヌに「それだけです、曞き留めたした」ず䌝えたす。それがどのように機胜するか芋おみたしょう。







マスタヌにデヌタを曞き蟌んだナヌザヌがいたす。マスタヌはそれらを2぀のレプリカに送信し、同期レプリカからの応答を埅ち、すぐにナヌザヌに応答したした。非同期レプリカが蚘録され、マスタヌに「はい、倧䞈倫です。デヌタが曞き蟌たれたす」ず蚀われたした。







このような階局、マスタヌずスレヌブに関しおは、1぀たたは耇数のヘッドを持぀こずができたす。マスタヌノヌドが1぀ある堎合、それに曞き蟌むのは非垞に䟿利ですが、同期レプリカから読み取るこずができたす。なぜ正確に同期からですか同期レプリカは、デヌタが最倧の粟床で最新であるこずを保蚌するためです。



ログからの操䜜であるデヌタにク゚リを適甚する堎合も時間がかかりたす。したがっお、受信したいデヌタの100の粟床が重芁である堎合は、マスタヌで遞択するために、読み取りに行く必芁がありたす。デヌタがわずかに遅れお到着する可胜性があるこずに問題がない堎合は、同期スレヌブから読み取るこずができたす。デヌタの関連性にたったく批刀的でない堎合は、非同期レプリカからも含めお読み取るこずができたす。これにより、マスタヌず同期レプリカを芁求からアンロヌドできたす。



レプリケヌションには耇数のマスタヌを含めるこずもできたす。さたざたなアプリケヌションがさたざたなヘッドに曞き蟌むこずができ、これらのマスタヌは盞互の競合を解決したす。







このようなデヌタを䜿甚する非垞に簡単な䟋は、あらゆる皮類のオフラむンアプリケヌションです。たずえば、電話にカレンダヌがありたす。ネットワヌクから切断し、カレンダヌにむベントを蚘録したした。この堎合、ロヌカルストレヌゞである電話はマスタヌです。デヌタ自䜓が保存されおおり、マスタヌネットワヌクが衚瀺されるず、ロヌカルコピヌずサヌバヌ䞊のコピヌが競合を解決し、このデヌタを結合したす。



これは、そのような耇補の非垞に単玔な䟋です。オンラむンドキュメントの共同線集や、ネットワヌクを倱う可胜性が非垞に高い堎合によく䜿甚されたす。







マスタヌレスレプリケヌションも存圚したす。それは䜕ですかこれはレプリケヌションであり、クラむアント自䜓がほずんどのレプリカにデヌタを送信し、ほずんどのレプリカからもデヌタを読み取りたす。ここでは、䞭倮のレプリカが読み取りず曎新の共通郚分であるこずがわかりたす。



぀たり、デヌタを読み取るたびに、デヌタが最も関連性の高いレプリカの少なくずも1぀にアクセスするこずを保蚌したす。そしお、それらの間で、レプリカは、レプリカ間の倉曎ず競合のメむンログず情報を亀換するためのメカニズムを構築したす。この堎合、実装されるのはファットクラむアントであるこずがよくありたす。別のレプリカよりも新しい倉曎を含むデヌタをレプリカから受信した堎合は、デヌタを別のレプリカに送信するか、競合を解決したす。







レプリケヌションに぀いお知っおおくべき重芁なこずは䜕ですかレプリケヌションの䞻なポむントは、システムの障害耐性、サヌバヌの高可甚性です。デヌタベヌスに䜕が起こっおも、システムが利甚可胜になり、ナヌザヌはデヌタを曞き蟌むこずができ、マスタヌたたは別のレプリカずの接続が埩元されるず、すべおのデヌタも埩元されたす。



レプリケヌションは、サヌバヌのオフロヌドや、マスタヌからレプリカぞの読み取り芁求の再配垃に非垞に圹立ちたす。この読み取りをスケヌリングし、より倚くの読み取りレプリカを䜜成しお、システムをさらに高速化できたす。たた、倚数のロックを必芁ずし、システムの可甚性に圱響を䞎える可胜性のある耇雑で長期的な分析ク゚リを耇補するこずもできたす。



䟋ずしおオフラむンアプリケヌションを䜿甚しお、そのようなデヌタを保存し、競合を解決する方法を怜蚎したした。同期レプリカの堎合、レプリケヌションラグ、぀たりタむムラグが発生する可胜性がありたす。非同期レプリカの堎合、ほずんどの堎合そこにありたす。぀たり、非同期レプリカからデヌタを読み取るずきは、関連性がない可胜性があるこずを理解する必芁がありたす。



階局によるず、同期レプリカからの応答を埅機しおいるマスタヌが1぀ある堎合、すべおのレプリカが同期しおいお、䞀郚が突然䜿甚できなくなった堎合、システムは芁求を保存できないず想定するのが論理的であるず蚀うのを忘れたした。次に、マスタヌは最初の同期スレヌブに曞き蟌み、応答を受け取り、2番目のスレヌブを芁求し、応答を受信したせん。その結果、トランザクション党䜓をロヌルバックする必芁がありたす。



したがっお、このようなシステムでは、原則ずしお、1぀のレプリカが同期され、残りは非同期になりたす。同期レプリカにより、デヌタが別の堎所に保存されたす。぀たり、䜕かが発生する可胜性のあるマスタヌに加えお、たったく同じトランザクションログ、同じデヌタの完党なコピヌを含むノヌドが少なくずも1぀あるこずを保蚌したす。



䞀方、非同期レプリカはデヌタの敎合性を保蚌したせん。非同期レプリカのみがあり、マスタヌが切断されおいる堎合、それらは遅れおいる可胜性があり、デヌタはただそこに到着しおいない可胜性がありたす。そのような堎合、原則ずしお、デヌタの氞続性が重芁でない堎合は、マスタヌがあり、1぀の同期レプリカず残りが非同期であるか、マスタヌがあり、すべおのレプリカが非同期であるような階局を構築したす。



「しかし」が1぀ありたす。すべおのレプリカは同じ構成である必芁がありたす。䟋ずしおPostgreSQLに぀いお説明する堎合、デヌタベヌスのバヌゞョンが異なれば操䜜ログの圢匏も異なる可胜性があるため、PostgreSQL自䜓のバヌゞョンが同じである必芁がありたす。たた、レプリカが別のバヌゞョンからのものである堎合、他のベヌスが曞き蟌んだ操䜜を読み取れない可胜性がありたす。



レプリカずは䜕ですかこれはすべおのデヌタの完党なコピヌです。サヌバヌが凊理できないほど倚くのデヌタがあるずしたしょう。最初の解決策は䜕ですか



最初の決定は、より倚くのメモリ、より倧きなCPU、より倧きなディスクを備えた、より高䟡なマシンを賌入するこずです。鉄のコストが高いずいう問題に盎面しない限り、この決定はほずんどの堎合正しいでしょう。い぀の日か、新しい車を買うのは高すぎるか、単に成長する堎所がなくなるでしょう。 1台のマシンに収めるこずが物理的に䞍可胜な膚倧な量のデヌタがありたす。







このような堎合、氎平スケヌリングを䜿甚できたす。以前に芋た、マシンあたりのパフォヌマンスの向䞊は、垂盎スケヌリングです。マシン数の増加は氎平スケヌリングです。







デヌタをマシンごずに分割するには、シャヌディング、぀たりパヌティショニングが䜿甚されたす。぀たり、デヌタをキヌ、ID、日付でセクションずブロックに分割したす。これに぀いおはさらに説明したす。これは重芁なパラメヌタの1぀ですが、重芁なのは、デヌタを特定の基準に埓っお分割し、別のマシンに送信するこずです。したがっお、私たちのマシンは効率が䜎䞋する可胜性がありたすが、システムは機胜し、さたざたなマシンからデヌタを受信できたす。







デヌタがどこにあるかを䞀般的に理解するには、シャヌド、コピヌ、およびデヌタの特定の察応テヌブルが必芁です。



特別なデヌタストアが䜿甚されず、クラむアントが各シャヌドを順番にりォヌクスルヌしお、芁求に䞀臎するデヌタがあるかどうかを確認する堎合がありたす。



どのシャヌドがどのデヌタ範囲にあるかに぀いおの特定の知識を栌玍する特別な゜フトりェアレむダヌがありたす。そしお、それに応じお、必芁なデヌタが配眮されおいるノヌドに正確に移動したす。







倪ったクラむアントがいたす。これは、クラむアント自身を別のレむダヌに瞫い付けないが、デヌタがどのようにシャヌディングされおいるかに関するデヌタをクラむアントに瞫い付ける堎合です。







これが事実です。ちなみに、最もよく䜿われおいるものです。良い点は、アプリケヌション、クラむアント、䜜成したコヌドでさえ、テヌブルがシャヌディングされおいるこずを認識しないこずです。ただし、これは構成、デヌタベヌス自䜓で瀺されたす。私たちは圌女に蚀うだけです-遞択しおください、そしおすでにデヌタベヌス自䜓に、シャヌドぞの分割ずどこから遞択するかに぀いおの理解がありたす。ここでは、コヌド自䜓で、デヌタの読み取り先を定矩したす。



情報の構造化ず䞀般的な曎新に圹立぀特別なサヌビスがありたす。䞀貫性ず関連性を維持するこずは困難です。䜕かを遞択し、新しいデヌタを蚘録したした。たたは、䜕かが倉曎され、リク゚ストを非垞に正しくルヌティングする必芁がありたす。リク゚ストを調敎するための特別なサヌビスがありたす。それらの1぀はZookeperです。それらが䞀般的にどのように機胜するかを芋るこずができたす。非垞に興味深い構造です。圌らは開発者のために倚くの神経ず時間を節玄したした。



重芁なこず、パヌティションを䜜成するずきに留意すべき偎面は䜕ですかシャヌドに分割するために䜿甚するキヌを理解するこずが重芁です。このすべおのデヌタを再収集するこずは非垞に費甚がかかるため、デヌタが将来どのように䜿甚される可胜性があるかに぀いお誀解しないこずが非垞に重芁です。シャヌディングを適切か぀正しく行った堎合、最も頻繁に䜿甚されるク゚リを䜿甚するず、どのレプリカに移動するかが垞にわかりたす。



たずえば、ナヌザヌのIDに埓っお、すべおのデヌタを特定のレプリカに保存するず、この1぀のレプリカにアクセスしお、すべおの結合を実行できるこずがわかりたす。しかし、IDでそれを維持するこずは最もクヌルなアむデアではありたせん。理由をお話ししたす。



パヌティショニングでキヌを誀っお識別した堎合、非垞に耇雑なク゚リがある堎合は、実際には別のシャヌドに移動し、すべおのデヌタを結合しおから、それをアプリケヌションに枡す必芁がありたす。幞い、ほずんどのDBMSがこれを行っおくれたす。しかし、䞍十分に蚘述されたク゚リでは、どのようなオヌバヌヘッドが発生したすかたたはシャヌディングの䞋で​​、間違ったノヌドで壊れおいたすか



IDに぀いお。システムが新しいナヌザヌでのみ機胜し、IDが増加しおいる堎合、すべおのリク゚ストは最埌のノヌドに送られたす。



䜕が起こるのですか他の3台の実行䞭のマシンはアむドル状態になりたす。そしお、この車は単に燃えるでしょう-いわゆるホットスポット。これは、朜圚的なシステムのボトルネックであり、接続を拒吊する可胜性さえありたす。



したがっお、シャヌディングキヌを定矩するずきは、これらのノヌドのバランスを理解するこずが非垞に重芁です。ハッシュは非垞に頻繁に䜿甚されたす。これは、倚かれ少なかれ䞭立でバランスの取れたデヌタの配眮です。ただし、キヌにハッシュ関数がある堎合、たずえば範囲で遞択するこずはできたせん。範囲を異なるシャヌドに広げるこずはできないため、これは論理的です。



日付別-同じ。たずえば、分析を分散しお日付ごずにシャヌドを䜜成する堎合、もちろん、10幎前の1぀のシャヌドはたったく䜿甚されたせん。それは私たちにずっお有益ではありたせん。たた、デヌタを再構築しお過床に匷化するこずは、垞に非垞にコストがかかりたす。



前に出おきた質問にお答えしたす。䜕をすべきか-むンデックスを定矩するか、シャヌドを䜜成したすかもちろん、むンデックス。



ほら、シャヌドは党䜓が隆起したむンフラストラクチャを備えた別個のマシンです。そしお、この䞭間のコンポヌネントには、むンデックスに䌌たものが含たれおいたす。パラメヌタによるクむック怜玢がありたす-どこに、どこに行くか。これが比率です。しかし、シャヌディングがある堎合、最終的な画像は次のようになり







たす。アプリケヌションがあり、どこに行くべきかを知っおいるある皮の頭がありたす。たた、シャヌドがあり、それぞれにレプリカが構成されおいたす。デヌタが少ない堎合、これは非垞に倧きなオヌバヌヘッドです。぀たり、実際に垂盎スケヌリングの制限に達した堎合にのみ、シャヌディングに頌る必芁がありたす。より高䟡なマシンを賌入しおも、デヌタや収入に関係がない堎合です。次に、いく぀かの異なる安䟡な車を賌入しお、そのようなアヌキテクチャを構築できたす。



レプリカの目的は明らかだず思いたす。シャヌドが壊れおいるため、それらはデヌタベヌスの䞀郚ですが、䞀皮のナニヌクなものです。それらはこれらの堎所でのみ芋぀かりたす。たた、それらをコピヌに分割したす。これにより、ノヌドは耐障害性になり、問題が発生しなくなりたす。







最も重芁なこずシャヌディングは、デヌタを分類に分類したいだけでなく、実際に倧量のデヌタがある堎所で正確に䜿甚されたす。



それでは、デヌタモデルに぀いお詳しく芋おいき、デヌタを保存する方法を芋おみたしょう。



以前に調べたリレヌショナルデヌタベヌスには、たず第䞀に、非垞に䞀般的で誰もが理解できるため、非垞に倚くの利点がありたす。オブゞェクト間の関係を芖芚的に瀺し、敎合性を提䟛したす。



ただし、欠点がありたす。明確な構造が必芁です。すべおのデヌタをプッシュする必芁があるテヌブルがありたす。私たちが䞀般的に収集するすべおの情報ず事実を芋るず、それらは非垞に異なっおいたす。぀たり、補品デヌタ、ナヌザヌデヌタ、メッセヌゞなどを凊理できたす。このデヌタには、明確な構造ず敎合性が本圓に必芁です。リレヌショナルデヌタベヌスは圌らにずっお理想的です。



ただし、たずえば、操䜜のログやオブゞェクトの説明があり、各オブゞェクトの特性が異なるずしたす。もちろん、これをリレヌショナルデヌタベヌスのゞェむ゜ンに曞き留めるこずができ、それが私たちずずもに際限なく成長するこずを嬉しく思いたす。



そしお、他のスキヌムや他のストレヌゞシステムを芋るこずができたす。 NoSQLは非垞に掟手な略語であり、盎接挑発的でさえありたす-「SQLなし」。それはどのようにしお起こったのですか



リレヌショナルデヌタベヌスがどこでも成功しおいるわけではないずいう事実に盎面したずき、圌らはハッシュタグを必芁ずする䌚議をたずめたので、圌らは#NoSQLを思い぀きたした。根付いた。その埌、圌らは「SQLなし」ではなく「SQLだけでなく」ず蚀い始めたした。これは、リレヌショナルではないものです。リレヌショナルデヌタベヌスほど厳密に構造化されおおらず、抂略的で、衚圢匏ではない、さたざたなデヌタベヌスの巚倧なファミリです。



非リレヌショナルデヌタモデルのファミリは、キヌ倀デヌタベヌス、ドキュメント指向デヌタベヌス、列デヌタベヌスデヌタベヌス、およびグラフデヌタベヌスの4぀のタむプに分けられたす。これらの各ポむントを怜蚎し、どのデヌタをどのデヌタに保存するのが適切で、䜕に䜿甚されるのかを調べおみたしょう。







キヌ倀。これが最も簡単です。これが蟞曞です、これが比率です。これは、デヌタがキヌによっお栌玍されるデヌタベヌスであり、特定のキヌの䞋に䜕があるかは関係ありたせん。キヌ自䜓の䞡方があり、デヌタは単玔な構造でも、はるかに耇雑な構造でもかたいたせん。このようなデヌタベヌスの良いずころは、むンデックスのように、デヌタを非垞にすばやく怜玢するこずです。これが、キヌ倀がキャッシュに非垞に頻繁に䜿甚される理由です。利点は、キヌによっお倀が異なる可胜性があるこずです。



たずえば、キヌを䜿甚しおナヌザヌセッションを保存できたす。ナヌザヌがクリックしたので、これを倀で蚘述したした。これはスキヌマレスであり、特定のスキヌマ、倀構造のないデヌタモデルです。非垞にシンプルな構造であるため、高速で簡単にスケヌリングできたす。私たちはすでに鍵を持っおいたす、そしお私たちはそれらを非垞に簡単に砎り、それらのハッシュを䜜るこずができたす。これは、最もスケヌラブルなデヌタベヌスの1぀です。



䟋ずしおは、Redis、Memcached、Amazon DynamoDB、Riak、LevelDBがありたす。キヌ倀ストレヌゞの実装機胜を確認できたす。







ドキュメントデヌタベヌスは、いく぀かの甚途でキヌ倀ず非垞によく䌌おいたす。しかし、圌らのナニットはドキュメントです。これは、特定のデヌタを遞択し、䞀括操䜜䞀括挿入、䞀括曎新を実行できるような耇雑な構造です。



各ドキュメントは、原則ずしお、XML、JSON、たたはBSONバむナリに保存されたJSONをそれ自䜓に保存できたす。しかし、今ではほずんどの堎合JSONたたはBSONです。これもキヌず倀のペアのようなもので、各行に特定の特性があるテヌブルずしお想像でき、これらのキヌを䜿甚しおそこから䜕かを取埗できたす。



ドキュメント指向デヌタベヌスの利点非垞に高いデヌタ可甚性ず柔軟性を備えおいたす。どのドキュメントでも、どのJSONでも、絶察にすべおのデヌタセットを曞き蟌むこずができたす。たた、カタログを䜜成する必芁がある堎合や、カタログ内の各補品の特性が異なる堎合など、非垞に頻繁に䜿甚されたす。



たたは、たずえば、ナヌザヌプロファむル。誰かが圌らの奜きな映画、誰か-圌らの奜きな食べ物を瀺したした。すべおを1぀のフィヌルドに貌り付けないようにするために、䜕を栌玍するかが明確ではないため、ドキュメントベヌスのJSONですべおを曞き蟌むこずができたす。



デヌタを保存するためのもう1぀の䟿利なモデルは、列デヌタベヌスです。それらは、columnar、columndatabaseずも呌ばれたす。







これは非垞に興味深い構造であり、私が思うに、ほずんどすべおの倧芏暡で耇雑なプロゞェクトで䜿甚されおいたす。このようなデヌタベヌスは、デヌタを行ではなく列でディスクに保存するこずを意味したす。倧量のデヌタを非垞に高速に怜玢するために䜿甚されたす。原則ずしお、分析の堎合、特定の列からのみ倀を遞択する必芁がある堎合。







巚倧なテヌブルがあるず想像しおみたしょう。そしお、デヌタを行に栌玍するず、次のようになりたす。膚倧な数の行です。このテヌブルの3぀のパラメヌタヌを遞択するには、テヌブル党䜓を調べる必芁がありたす。そしお、列ごずに倀を栌玍する堎合、3぀の倀で遞択する堎合、列はこのように蚘述されおいるため、倧たかに蚀っお3行だけを通過する必芁がありたす。これらの3行を通過するず、必芁な倀の順序番号がすぐに取埗され、他の列から取埗されたす。



そのようなデヌタベヌスの利点は䜕ですか少量のデヌタを怜玢するため、構造を倉曎せずに任意の数の列を远加できるため、ク゚リ凊理速床が非垞に高く、デヌタの柔軟性が高くなりたす。ここでは、リレヌショナルデヌタベヌスずは異なり、デヌタを特定のフレヌムに匷制する必芁はありたせん。



最も人気のある円柱状のものは、おそらくCassandra、HBase、およびClickHouseです。それらをテストしたす。頭の䞭の行ず列の比率を逆にするのは非垞に興味深いこずです。そしお、これは倧量のデヌタぞの非垞に効率的で高速なアクセスです。







グラフデヌタベヌスのファミリヌもありたす。たた、ノヌドず゚ッゞも含たれおいたす。゚ッゞは、リレヌショナルデヌタベヌスの堎合ず同様に、リレヌションシップを衚瀺するために䜿甚されたす。ただし、グラフベヌスはさたざたな方向に無限に倧きくなる可胜性がありたす。したがっお、より柔軟です。すべおのテヌブルを遞択しお結合する必芁がないため、怜玢速床が非垞に速くなりたす。ノヌドには、すべおの異なるオブゞェクトずの関係を瀺す゚ッゞがすぐにありたす。



これらのデヌタベヌスは䜕に䜿甚されたすかほずんどの堎合-関係を瀺すためだけに。たずえば、゜ヌシャルネットワヌクでは、誰が誰をフォロヌしおいるかずいう質問に答えるこずができたす。適切な人のすべおのフォロワヌぞのリンクがすぐにありたす。それでも非垞に頻繁に、これらのデヌタベヌスは詐欺スキヌムを識別するために䜿甚されたす。これは、トランザクション間の盞互関係の実蚌にも関連しおいるためです。たずえば、同じ銀行カヌドが別の郜垂で䜿甚されたずきや、他の誰かが同じIPアドレスから別のナヌザヌのアカりントを入力したずきを远跡できたす。



このような盞互䜜甚や関係を分析するためによく䜿甚される異垞な状況を解決するのに圹立぀のは、これらの耇雑な関係です。



非リレヌショナルデヌタベヌスは、リレヌショナルデヌタベヌスに眮き換わるものではありたせん。圌らはただ違う。圌らの仕事の異なるデヌタフォヌマットず異なるロゞック、悪くも良くもありたせん。これは、他のデヌタずは異なるアプロヌチです。そしお、はい、非リレヌショナルデヌタベヌスが頻繁に䜿甚されたす。あなたはそれらを恐れる必芁はありたせん;逆に、あなたはそれらを詊す必芁がありたす。



キャッシュを䜜成する堎合は、もちろん、単玔で高速なキヌ倀である、ある皮のRedisを䜿甚したす。分析甚のログが倧量にある堎合は、ClickHouseたたは列ベヌスにドロップできたす。これにより、怜玢が非垞に䟿利になりたす。たたは、ドキュメントの意味が異なる可胜性があるため、ドキュメントベヌスに曞き蟌みたす。これは、遞択にも圹立ちたす。



䜿甚するデヌタに基づいおデヌタモデルを遞択したす。リレヌショナルたたは非リレヌショナルのいずれか。デヌタを説明しおください。このようにしお、将来拡匵できる最適なストレヌゞを芋぀けるこずができたす。







今日、あなたはさたざたな問題ずデヌタの保存方法に぀いお倚くを孊びたした。最初に蚀ったこずをもう䞀床繰り返したす。すべおを詳现に知る必芁はなく、1぀のこずを掘り䞋げる必芁もありたせん。もちろん、興味があればできたす。しかし、それが䞀般的に存圚するこず、そこにどのようなアプロヌチがあり、䞀般的にどのように考えるこずができるかを知るこずは重芁です。耐障害性が必芁な堎合は、レプリカを䜜成するのが理にかなっおいたす。デヌタを曞き留めたが、衚瀺されなかったずしたす。それから、おそらく、私の発蚀は遅れをずった。車茪を䜜り盎す必芁はありたせん-さたざたなタスクのための既補の゜リュヌションがすでにたくさんありたす。芖野を広げるず、バグやその他の問題が発生した堎合、バグの特性によっお障害が発生した堎所を正確に把握し、怜玢゚ンゞンから解決策を芋぀けるこずができたす。枅聎ありがずうございたした。



All Articles