グロヌバルはデヌタを保存するための䌝家の宝刀です。 朚。 パヌト2

グロヌバルはデヌタを保存するための䌝家の宝刀です。 朚。 パヌト2はじめに - パヌト 1 を参照しおください。

3. グロヌバルを䜿甚する堎合の構造のバリ゚ヌション

順序付きツリヌのような構造には、さたざたな特殊なケヌスがありたす。グロヌバルを操䜜するずきに実甚的な䟡倀があるものを考えおみたしょう。

3.1 特殊なケヌス 1. 分岐のない XNUMX ぀のノヌド


グロヌバルはデヌタを保存するための䌝家の宝刀です。 朚。 パヌト2グロヌバルは配列のように䜿甚できるだけでなく、通垞の倉数のようにも䜿甚できたす。たずえば、カりンタヌずしおは次のようになりたす。

Set ^counter = 0  ; устаМПвка счётчОка
Set id=$Increment(^counter) ;  атПЌарМПе ОМкреЌеМтОрПваМОе

この堎合、グロヌバルは、その意味に加えお、分岐を持぀こずもできたす。䞀方が他方を排陀するこずはありたせん。

3.2 特殊なケヌス 2. XNUMX ぀の頂点ず倚数の枝

䞀般に、これは叀兞的なキヌず倀のベヌスです。そしお、倀のタプルを倀ずしお保存するず、䞻キヌを持぀ごく普通のテヌブルが埗られたす。

グロヌバルはデヌタを保存するための䌝家の宝刀です。 朚。 パヌト2

グロヌバルにテヌブルを実装するには、列の倀から行を自分で生成し、䞻キヌを䜿甚しおグロヌバルに保存する必芁がありたす。読み取り時に文字列を再床列に分割できるようにするには、次を䜿甚できたす。

  1. 区切り文字。
    Set ^t(id1) = "col11/col21/col31"
    Set ^t(id2) = "col12/col22/col32"
  2. 各フィヌルドが所定のバむト数を占める厳栌なスキヌム。リレヌショナル デヌタベヌスで行われるのず同じです。
  3. 倀の文字列を䜜成する特別な関数 $LB (キャッシュで利甚可胜)。
    Set ^t(id1) = $LB("col11", "col21", "col31")
    Set ^t(id2) = $LB("col12", "col22", "col32")

興味深いこずに、グロヌバルを䜿甚しおリレヌショナル デヌタベヌスのセカンダリ むンデックスず同様のこずを行うのは難しくありたせん。このような構造をむンデックス グロヌバルず呌びたしょう。むンデックス グロヌバルは、メむン グロヌバルの䞻キヌの䞀郚ではないフィヌルドを迅速に怜玢するための補助ツリヌです。これに入力しお䜿甚するには、远加のコヌドを蚘述する必芁がありたす。

最初の列にグロヌバル玢匕を䜜成したしょう。

Set ^i("col11", id1) = 1
Set ^i("col12", id2) = 1

ここで、最初の列の情報をすばやく怜玢するには、グロヌバルな情報を調べる必芁がありたす。 ^i そしお、最初の列の目的の倀に察応する䞻キヌ (id) を芋぀けたす。

倀を挿入するず、必芁なフィヌルドの倀グロヌバルずむンデックス グロヌバルの䞡方をすぐに䜜成できたす。信頌性を高めるために、すべおをトランザクションにラップしたしょう。

TSTART
Set ^t(id1) = $LB("col11", "col21", "col31")
Set ^i("col11", id1) = 1
TCOMMIT

Mでのやり方の詳现 グロヌバルのテヌブル, セカンダリむンデックスの゚ミュレヌション.

このようなテヌブルは、行の挿入/曎新/削陀の関数が COS/M で蚘述されコンパむルされおいれば、埓来のデヌタベヌスず同じくらい速く (たたはさらに速く) 動䜜したす。TSTART および TCOMMIT コマンド (トランザクション) の䜿甚を含む、1 ぀の 2 列テヌブルぞの䞀括 INSERT および SELECT のテストでこのステヌトメントを確認したした。

同時アクセスず䞊列トランザクションを䜿甚するより耇雑なシナリオはテストしおいたせん。

トランザクションを䜿甚しない堎合、挿入率は 778 䞇倀あたり 361 挿入/秒でした。
300 億の倀 - 422 挿入/秒。

トランザクションを䜿甚する堎合 - 572M 挿入の堎合、082 挿入/秒。すべおの操䜜はコンパむルされた M コヌドから実行されたした。
ハヌドドラむブはSSDではなく通垞のものです。ラむトバック付きの RAID5。 Phenom II 1100T プロセッサヌ。

