Глобал бол өгөгдөл хадгалах эрдэнэсийн сэлэм юм. Мод. 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. тусгай функц $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 командуудыг (гүйлгээ) ашиглан нэг хоёр баганатай хүснэгтэд бөөнөөр нь INSERT болон SELECT тестээр шалгасан.

Би зэрэгцээ хандалт болон зэрэгцээ гүйлгээ бүхий илүү төвөгтэй хувилбаруудыг туршиж үзээгүй.

Гүйлгээ ашиглахгүйгээр оруулах хувь хэмжээ нь сая утгад 778 оруулга/секунд байсан.
300 сая утгатай - 422 оруулга/секунд.

Гүйлгээг ашиглах үед - 572 сая оруулгад 082 оруулга / секунд. Бүх үйлдлийг эмхэтгэсэн М кодоос гүйцэтгэсэн.
Хатуу хөтчүүд нь SSD биш, ердийнх юм. Буцааж бичих боломжтой RAID5. Phenom II 1100T процессор.

Үүнтэй ижил аргаар SQL мэдээллийн санг шалгахын тулд та гогцоонд оруулах үйлдлийг гүйцэтгэх хадгалагдсан процедурыг бичих хэрэгтэй. MySQL 5.5 (InnoDB хадгалах)-г туршихдаа энэ аргыг ашиглан би секундэд 11К-аас ихгүй тооны оруулга хүлээн авсан.
Тийм ээ, глобалууд дээрх хүснэгтүүдийг хэрэгжүүлэх нь харилцааны мэдээллийн сангаас илүү төвөгтэй харагдаж байна. Тиймээс дэлхийн сүлжээн дэх аж үйлдвэрийн өгөгдлийн сангууд хүснэгтийн өгөгдөлтэй ажиллах ажлыг хялбаршуулахын тулд SQL хандалттай байдаг.

Глобал бол өгөгдөл хадгалах эрдэнэсийн сэлэм юм. Мод. 2-р хэсэгЕрөнхийдөө хэрэв өгөгдлийн схем байнга өөрчлөгддөггүй, оруулах хурд нь чухал биш бөгөөд мэдээллийн санг бүхэлд нь хэвийн хүснэгт хэлбэрээр хялбархан дүрслэх боломжтой бол SQL-тэй ажиллах нь илүү хялбар, учир нь энэ нь хийсвэрлэлийн өндөр түвшинг өгдөг. .

Глобал бол өгөгдөл хадгалах эрдэнэсийн сэлэм юм. Мод. 2-р хэсэгЭнэ тохиолдолд би үүнийг харуулахыг хүссэн globals нь бусад мэдээллийн санг үүсгэхэд бүтээгчийн үүргийг гүйцэтгэж чадна. Бусад хэлээр бичиж болох ассемблер шиг. Глобал дээр хэрхэн аналог үүсгэж болох жишээ энд байна түлхүүр-утга, жагсаалт, багц, хүснэгт, баримт бичигт чиглэсэн мэдээллийн сан.

Хэрэв та ямар нэгэн стандарт бус мэдээллийн сан үүсгэх шаардлагатай бол хамгийн бага хүчин чармайлтаар дэлхийн хэмжээнд хандах хэрэгтэй.

3.3 Онцгой тохиолдол 3. Хоёр түвшний мод, хоёр дахь түвшний зангилаа бүр нь тогтмол тооны мөчиртэй байдаг.

Глобал бол өгөгдөл хадгалах эрдэнэсийн сэлэм юм. Мод. 2-р хэсэгТа үүнийг таамагласан байх: энэ бол дэлхийн хэмжээний хүснэгтүүдийн өөр хувилбар юм. Энэ хэрэгжилтийг өмнөхтэй нь харьцуулж үзье.

Хоёр түвшний модон дээрх хүснэгтүүд vs. нэг түвшний мод дээр.

Минусы
Плюсы

  1. Баганын тоотой тэнцүү зангилааны тоог тохируулах шаардлагатай тул оруулахад удаашралтай.
  2. Илүү их дискний зай зарцуулалт. Баганын нэртэй глобал индексүүд (массив индекс гэж ойлгогддог) дискний зай эзэлдэг тул мөр бүрт давхардсан байдаг.

  1. Мөрийг задлах шаардлагагүй тул бие даасан баганын утгуудад илүү хурдан хандах боломжтой. Миний туршилтын дагуу энэ нь 11,5 багана дээр 2% ба түүнээс дээш тооны багана дээр илүү хурдан байдаг.
  2. Өгөгдлийн схемийг өөрчлөхөд хялбар
  3. Илүү тодорхой код

Дүгнэлт: хүн болгонд биш. Хурд нь дэлхийн хамгийн чухал давуу талуудын нэг тул энэ хэрэгжилтийг ашиглах нь утгагүй, учир нь энэ нь харилцааны мэдээллийн сан дахь хүснэгтүүдээс илүү хурдан ажиллахгүй байх магадлалтай.

3.4 Ерөнхий тохиолдол. Мод ба захиалгат мод

Мод хэлбэрээр дүрсэлж болох аливаа өгөгдлийн бүтэц нь дэлхийн хэмжээнд бүрэн нийцдэг.

3.4.1 Дэд объект бүхий объектууд

Глобал бол өгөгдөл хадгалах эрдэнэсийн сэлэм юм. Мод. 2-р хэсэг

