3. Կառուցվածքների տարբերակները գլոբալներ օգտագործելիս
Նման կառույցը, ինչպիսին է պատվիրված ծառը, ունի տարբեր հատուկ դեպքեր: Դիտարկենք դրանք, որոնք գործնական արժեք ունեն գլոբալների հետ աշխատելիս։
3.1 Հատուկ դեպք 1. Մեկ հանգույց առանց ճյուղերի
Գլոբալները կարող են օգտագործվել ոչ միայն զանգվածի, այլև սովորական փոփոխականների նման։ Օրինակ, որպես հաշվիչ.
Set ^counter = 0 ; установка счётчика
Set id=$Increment(^counter) ; атомарное инкрементирование
Այս դեպքում գլոբալը, բացի իր իմաստից, կարող է ունենալ նաև ճյուղեր։ Մեկը մյուսին չի բացառում.
3.2 Հատուկ դեպք 2. Մեկ գագաթ և բազմաթիվ ճյուղեր
Ընդհանուր առմամբ, սա դասական բանալի-արժեքի հիմք է: Եվ եթե որպես արժեք պահենք մի քանի արժեք, ապա կստանանք շատ սովորական աղյուսակ՝ առաջնային բանալիով:
Գլոբալների վերաբերյալ աղյուսակ իրականացնելու համար մենք պետք է ինքներս տողեր ստեղծենք սյունակի արժեքներից, այնուհետև դրանք պահպանենք գլոբալում՝ օգտագործելով հիմնական բանալին: Որպեսզի հնարավոր լինի կարդալ տողը կրկին սյունակների բաժանել, կարող եք օգտագործել.
- սահմանազատող նիշեր.
Set ^t(id1) = "col11/col21/col31" Set ^t(id2) = "col12/col22/col32"
- կոշտ սխեմա, որտեղ յուրաքանչյուր դաշտ զբաղեցնում է բայթերի կանխորոշված քանակություն: Ինչպես արվում է հարաբերական տվյալների բազաներում:
- հատուկ գործառույթ $LB (հասանելի է Cache-ում), որը ստեղծում է արժեքների շարան։
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
Մանրամասներ, թե ինչպես դա անել Մ
Նման աղյուսակները կաշխատեն նույնքան արագ, որքան ավանդական տվյալների բազաներում (կամ նույնիսկ ավելի արագ), եթե տողերի տեղադրման/թարմացման/ջնջման գործառույթները գրվեն COS/M-ով և կազմվեն։Ես ստուգեցի այս հայտարարությունը զանգվածային INSERT-ի և SELECT-ի փորձարկումներով մեկ երկսյունանի աղյուսակում, ներառյալ TSTART և TCOMMIT հրամանները (գործարքները):
Ես չեմ փորձարկել ավելի բարդ սցենարներ միաժամանակյա մուտքով և զուգահեռ գործարքներով:
Առանց գործարքների օգտագործման, ներդրման տոկոսադրույքը կազմել է 778 ներդիր/վայրկյան մեկ միլիոն արժեքի համար:
300 միլիոն արժեքներով՝ 422 ներդիր/վրկ:
Գործարքներ օգտագործելիս - 572 ներդիր/վրկ 082M ներդիրների համար: Բոլոր գործողությունները կատարվել են կոմպիլացված M կոդից։
Կոշտ սկավառակները սովորական են, ոչ թե SSD: RAID5 հետ գրելու հետ: Phenom II 1100T պրոցեսոր:
SQL տվյալների բազան նմանատիպ եղանակով փորձարկելու համար դուք պետք է գրեք պահպանված պրոցեդուրա, որը կկատարի ներդիրներ օղակում: MySQL 5.5-ը (InnoDB պահեստավորում) փորձարկելիս, օգտագործելով այս մեթոդը, ես ստացա թվեր ոչ ավելի, քան 11K ներդիր վայրկյանում:
Այո, գլոբալների վրա աղյուսակների իրականացումն ավելի բարդ է թվում, քան հարաբերական տվյալների բազաներում: Հետևաբար, գլոբալների արդյունաբերական տվյալների բազաները ունեն SQL մուտք՝ աղյուսակային տվյալների հետ աշխատանքը պարզեցնելու համար:
Ընդհանուր առմամբ, եթե տվյալների սխեման հաճախ չի փոխվի, տեղադրման արագությունը կարևոր չէ, և ամբողջ տվյալների բազան կարելի է հեշտությամբ ներկայացնել նորմալացված աղյուսակների տեսքով, ապա ավելի հեշտ է աշխատել SQL-ի հետ, քանի որ այն ապահովում է վերացականության ավելի բարձր մակարդակ: .
Կոնկրետ այս դեպքում ես ուզում էի դա ցույց տալ գլոբալները կարող են հանդես գալ որպես կոնստրուկտոր՝ այլ տվյալների բազաներ ստեղծելու համար. Ասեմբլերի նման, որով կարող են գրվել այլ լեզուներ: Ահա օրինակներ, թե ինչպես կարող եք անալոգներ ստեղծել գլոբալների վրա
Եթե Ձեզ անհրաժեշտ է ստեղծել ինչ-որ ոչ ստանդարտ տվյալների բազա՝ նվազագույն ջանքերով, ապա դուք պետք է նայեք դեպի գլոբալները:
3.3 Հատուկ դեպք 3. Երկաստիճան ծառ, երկրորդ մակարդակի յուրաքանչյուր հանգույց ունի ֆիքսված թվով ճյուղեր.
Դուք հավանաբար կռահեցիք. սա գլոբալների վերաբերյալ աղյուսակների այլընտրանքային իրականացում է: Համեմատենք այս իրականացումը նախորդի հետ։
Սեղաններ երկաստիճան ծառի վրա ընդդեմ. մի մակարդակի ծառի վրա:
Դեմ
Կոալիցիայում
- Ներդրման համար ավելի դանդաղ, քանի որ դուք պետք է սահմանեք հանգույցների թիվը հավասար սյունակների թվին:
- Ավելի շատ սկավառակի տարածության սպառում: Քանի որ սյունակների անուններով գլոբալ ինդեքսները (հասկացվում են որպես զանգվածի ինդեքսներ) զբաղեցնում են սկավառակի տարածք և կրկնօրինակվում են յուրաքանչյուր տողի համար:
- Առանձին սյունակների արժեքների ավելի արագ մուտք, քանի որ տողը վերլուծելու կարիք չկա: Իմ թեստերի համաձայն՝ այն 11,5%-ով ավելի արագ է 2 սյունակների վրա և ավելի շատ՝ ավելի մեծ թվով սյունակներում:
- Ավելի հեշտ է փոխել տվյալների սխեման
- Ավելի հստակ ծածկագիր
Եզրակացություն. ոչ բոլորի համար: Քանի որ արագությունը գլոբալների ամենակարևոր առավելություններից մեկն է, այս ներդրումն օգտագործելը քիչ իմաստ ունի, քանի որ, ամենայն հավանականությամբ, այն կգործի ոչ ավելի արագ, քան հարաբերական տվյալների բազաների աղյուսակները:
3.4 Ընդհանուր դեպք. Ծառեր և պատվիրված ծառեր
Ցանկացած տվյալների կառուցվածք, որը կարող է ներկայացվել որպես ծառ, լիովին համապատասխանում է գլոբալներին:
3.4.1 Օբյեկտներ ենթաօբյեկտներով
Սա գլոբալների ավանդական օգտագործման տարածքն է: Բժշկական ոլորտում առկա են հիվանդությունների, դեղորայքի, ախտանշանների և բուժման մեթոդների հսկայական քանակ։ Իռացիոնալ է յուրաքանչյուր հիվանդի համար միլիոն դաշտերով աղյուսակ ստեղծելը: Ընդ որում, դաշտերի 99 տոկոսը դատարկ կլինի։
Պատկերացրեք աղյուսակների SQL տվյալների բազա՝ «հիվանդ» ~ 100 դաշտ, «Բժշկություն»՝ 000 դաշտ, «Թերապիա»՝ 100 դաշտ, «Բարդություններ»՝ 000 դաշտ և այլն։ եւ այլն։ Կամ դուք կարող եք ստեղծել հազարավոր աղյուսակների տվյալների բազա, որոնցից յուրաքանչյուրը հիվանդի որոշակի տեսակի համար է (և դրանք կարող են համընկնել), բուժումներ, դեղամիջոցներ և հազարավոր այլ աղյուսակներ այս աղյուսակների միջև կապերի համար:
Գլոբալները իդեալական են բժշկության համար, քանի որ թույլ են տալիս յուրաքանչյուր հիվանդի համար ստեղծել նրա բժշկական պատմության, տարբեր թերապիաների և դեղամիջոցների գործողությունների ճշգրիտ նկարագրությունը ծառի տեսքով, առանց սկավառակի ավելորդ տարածություն վատնելու դատարկ սյուների վրա, ինչպես դա կլիներ: լինի գործը հարաբերական դեպքում:
Օգտվելով գլոբալներից՝ հարմար է մարդկանց մասին տվյալների բազա ստեղծել, երբ կարևոր է հաճախորդի մասին առավելագույնը տարբեր տեղեկություններ կուտակել և համակարգել։ Սա պահանջված է բժշկության, բանկային, մարքեթինգի, արխիվային և այլ ոլորտներում
.
Իհարկե, SQL-ում կարող եք նաև ընդօրինակել ծառը ընդամենը մի քանի աղյուսակով (
Գաղտնիք չէ, որ հսկա աղյուսակների վրա տվյալների սխեման փոխելը (ALTER TABLE) կարող է բավականին ժամանակ պահանջել: MySQL-ն, օրինակ, կատարում է ALTER TABLE ADD|Drop COLUMN-ը՝ ամբողջությամբ պատճենելով տեղեկատվությունը հին աղյուսակից նոր աղյուսակում (փորձարկված MyISAM, InnoDB շարժիչներ): Որը կարող է օրերով, եթե ոչ շաբաթներով կախել աշխատանքային տվյալների բազան միլիարդավոր գրառումներով:
Տվյալների կառուցվածքը փոխելը, եթե մենք օգտագործում ենք գլոբալներ, մեզ ոչինչ չի պահանջում: Ցանկացած ժամանակ մենք կարող ենք մեզ անհրաժեշտ ցանկացած նոր հատկություն ավելացնել ցանկացած օբյեկտի, հիերարխիայի ցանկացած մակարդակում: Մասնաճյուղերի անվանափոխման հետ կապված փոփոխությունները կարող են գործարկվել ֆոնային ռեժիմում՝ գործող տվյալների բազայում:
Հետևաբար, երբ խոսքը վերաբերում է հսկայական թվով կամընտիր հատկություններով օբյեկտների պահպանմանը, գլոբալները հիանալի ընտրություն են:
Ավելին, հիշեցնեմ, որ ցանկացած հատկանիշի հասանելիությունը ակնթարթային է, քանի որ գլոբալում բոլոր ուղիները B-ծառեր են:
Համաշխարհային տվյալների շտեմարանները, ընդհանուր առմամբ, փաստաթղթերի վրա հիմնված տվյալների բազայի տեսակ են՝ հիերարխիկ տեղեկատվություն պահելու ունակությամբ: Հետևաբար, փաստաթղթերի վրա հիմնված տվյալների բազաները կարող են մրցակցել գլոբալների հետ բժշկական գրառումների պահպանման ոլորտում: Բայց դա դեռ այնքան էլ նույնը չէՀամեմատության համար վերցնենք MongoDB-ն: Այս տիրույթում այն պարտվում է գլոբալներին հետևյալ պատճառներով.
- Փաստաթղթի չափը. Պահպանման միավորը JSON ձևաչափով (ավելի ճիշտ՝ BSON) տեքստ է՝ մոտ 16 ՄԲ առավելագույն ծավալով։ Սահմանափակումն արվել է հատուկ, որպեսզի JSON տվյալների բազան չդանդաղի վերլուծության ընթացքում, եթե այնտեղ պահվում է հսկայական JSON փաստաթուղթ, այնուհետև հասանելի է դաշտերի միջոցով: Այս փաստաթուղթը պետք է պարունակի հիվանդի մասին բոլոր տեղեկությունները: Մենք բոլորս գիտենք, թե որքան հաստ են հիվանդների գրառումները: Քարտի առավելագույն չափը՝ 16 ՄԲ, անմիջապես վերջ է դնում այն հիվանդներին, որոնց հիվանդության քարտը ներառում է MRI ֆայլեր, ռենտգեն հետազոտություններ և այլ հետազոտություններ: Գլոբալի մեկ ճյուղում դուք կարող եք ունենալ գիգաբայթ և տերաբայթ տեղեկատվություն: Սրան սկզբունքորեն կարող ենք վերջ տալ, բայց ես կշարունակեմ։
- Հիվանդի աղյուսակում նոր հատկությունների գիտակցության/փոփոխման/ջնջման ժամանակը: Նման տվյալների բազան պետք է կարդա ամբողջ քարտեզը հիշողության մեջ (սա մեծ քանակություն է), վերլուծի BSON-ը, ավելացնի/փոխի/ջնջի նոր հանգույց, թարմացնի ինդեքսները, փաթեթավորի այն BSON-ում և պահի այն սկավառակի վրա: Գլոբալը միայն պետք է մուտք գործի որոշակի սեփականություն և շահարկի այն:
- Արագ մուտք դեպի անհատական հատկություններ: Փաստաթղթի բազմաթիվ հատկություններով և դրա բազմաստիճան կառուցվածքով, անհատական հատկությունների հասանելիությունն ավելի արագ կլինի, քանի որ գլոբալ յուրաքանչյուր ուղի 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-ը գլոբալների տարրալուծելու ամենադյուրին ճանապարհը պիտակների ատրիբուտները հանգույցներում պահելն է: Եվ եթե անհրաժեշտ է արագ մուտք դեպի պիտակների ատրիբուտներ, ապա մենք կարող ենք դրանք տեղափոխել առանձին ճյուղեր:
<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, ասոցիատիվ զանգվածների համար կարող եք գլոբալների վրա ցուցադրելու շատ տարբեր եղանակներ գտնել: Այս դեպքում մենք չենք արտացոլել ենթապիտակների հերթականությունը նշումների պիտակում: Գլոբալ առումով ^ xml ենթապիտակները կցուցադրվեն այբբենական կարգով: Պատվերը խստորեն արտացոլելու համար կարող եք օգտագործել, օրինակ, հետևյալ էկրանը.
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 կառուցվածքում մարդկանց գտնվելու վայրը, շախմատի բացվածքների բազան:
Դեբյուտային տվյալների բազա: Դուք կարող եք օգտագործել հարվածի ուժի գնահատումը որպես գլոբալ հանգույցի ինդեքսի արժեք: Հետո ամենաուժեղ քայլը ընտրելու համար բավական կլինի ընտրել ամենամեծ քաշ ունեցող ճյուղը։ Գլոբալում յուրաքանչյուր մակարդակի բոլոր ճյուղերը դասակարգվելու են ըստ շարժման ուժի:
Վաճառքի գրասենյակների կառուցվածքը, մարդկանց կառուցվածքը MLM-ում: Հանգույցները կարող են պահել որոշակի քեշավորման արժեքներ, որոնք արտացոլում են ամբողջ ենթածառի բնութագրերը: Օրինակ՝ տվյալ ենթածառի վաճառքի ծավալը։ Ցանկացած պահի մենք կարող ենք ստանալ ցանկացած ճյուղի ձեռքբերումներն արտացոլող գործիչ։
4. Ո՞ր դեպքերում է առավել շահավետ օգտագործել գլոբալները:
Առաջին սյունակում ներկայացված են դեպքեր, երբ դուք կստանաք զգալի արագություն՝ օգտագործելով գլոբալները, իսկ երկրորդը, երբ դիզայնը կամ տվյալների մոդելը կպարզեցվեն:
Բարեմաղթել
Տվյալների մշակման/ներկայացման հեշտությունը
- Տեղադրում [յուրաքանչյուր մակարդակում ավտոմատ տեսակավորմամբ], [ինդեքսավորում ըստ հիմնական բանալի]
- Ենթածառերի հեռացում
- Բազմաթիվ բնադրված հատկություններով օբյեկտներ, որոնք պահանջում են անհատական մուտք
- Հիերարխիկ կառուցվածք՝ ցանկացած ճյուղից, նույնիսկ գոյություն չունեցող ճյուղերից շրջանցելու ունակությամբ
- Ենթածառերի խորքային անցում
- Օբյեկտներ/սուբյեկտներ մեծ թվով կամընտիր [և/կամ ներկառուցված] հատկություններով/սուբյեկտներով
- Տվյալներ առանց սխեմայի: Երբ նոր հատկությունները հաճախ կարող են հայտնվել, իսկ հները անհետանալ:
- Դուք պետք է ստեղծեք անհատական տվյալների բազա:
- Ուղու հիմքերը և որոշումների ծառերը: Երբ հարմար է ուղիները ծառի տեսքով ներկայացնել։
- Հիերարխիկ կառույցների հեռացում առանց ռեկուրսիայի օգտագործման
Շարունակությունը
Հրաժարում պատասխանատվությունից: Այս հոդվածը և դրա վերաբերյալ իմ մեկնաբանությունները իմ կարծիքն են և որևէ առնչություն չունեն InterSystems Corporation-ի պաշտոնական դիրքորոշման հետ:
Source: www.habr.com