同様の方法で SQL デヌタベヌスをテストするには、ルヌプ内で挿入を実行するストアド プロシヌゞャを䜜成する必芁がありたす。 MySQL 5.5 (InnoDB ストレヌゞ) をテストしたずき、この方法を䜿甚するず、11 秒あたり XNUMXK を超える挿入数は埗られたせんでした。
はい、グロヌバル䞊のテヌブルの実装は、リレヌショナル デヌタベヌスよりも耇雑に芋えたす。したがっお、グロヌバル䞊の産業デヌタベヌスには SQL アクセスがあり、衚圢匏デヌタの操䜜を簡玠化できたす。

グロヌバルはデヌタを保存するための䌝家の宝刀です。 朚。 パヌト2䞀般に、デヌタ スキヌマが頻繁に倉曎されず、挿入速床が重芁でなく、デヌタベヌス党䜓を正芏化されたテヌブルの圢匏で簡単に衚珟できる堎合は、より高いレベルの抜象化が提䟛される SQL を䜿甚した方が簡単です。 。

グロヌバルはデヌタを保存するための䌝家の宝刀です。 朚。 パヌト2この特定のケヌスで私が瀺したかったのは、 グロヌバルは、他のデヌタベヌスを䜜成するためのコンストラクタヌずしお機胜できたす。。他の蚀語を蚘述できるアセンブラのようなもの。グロヌバルで類䌌物を䜜成する方法の䟋を次に瀺したす。 キヌず倀、リスト、セット、衚圢匏、ドキュメント指向のデヌタベヌス。

最小限の劎力で䜕らかの非暙準デヌタベヌスを䜜成する必芁がある堎合は、グロヌバルに泚目する必芁がありたす。

3.3 特殊なケヌス 3. XNUMX レベルのツリヌ、第 XNUMX レベルの各ノヌドには固定数の分岐がありたす

グロヌバルはデヌタを保存するための䌝家の宝刀です。 朚。 パヌト2おそらくご想像のずおり、これはグロヌバル䞊のテヌブルの代替実装です。この実装を以前の実装ず比范しおみたしょう。

2 レベルのツリヌ䞊のテヌブルず単䞀レベルのツリヌ䞊で。

コンズ
プロたち

  1. ノヌドの数を列の数ず同じに蚭定する必芁があるため、挿入が遅くなりたす。
  2. ディスク容量の消費量が増加したす。列名を含むグロヌバル むンデックス (配列むンデックスずしお理解される) はディスク領域を占有し、行ごずに耇補されるためです。

  1. 文字列を解析する必芁がないため、個々の列の倀に高速にアクセスできたす。私のテストによるず、11,5 ぀の列では 2% 高速になり、倚数の列ではそれ以䞊高速になりたした。
  2. デヌタスキヌマの倉曎が容易になる
  3. より明確なコヌド

結論 誰にずっおもそうではありたせん。速床はグロヌバルの最も重芁な利点の 1 ぀であるため、リレヌショナル デヌタベヌスのテヌブルよりも高速に実行されない可胜性が高く、この実装を䜿甚する意味はほずんどありたせん。

3.4 䞀般的なケヌス。暹朚ず秩序ある暹朚

ツリヌずしお衚珟できるデヌタ構造は、グロヌバルに完党に適合したす。

3.4.1 サブオブゞェクトを持぀オブゞェクト

グロヌバルはデヌタを保存するための䌝家の宝刀です。 朚。 パヌト2

これは、グロヌバルの䌝統的な䜿甚の領域です。医療珟堎には、膚倧な数の病気、薬、症状、治療法がありたす。患者ごずに 99 䞇ものフィヌルドを含むテヌブルを䜜成するのは非合理的です。さらに、フィヌルドの XNUMX% は空になりたす。

SQL デヌタベヌスのテヌブルを想像しおください: 「患者」 - 100 フィヌルド、「医孊」 - 000 フィヌルド、「治療」 - 100 フィヌルド、「合䜵症」 - 000 フィヌルドなど。等々。あるいは、それぞれが特定の皮類の患者 (重耇する可胜性がありたす!)、治療法、薬剀、およびこれらのテヌブル間の接続甚のさらに数千のテヌブルごずに、䜕千ものテヌブルからなるデヌタベヌスを䜜成するこずもできたす。

グロヌバルは、空の列に䜙分なディスク領域を無駄にするこずなく、各患者の病歎、さたざたな治療法、および薬の䜜甚の正確な説明をツリヌ圢匏で䜜成できるため、医療に最適です。関係の堎合に圓おはたりたす。

グロヌバルはデヌタを保存するための䌝家の宝刀です。 朚。 パヌト2グロヌバルを䜿甚するず、人物に関するデヌタを含むデヌタベヌスを䜜成するのに䟿利です、クラむアントに関するさたざたな情報を最倧限に蓄積し、䜓系化するこずが重芁な堎合。これは医療、銀行、マヌケティング、アヌカむブなどの分野で需芁がありたす

.
もちろん、SQL では、いく぀かのテヌブルだけを含むツリヌを゚ミュレヌトするこずもできたす (EAV, 1,2,3,4,5,6,7,8,9,10) ただし、これは非垞に耇雑であり、速床が遅くなりたす。基本的に、テヌブルで動䜜するグロヌバルを䜜成し、テヌブルでのすべおの䜜業を抜象化レむダヌの䞋に隠す必芁がありたす。䞊䜍レベルのテクノロゞ (SQL) を䜿甚しお䞋䜍レベルのテクノロゞ (グロヌバル) を゚ミュレヌトするのは間違いです。䞍適切。

巚倧なテヌブルのデヌタ スキヌマの倉曎 (ALTER TABLE) にかなりの時間がかかるこずは呚知の事実です。たずえば、MySQL は、叀いテヌブルから新しいテヌブル (テスト枈みの MyISAM、InnoDB ゚ンゞン) に情報を完党にコピヌするこずによっお、ALTER TABLE ADD|DROP COLUMN を実行したす。これにより、数十億のレコヌドを含む皌働䞭のデヌタベヌスが数週間ずは蚀わないたでも、数日間ハングアップする可胜性がありたす。

グロヌバルはデヌタを保存するための䌝家の宝刀です。 朚。 パヌト2グロヌバルを䜿甚する堎合、デヌタ構造を倉曎しおも費甚はかかりたせん。 い぀でも、階局の任意のレベルで、任意のオブゞェクトに必芁な新しいプロパティを远加できたす。ブランチの名前倉曎に関連する倉曎は、実行䞭のデヌタベヌスのバックグラりンドで実行できたす。


したがっお、膚倧な数のオプションのプロパティを持぀オブゞェクトを保存する堎合には、グロヌバルが最適な遞択肢ずなりたす。

さらに、グロヌバルではすべおのパスが B ツリヌであるため、どのプロパティにも瞬時にアクセスできるこずを思い出しおください。

䞀般に、グロヌバル デヌタベヌスは、階局情報を栌玍する機胜を備えたドキュメント指向デヌタベヌスの䞀皮です。したがっお、ドキュメント指向のデヌタベヌスは、医療蚘録の保存の分野で䞖界のデヌタベヌスず競合するこずができたす。 しかし、それはただ党く同じではありたせん比范のために MongoDB を取り䞊げおみたしょう。 このドメむンでは 次の理由でグロヌバルに負けたす。

  1. ドキュメントのサむズ。 ストレヌゞナニットは、最倧玄 16MB の JSON 圢匏 (より正確には BSON) のテキストです。この制限は、巚倧な JSON ドキュメントが JSON デヌタベヌスに保存され、フィヌルドからアクセスされた堎合に、解析䞭に JSON デヌタベヌスの速床が䜎䞋しないようにするために特別に蚭けられたした。この文曞には患者に関するすべおの情報が含たれおいる必芁がありたす。患者蚘録がいかに分厚いかは誰もが知っおいたす。カヌドの最倧サむズが 16 MB であるため、MRI ファむル、X 線スキャン、その他の研究が含たれる疟患カヌドを持぀患者は盎ちに終了したす。グロヌバルの XNUMX ぀のブランチに、ギガバむトやテラバむトの情報を含めるこずができたす。原則的にはこれで終わらせるこずができたすが、私は続けたす。
  2. 患者のカルテ内の新しいプロパティの意識/倉曎/削陀の時間。 このようなデヌタベヌスは、マップ党䜓をメモリに読み取り (これは倧量です!)、BSON を解析し、新しいノヌドを远加/倉曎/削陀し、むンデックスを曎新し、BSON にパックしおディスクに保存する必芁がありたす。グロヌバルは、特定のプロパティにアクセスしお操䜜するだけで枈みたす。
  3. 個々のプロパティにすばやくアクセスできたす。 ドキュメント内に倚くのプロパティがあり、そのマルチレベル構造がある堎合、グロヌバル内の各パスが B ツリヌであるため、個々のプロパティぞのアクセスが高速になりたす。 BSON では、ドキュメントを線圢に解析しお目的のプロパティを芋぀ける必芁がありたす。

3.3.2 連想配列

連想配列は (ネストされた配列であっおも) グロヌバルに完党に適合したす。たずえば、PHP からのこのような配列は、最初の図 3.3.1 に衚瀺されたす。

$a = array(
  "name" => "Vince Medvedev",
  "city" => "Moscow",
  "threatments" => array(
    "surgeries" => array("apedicectomy", "biopsy"),
    "radiation" => array("gamma", "x-rays"),
    "physiotherapy" => array("knee", "shoulder")
  )
);

3.3.3 階局型ドキュメント: XML、JSON

グロヌバルにも簡単に保存できたす。様々なレむアりトで収玍が可胜です。

XML
XML を解析しおグロヌバルにする最も簡単な方法は、タグ属性をノヌドに栌玍するこずです。たた、タグ属性にすばやくアクセスする必芁がある堎合は、それらを別のブランチに移動できたす。

グロヌバルはデヌタを保存するための䌝家の宝刀です。 朚。 パヌト2

<note id=5>
<to>Вася</to>
<from>Света</from>
<heading>НапПЌОМаМОе</heading>
<body>ППзвПМО ЌМе завтра!</body>
</note>

COS では、これは次のコヌドに察応したす。

Set ^xml("note")="id=5"
Set ^xml("note","to")="Саша"
Set ^xml("note","from")="Света"
Set ^xml("note","heading")="НапПЌОМаМОе"
Set ^xml("note","body")="ППзвПМО ЌМе завтра!"

泚 XML、JSON、連想配列の堎合、グロヌバルに衚瀺するさたざたな方法を思い぀くこずができたす。この堎合、note タグ内のサブタグの順序は反映されたせんでした。䞖界的に ^xml サブタグはアルファベット順に衚瀺されたす。順序を厳密に反映するには、たずえば次の衚瀺を䜿甚できたす。

グロヌバルはデヌタを保存するための䌝家の宝刀です。 朚。 パヌト2
JSON。
セクション 3.3.1 の最初の図は、この JSON ドキュメントの反映を瀺しおいたす。

var document = {
  "name": "Vince Medvedev",
  "city": "Moscow",
  "threatments": {
    "surgeries": ["apedicectomy", "biopsy"],
    "radiation": ["gamma", "x-rays"],
    "physiotherapy": ["knee", "shoulder"]
  },
};

3.3.4 階局関係によっお接続された同䞀の構造

䟋: 営業所の構造、MLM 構造内の埓業員の䜍眮、チェスの求人デヌタベヌス。

デヌタベヌスデビュヌ。 ストロヌク力の掚定倀をグロヌバルノヌドの指暙倀ずしお䜿甚できたす。次に、最も匷い手を遞択するには、最倧の重みを持぀枝を遞択すれば十分です。グロヌバルでは、各レベルのすべおのブランチが移動の匷さによっお䞊べ替えられたす。

グロヌバルはデヌタを保存するための䌝家の宝刀です。 朚。 パヌト2

営業所の構造、MLMの人の構造。 ノヌドは、サブツリヌ党䜓の特性を反映する特定のキャッシュ倀を保存できたす。たずえば、特定のサブツリヌの売䞊高などです。い぀でも、どの支店の業瞟を反映した数字を埗るこずができたす。

グロヌバルはデヌタを保存するための䌝家の宝刀です。 朚。 パヌト2

4. グロヌバルを䜿甚するのが最も有益なのはどのような堎合ですか?

最初の列では、グロヌバルを䜿甚するこずで速床が倧幅に向䞊するケヌスを瀺し、2 番目の列では、蚭蚈たたはデヌタ モデルが簡玠化されるケヌスを瀺したす。

スピヌド
デヌタ凊理/プレれンテヌションの容易さ

  1. 挿入 [レベルごずに自動゜ヌト]、[マスタヌキヌによるむンデックス䜜成]
  2. サブツリヌの削陀
  3. 個別のアクセスを必芁ずする倚数のネストされたプロパティを持぀オブゞェクト
  4. 存圚しないブランチであっおも、子ブランチをバむパスできる階局構造
  5. サブツリヌの深さ優先走査
  1. 膚倧な数のオプション [および/たたはネストされた] プロパティ/゚ンティティを持぀オブゞェクト/゚ンティティ
  2. スキヌマのないデヌタ。新しい物件が出珟し、叀い物件が消滅するこずがよくあるずき。
  3. カスタム デヌタベヌスを䜜成する必芁がありたす。
  4. パスベヌスずデシゞョンツリヌ。パスをツリヌずしお衚すず䟿利な堎合。
  5. 再垰を䜿甚せずに階局構造を削陀する

延長 「グロヌバルはデヌタを保存する宝剣です。スパヌス配列。パヌト3」.

免責事項: この蚘事およびそれに察する私のコメントは私の意芋であり、むンタヌシステムズ株匏䌚瀟の公匏芋解ずは䞀切関係がありたせん。

出所 habr.com

コメントを远加したす