Энэ бол дэлхийн хүмүүсийн уламжлалт хэрэглээний талбар юм. Анагаах ухааны салбарт маш олон тооны өвчин, эм, шинж тэмдэг, эмчилгээний аргууд байдаг. Өвчтөн бүрт нэг сая талбар бүхий хүснэгт үүсгэх нь үндэслэлгүй юм. Мөн талбайн 99 хувь нь хоосон байх болно.

Хүснэгтийн 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-р хэсэгХэрэв бид глобалыг ашиглавал өгөгдлийн бүтцийг өөрчлөх нь бидэнд ямар ч зардал гарахгүй. Бид ямар ч үед, шатлалын аль ч түвшинд ямар ч объектод шаардлагатай шинэ шинж чанаруудыг нэмж болно. Салбаруудын нэрийг өөрчлөхтэй холбоотой өөрчлөлтүүдийг ажиллаж байгаа мэдээллийн сан дээр арын горимд ажиллуулж болно.


Тиймээс, асар олон тооны нэмэлт шинж чанартай объектуудыг хадгалахад глобалууд нь маш сайн сонголт юм.

Түүнчлэн, дэлхийн хэмжээнд бүх замууд нь В мод байдаг тул аливаа өмчид шууд хандах боломжтой гэдгийг сануулъя.

Глобал мэдээллийн сан нь ерөнхийдөө шаталсан мэдээллийг хадгалах чадвартай, баримт бичигт чиглэсэн мэдээллийн сангийн нэг төрөл юм. Тиймээс баримт бичигт суурилсан мэдээллийн сан нь эмнэлгийн бүртгэлийг хадгалах чиглэлээр дэлхийн улс орнуудтай өрсөлдөх боломжтой. Гэхдээ энэ нь яг адилхан биш хэвээр байнаХарьцуулахын тулд MongoDB-г авч үзье. Энэ домэйнд Дараах шалтгааны улмаас дэлхийн хэмжээнд хожигдож байна.

  1. Баримт бичгийн хэмжээ. Хадгалах нэгж нь хамгийн ихдээ 16MB хэмжээтэй JSON форматтай (илүү нарийвчлалтай BSON) текст юм. Энэ хязгаарлалтыг тусгайлан хийсэн бөгөөд ингэснээр JSON мэдээллийн санд асар том JSON баримт хадгалагдаж, талбаруудаар хандвал задлан шинжлэх явцад удаашрахгүй. Энэ баримт бичиг нь өвчтөний талаарх бүх мэдээллийг агуулсан байх ёстой. Өвчтөний бүртгэл ямар зузаан байдгийг бид бүгд мэднэ. Картын дээд хэмжээ нь 16 МБ байх нь өвчний картанд MRI файл, рентген зураг болон бусад судалгааг багтаасан өвчтөнүүдийг нэн даруй зогсооно. Дэлхийн нэг салбарт та гигабайт, терабайт мэдээлэлтэй байж болно. Зарчмын хувьд бид үүнийг зогсоож чадна, гэхдээ би үргэлжлүүлнэ.
  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, ассоциатив массивуудын хувьд та глобал дээр харуулах олон янзын арга замыг санал болгож чадна. Энэ тохиолдолд бид тэмдэглэлийн шошгон дээрх дэд хаягуудын дарааллыг тусгаагүй болно. Дэлхий даяар ^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. Глобалыг ямар тохиолдолд ашиглах нь хамгийн ашигтай вэ?

Эхний баганад та глобалыг ашигласнаар хурдыг мэдэгдэхүйц нэмэгдүүлэх, хоёр дахь баганад дизайн эсвэл өгөгдлийн загварыг хялбарчлах тохиолдлуудыг харуулав.

Хурд
Өгөгдөл боловсруулах / танилцуулахад хялбар байдал

  1. Оруулах [түвшин бүрт автоматаар эрэмбэлэх], [мастер түлхүүрээр индексжүүлэх]
  2. Дэд модыг устгаж байна
  3. Хувь хүний ​​хандалт шаарддаг олон тооны үүрлэсэн шинж чанаруудтай объектууд
  4. Аль ч салбар, тэр байтугай байхгүй салбараас хүүхэд салбаруудыг тойрч гарах чадвартай шаталсан бүтэц
  5. Дэд модны гүн-эхний хөндлөн огтлолцол
  1. Асар их тооны нэмэлт [болон/эсвэл үүрлэсэн] шинж чанарууд/байгууллага бүхий объект/байгууллага
  2. Схемгүй өгөгдөл. Шинэ шинж чанарууд ихэвчлэн гарч ирэхэд хуучин нь алга болдог.
  3. Та захиалгат мэдээллийн сан үүсгэх хэрэгтэй.
  4. Замын суурь ба шийдвэрийн мод. Замуудыг модоор дүрслэх нь тохиромжтой үед.
  5. Рекурс ашиглахгүйгээр шаталсан бүтцийг устгах

Үргэлжлэл "Глобал бол өгөгдөл хадгалах эрдэнэсийн сэлэм юм. Сийрэг массив. 3-р хэсэг".

Disclaimer: Энэ нийтлэл болон түүнд өгсөн миний санал бол миний бодол бөгөөд InterSystems корпорацийн албан ёсны байр суурьтай ямар ч холбоогүй юм.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх