Глобали су ризнице за складиштење података. Дрвеће. Део 2

Глобали су ризнице за складиштење података. Дрвеће. Део 2За почетак - погледајте део 1.

3. Варијанте структура при коришћењу глобала

Структура као што је уређено дрво има различите посебне случајеве. Хајде да размотримо оне који имају практичну вредност када радимо са глобалима.

3.1 Посебан случај 1. Један чвор без грана


Глобали су ризнице за складиштење података. Дрвеће. Део 2Глобалне вредности се могу користити не само као низ, већ и као регуларне променљиве. На пример, као бројач:

Set ^counter = 0  ; установка счётчика
Set id=$Increment(^counter) ;  атомарное инкрементирование

У овом случају, глобал, поред свог значења, може имати и гране. Једно друго не искључује.

3.2 Посебан случај 2. Један врх и много грана

Генерално, ово је класична база кључ/вредност. А ако сачувамо низ вредности као вредност, добићемо сасвим обичну табелу са примарним кључем.

Глобали су ризнице за складиштење података. Дрвеће. Део 2

Да бисмо имплементирали табелу на глобалне вредности, мораћемо сами да генеришемо редове из вредности колоне, а затим да их сачувамо у глобалу користећи примарни кључ. Да бисте омогућили да се стринг поново подели на колоне приликом читања, можете користити:

  1. знакови за раздвајање.
    Set ^t(id1) = "col11/col21/col31"
    Set ^t(id2) = "col12/col22/col32"
  2. крута шема у којој свако поље заузима унапред одређен број бајтова. Као што се ради у релационим базама података.
  3. специјална функција $ЛБ (доступна у кешу), која креира низ вредности.
    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 и пронађите примарне кључеве (ид) који одговарају жељеној вредности прве колоне.

Када убацујемо вредност, можемо одмах да креирамо глобалне вредности и индекса за потребна поља. А ради поузданости, хајде да све то умотамо у трансакцију.

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

Детаљи о томе како то учинити на М табеле о глобалима, емулација секундарних индекса.

Такве табеле ће радити једнако брзо као у традиционалним базама података (или чак брже) ако су функције за убацивање/ажурирање/брисање редова написане у ЦОС/М и компајлиране.Проверио сам ову наредбу помоћу тестова за групно ИНСЕРТ и СЕЛЕЦТ у једну табелу са две колоне, укључујући коришћење команди ТСТАРТ и ТЦОММИТ (трансакције).

Нисам тестирао сложеније сценарије са истовременим приступом и паралелним трансакцијама.

Без коришћења трансакција, стопа уметања била је 778 уметање у секунди на милион вредности.
Са 300 милиона вредности - 422 уметање у секунди.

Када користите трансакције - 572 уметања/секунди за 082М уметања. Све операције су изведене из компајлираног М кода.
Чврсти дискови су обични, а не ССД. РАИД5 са повратним уписом. Пхеном ИИ 1100Т процесор.

Да бисте тестирали СКЛ базу података на сличан начин, потребно је да напишете ускладиштену процедуру која ће вршити уметање у петљи. Приликом тестирања МиСКЛ 5.5 (ИнноДБ складиште), користећи ову методу, добио сам бројеве не више од 11К уметања у секунди.
Да, имплементација табела на глобалима изгледа сложеније него у релационим базама података. Због тога индустријске базе података на глобалима имају СКЛ приступ да поједноставе рад са табеларним подацима.

Глобали су ризнице за складиштење података. Дрвеће. Део 2Уопштено говорећи, ако се шема података неће често мењати, брзина уметања није критична и цела база података се може лако представити у облику нормализованих табела, онда је лакше радити са СКЛ-ом, јер обезбеђује виши ниво апстракције. .

Глобали су ризнице за складиштење података. Дрвеће. Део 2У овом конкретном случају то сам желео да покажем глобалс може деловати као конструктор за креирање других база података. Као асемблер у коме се могу писати други језици. Ево примера како можете да креирате аналоге на глобалима кључ/вредност, листе, скупови, табеларне, документно оријентисане базе података.

Ако треба да направите неку врсту нестандардне базе података са минималним напором, онда би требало да се осврнете на глобалне.

3.3 Посебан случај 3. Стабло на два нивоа, сваки чвор другог нивоа има фиксни број грана

Глобали су ризнице за складиштење података. Дрвеће. Део 2Вероватно сте погодили: ово је алтернативна имплементација табела на глобалима. Хајде да упоредимо ову имплементацију са претходном.

Табеле на дрвету на два нивоа вс. на једнослојном дрвету.

Против
Прозодија

  1. Спорије за уметање, пошто морате да подесите број чворова једнак броју колона.
  2. Већа потрошња простора на диску. Пошто глобални индекси (схваћени као индекси низа) са именима колона заузимају простор на диску и дуплирају се за сваки ред.

  1. Бржи приступ вредностима појединачних колона, јер нема потребе за рашчлањивањем стринга. Према мојим тестовима, 11,5% је бржи на 2 колоне и више на већем броју колона.
  2. Лакше је променити шему података
  3. Јаснији код

Закључак: није за свакога. Пошто је брзина једна од најважнијих предности глобалних система, нема смисла користити ову имплементацију, јер највероватније неће радити брже од табела у релационим базама података.

3.4 Општи случај. Дрвеће и наређено дрвеће

Свака структура података која се може представити као стабло савршено се уклапа са глобалима.

3.4.1 Објекти са подобјектима

Глобали су ризнице за складиштење података. Дрвеће. Део 2

Ово је област традиционалне употребе глобала. У области медицине постоји велики број болести, лекова, симптома и метода лечења. Нерационално је правити табелу са милион поља за сваког пацијента. Штавише, 99% поља ће бити празно.

Замислите СКЛ базу података табела: „пацијент” ~ 100 поља, „Медицина” – 000 поља, „Терапија” – 100 поља, „Компликације” – 000 поља, итд. и тако даље. Или можете креирати базу података од много хиљада табела, свака за одређени тип пацијената (и могу се преклапати!), третмана, лекова и још хиљада табела за везе између ових табела.

Глобали су идеални за медицину, јер вам омогућавају да за сваког пацијента направите тачан опис његове историје болести, различитих терапија и деловања лекова, у облику дрвета, без трошења додатног простора на диску на празне колоне, као што би бити случај у релационом падежу.

Глобали су ризнице за складиштење података. Дрвеће. Део 2Коришћењем глобала згодно је креирати базу података са подацима о људима, када је важно акумулирати и систематизовати максимално разноврсне информације о клијенту. Ово је тражено у медицини, банкарству, маркетингу, архивирању и другим областима

.
Наравно, у СКЛ-у такође можете емулирати дрво са само неколико табела (ЕАВ, 1,2,3,4,5,6,7,8,9,10), међутим, ово је знатно компликованије и биће спорије. У суштини, морали бисте да напишете глобално решење које ради на табелама и сакријете сав рад са табелама испод слоја апстракције. Погрешно је опонашати технологију нижег нивоа (глобали) користећи технологију вишег нивоа (СКЛ). Неприкладно.

Није тајна да промена шеме података на огромним табелама (АЛТЕР ТАБЛЕ) може потрајати доста времена. МиСКЛ, на пример, ради АЛТЕР ТАБЛЕ АДД|ДРОП ЦОЛУМН тако што потпуно копира информације из старе табеле у нову табелу (тестирани МиИСАМ, ИнноДБ мотори). Што може да окачи радну базу података са милијардама записа данима, ако не и недељама.

Глобали су ризнице за складиштење података. Дрвеће. Део 2Промена структуре података ако користимо глобалне вредности нас ништа не кошта. У било ком тренутку можемо додати било која нова својства која су нам потребна било ком објекту, на било ком нивоу хијерархије. Промене повезане са преименовањем грана могу се покренути у позадини на покренутој бази података.


Стога, када је у питању складиштење објеката са огромним бројем опционих својстава, глобални су одличан избор.

Штавише, да вас подсетим да је приступ било ком својству тренутан, пошто су у глобалу све путање Б-стабла.

Глобалне базе података, уопштено говорећи, су тип базе података оријентисане на документе са могућношћу складиштења хијерархијских информација. Стога, документно оријентисане базе података могу да се такмиче са глобалима у области чувања медицинске документације. Али још увек није сасвим истоУзмимо МонгоДБ за поређење. У овом домену губи од глобалних из следећих разлога:

  1. Величина документа. Јединица за складиштење је текст у ЈСОН формату (тачније БСОН) са максималном запремином од око 16МБ. Ограничење је направљено посебно да се ЈСОН база података не успорава током рашчлањивања ако је у њој ускладиштен огроман ЈСОН документ и затим се приступа по пољима. Овај документ треба да садржи све податке о пацијенту. Сви знамо колико дебели картони пацијената могу бити. Максимална величина картице од 16 МБ одмах ставља тачку на пацијенте чија картица болести укључује МРИ датотеке, рендгенске снимке и друге студије. У једној грани глобалног можете имати гигабајте и терабајте информација. У принципу, можемо да ставимо тачку на ово, али ја ћу наставити.
  2. Време свести/промене/брисања нових особина у карти пацијента. Таква база података мора прочитати целу мапу у меморију (ово је велика количина!), анализирати БСОН, додати/променити/обрисати нови чвор, ажурирати индексе, спаковати је у БСОН и сачувати на диску. Глобал треба само да приступи одређеном својству и да њиме манипулише.
  3. Брз приступ појединачним некретнинама. Са многим својствима у документу и његовом структуром на више нивоа, приступ појединачним својствима ће бити бржи због чињенице да је свака путања у глобалу Б-стабло. У БСОН-у морате линеарно рашчланити документ да бисте пронашли жељено својство.

3.3.2 Асоцијативни низови

Асоцијативни низови (чак и са угнежђеним низовима) савршено се уклапају у глобале. На пример, такав низ из ПХП-а ће бити приказан на првој слици 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 Хијерархијски документи: КСМЛ, ЈСОН

Такође се лако чува у глобалима. Може се поставити на различите начине за складиштење.

КСМЛ
Најлакши начин за декомпоновање КСМЛ-а на глобалне вредности је складиштење атрибута ознака у чворовима. А ако је потребан брз приступ атрибутима ознака, онда их можемо преместити у засебне гране.

Глобали су ризнице за складиштење података. Дрвеће. Део 2

<note id=5>
<to>Вася</to>
<from>Света</from>
<heading>Напоминание</heading>
<body>Позвони мне завтра!</body>
</note>

На ЦОС-у ово би одговарало коду:

Set ^xml("note")="id=5"
Set ^xml("note","to")="Саша"
Set ^xml("note","from")="Света"
Set ^xml("note","heading")="Напоминание"
Set ^xml("note","body")="Позвони мне завтра!"

Коментар: За КСМЛ, ЈСОН, асоцијативне низове, можете смислити много различитих начина приказивања на глобалима. У овом случају, нисмо одразили редослед подознака у ознаци белешке. Глобално ^кмл подознаке ће бити приказане по абецедном реду. Да бисте стриктно одражавали редослед, можете користити, на пример, следећи приказ:

Глобали су ризнице за складиштење података. Дрвеће. Део 2
ЈСОН.
Прва слика из одељка 3.3.1 приказује одраз овог ЈСОН документа:

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

3.3.4 Идентичне структуре повезане хијерархијским односима

Примери: структура продајних канцеларија, локација људи у МЛМ структури, база података отварања у шаху.

База података дебитаната. Можете користити процену силе удара као вредност индекса глобалног чвора. Затим, да би се изабрао најјачи потез, биће довољно изабрати грану са највећом тежином. У глобалу, све гране на сваком нивоу ће бити сортиране према снази кретања.

Глобали су ризнице за складиштење података. Дрвеће. Део 2

Структура продајних канцеларија, структура људи у МЛМ-у. Чворови могу да чувају одређене вредности кеширања које одражавају карактеристике целог подстабла. На пример, обим продаје датог подстабла. У сваком тренутку можемо добити цифру која одражава достигнућа било које гране.

Глобали су ризнице за складиштење података. Дрвеће. Део 2

4. У којим случајевима је најкорисније користити глобале?

Прва колона представља случајеве у којима ћете добити значајан пораст брзине коришћењем глобала, а друга када ће дизајн или модел података бити поједностављени.

Брзина
Лакоћа обраде/презентације података

  1. Уметање [са аутоматским сортирањем на сваком нивоу], [индексирање по главном кључу]
  2. Уклањање подстабала
  3. Објекти са пуно угнежђених својстава која захтевају индивидуални приступ
  4. Хијерархијска структура са могућношћу заобилажења подређених грана из било које гране, чак и оне непостојеће
  5. Прелазак подстабала у дубину
  1. Објекти/ентитети са огромним бројем опционих [и/или угнежђених] својстава/ентитета
  2. Подаци без шеме. Када се нова својства често могу појавити, а стара нестати.
  3. Морате да креирате прилагођену базу података.
  4. Основе путања и стабла одлучивања. Када је згодно представити стазе као дрво.
  5. Уклањање хијерархијских структура без употребе рекурзије

Продужетак „Глобали су мачеви са благом за складиштење података. Ретки низови. део 3".

Одрицање од одговорности: Овај чланак и моји коментари на њега су моје мишљење и немају никакве везе са званичним ставом ИнтерСистемс Цорпоратион.

Извор: ввв.хабр.цом

Додај коментар