Globals mangrupakeun harta-pedang pikeun nyimpen data. Tatangkalan. Bagian 2

Globals mangrupakeun harta-pedang pikeun nyimpen data. Tatangkalan. Bagian 2Ngamimitian - tingali bagian 1.

3. Varian struktur nalika ngagunakeun globals

Struktur sapertos tangkal maréntahkeun ngagaduhan sababaraha kasus khusus. Hayu urang nganggap anu gaduh nilai praktis nalika damel sareng global.

3.1 Kasus husus 1. Hiji titik tanpa cabang


Globals mangrupakeun harta-pedang pikeun nyimpen data. Tatangkalan. Bagian 2Globals tiasa dianggo henteu ngan ukur sapertos susunan, tapi ogé sapertos variabel biasa. Contona, salaku counter a:

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

Dina hal ieu, global, salian harti na, ogé bisa boga cabang. Hiji henteu ngaluarkeun anu sanés.

3.2 Kasus husus 2. Hiji vertex sarta loba cabang

Sacara umum, ieu mangrupikeun dasar konci-nilai klasik. Sareng upami urang nyimpen hiji tuple nilai salaku nilai, urang bakal nampi méja anu biasa pisan sareng konci primér.

Globals mangrupakeun harta-pedang pikeun nyimpen data. Tatangkalan. Bagian 2

Pikeun nerapkeun tabel dina globals, urang kudu ngahasilkeun baris sorangan tina nilai kolom, lajeng simpen ka global ngagunakeun konci primér. Pikeun ngabagi string kana kolom deui nalika maca, anjeun tiasa nganggo:

  1. karakter delimiter.
    Set ^t(id1) = "col11/col21/col31"
    Set ^t(id2) = "col12/col22/col32"
  2. skéma kaku nu unggal widang ngawengku jumlah bait nu geus ditangtukeun. Salaku dipigawé dina database relational.
  3. fungsi husus $ LB (sadia dina Cache), nu nyiptakeun string of nilai.
    Set ^t(id1) = $LB("col11", "col21", "col31")
    Set ^t(id2) = $LB("col12", "col22", "col32")

Narikna, teu hese ngagunakeun globals pikeun ngalakukeun hal sarupa indexes sekundér dina database relational. Hayu urang nelepon indéks struktur sapertos globals. Indéks global mangrupikeun tangkal bantu pikeun gancang milarian widang anu sanés bagian tina konci primér global utama. Pikeun ngeusian sarta ngagunakeun éta, anjeun kudu nulis kode tambahan.

Hayu urang ngadamel indéks global dina kolom kahiji.

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

Ayeuna, pikeun gancang milarian inpormasi dina kolom kahiji, urang kedah ningali kana global ^i sarta manggihan konci primér (id) pakait jeung nilai dipikahoyong tina kolom kahiji.

Nalika nyelapkeun nilai, urang tiasa langsung nyiptakeun nilai sareng indéks global pikeun widang anu diperyogikeun. Sareng pikeun reliabilitas, hayu urang bungkus sadayana dina transaksi.

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

Rincian ngeunaan cara ngalakukeunana dina M tabél on globals, emulation of indéks sekundér.

tabél sapertos bakal dianggo gancang sakumaha dina basis data tradisional (atawa malah leuwih gancang) lamun fungsi pikeun inserting / ngamutahirkeun / ngahapus baris ditulis dina COS / M sarta disusun.Kuring pariksa pernyataan ieu kalawan tés dina bulk INSERT na SELECT kana hiji tabel dua kolom, kaasup ngagunakeun TSTART na TCOMMIT paréntah (transaksi).

Kuring henteu acan nguji skenario anu langkung rumit kalayan aksés sakaligus sareng transaksi paralel.

Tanpa nganggo transaksi, laju sisipan éta 778 sisipan / detik per juta nilai.
Kalayan 300 juta nilai - 422 sisipan / detik.

Nalika nganggo transaksi - 572 sisipan / detik pikeun sisipan 082M. Sadaya operasi dilaksanakeun tina kode M anu disusun.
Hard drive nu biasa, teu SSD. RAID5 kalawan Tulis-balik. prosésor Phenom II 1100T.

Pikeun nguji database SQL dina cara nu sarupa, Anjeun kudu nulis prosedur disimpen nu bakal ngalakukeun insertions dina loop a. Nalika nguji MySQL 5.5 (panyimpenan InnoDB), ngagunakeun metodeu ieu kuring nampi nomer henteu langkung ti 11K sisipan per detik.
Sumuhun, palaksanaan tabel on globals Sigana leuwih kompleks tinimbang dina database relational. Ku alatan éta, basis data industri dina globals boga aksés SQL pikeun mempermudah gawé kalawan data tabular.

Globals mangrupakeun harta-pedang pikeun nyimpen data. Tatangkalan. Bagian 2Sacara umum, upami skéma data henteu sering robih, laju sisipan henteu kritis sareng sadayana pangkalan data tiasa gampang diwakilan dina bentuk tabel anu dinormalisasi, teras langkung gampang damel sareng SQL, sabab nyayogikeun tingkat abstraksi anu langkung luhur. .

Globals mangrupakeun harta-pedang pikeun nyimpen data. Tatangkalan. Bagian 2Dina hal husus ieu kuring hayang némbongkeun éta globals bisa meta salaku constructor pikeun nyieun database séjén. Kawas assembler nu bisa ditulis dina basa séjén. Ieu conto kumaha anjeun tiasa nyiptakeun analog dina global konci-nilai, béréndélan, susunan, tabular, basis data berorientasi dokumén.

Lamun perlu nyieun sababaraha jenis database non-standar kalawan usaha minimal, mangka anjeun kudu néangan arah globals.

3.3 Kasus khusus 3. Tangkal dua tingkat, unggal titik tingkat kadua ngagaduhan jumlah cabang tetep.

Globals mangrupakeun harta-pedang pikeun nyimpen data. Tatangkalan. Bagian 2Anjeun meureun ditebak eta: ieu palaksanaan alternatif tabel on globals. Hayu urang ngabandingkeun palaksanaan ieu jeung hiji saméméhna.

Méja dina tangkal dua tingkat vs. dina tangkal hiji tingkat.

Минусы
Плюсы

  1. Laun pikeun sisipan, sabab anjeun kedah nyetél jumlah titik anu sami sareng jumlah kolom.
  2. Konsumsi rohangan disk langkung seueur. Kusabab indéks global (dipikaharti salaku indéks Asép Sunandar Sunarya) kalawan ngaran kolom nyokot spasi disk jeung duplikat pikeun tiap baris.

  1. Aksés anu langkung gancang kana nilai-nilai kolom individu, sabab henteu kedah nga-parse senar. Numutkeun tés kuring, éta 11,5% langkung gancang dina 2 kolom sareng seueur deui dina jumlah kolom anu langkung ageung.
  2. Leuwih gampang pikeun ngarobah skéma data
  3. Kode langkung jelas

kacindekan: teu for everyone. Kusabab speed mangrupakeun salah sahiji kauntungan paling konci globals, aya saeutik titik dina ngagunakeun palaksanaan ieu, saprak éta paling dipikaresep bakal ngalakukeun teu gancang ti tabel dina database relational.

3.4 Kasus umum. Tatangkalan jeung tatangkalan maréntahkeun

Sagala struktur data nu bisa digambarkeun salaku tangkal fits sampurna jeung globals.

3.4.1 Objék jeung subjék

Globals mangrupakeun harta-pedang pikeun nyimpen data. Tatangkalan. Bagian 2

Ieu mangrupikeun daérah panggunaan tradisional global. Dina widang médis aya sajumlah ageung panyakit, pangobatan, gejala, sareng metode pengobatan. Teu rasional nyieun méja kalayan sajuta widang pikeun tiap pasien. Leuwih ti éta, 99% tina widang bakal kosong.

Bayangkeun database SQL tabel: "pasien" ~ 100 widang, "Kedokteran" - 000 widang, "Terapi" - 100 widang, "Komplikasi" - 000 widang, jsb. teras salajengna. Atawa anjeun bisa nyieun database loba rébuan tabel, unggal pikeun tipe husus tina sabar (jeung maranéhna bisa tumpang tindih!), perlakuan, pangobatan, sarta rébuan deui tabel pikeun sambungan antara tabel ieu.

Globals idéal pikeun ubar, sabab ngamungkinkeun anjeun nyiptakeun katerangan anu akurat ngeunaan sajarah médisna pikeun unggal pasien, rupa-rupa terapi, sareng tindakan pangobatan, dina bentuk tangkal, tanpa ngaleungitkeun rohangan disk tambahan dina kolom kosong, sapertos kitu. jadi pasualan dina pasualan relasional.

Globals mangrupakeun harta-pedang pikeun nyimpen data. Tatangkalan. Bagian 2Ngagunakeun globals éta merenah pikeun nyieun database kalawan data ngeunaan jalma, Nalika hal anu penting pikeun ngumpulkeun sarta systematize maksimum rupa informasi ngeunaan klien nu. Ieu di paménta di ubar, perbankan, pamasaran, arsip sarta wewengkon séjén

.
Tangtosna, dina SQL anjeun ogé tiasa niru tangkal kalayan ngan sababaraha tabel (EAV, 1,2,3,4,5,6,7,8,9,10), kumaha oge ieu nyata leuwih pajeulit jeung bakal leuwih laun. Intina, anjeun kedah nyerat global anu tiasa dianggo dina tabel sareng nyumputkeun sadaya padamelan sareng tabel dina lapisan abstraksi. Lepat pikeun niru téknologi tingkat handap (global) nganggo téknologi tingkat luhur (SQL). Teu pantes.

Henteu aya rahasia yén ngarobih skéma data dina tabel raksasa (ALTER TABLE) tiasa nyandak waktos anu lumayan. MySQL, contona, ngalakukeun ALTER TABLE ADD|DROP COLUMN ku lengkep nyalin inpormasi tina méja lami ka méja énggal (dites MyISAM, mesin InnoDB). Anu tiasa ngagantungkeun pangkalan data damel sareng milyaran rékaman pikeun dinten-dinten, upami henteu minggu.

Globals mangrupakeun harta-pedang pikeun nyimpen data. Tatangkalan. Bagian 2Ngarobah struktur data lamun urang ngagunakeun globals ngarugikeun urang nanaon. Iraha waé urang tiasa nambihan sipat énggal anu urang peryogikeun kana obyék naon waé, dina tingkat mana waé hierarki. Parobahan pakait sareng ngaganti ngaran cabang bisa dijalankeun dina latar tukang dina database jalan.


Ku alatan éta, lamun datang ka nyimpen objék kalawan jumlah badag sipat pilihan, globals mangrupakeun pilihan hébat.

Sumawona, hayu atuh ngingetkeun yén aksés ka salah sahiji sipat téh instan, saprak di global sagala jalur anu B-tangkal.

Basis data global, sacara umum, mangrupikeun jinis database berorientasi dokumén kalayan kamampuan pikeun nyimpen inpormasi hirarki. Ku alatan éta, basis data berorientasi dokumén tiasa bersaing sareng global dina widang nyimpen rékaman médis. Tapi éta tetep henteu samiHayu urang nyandak MongoDB pikeun babandingan. Dina domain ieu éta kalah ka global kusabab alesan ieu:

  1. Ukuran dokumén. Unit panyimpenan nyaéta téks dina format JSON (leuwih tepatna BSON) kalayan volume maksimum kira-kira 16MB. Watesan éta dilakukeun sacara khusus supados database JSON henteu ngalambatkeun nalika parsing upami dokumen JSON ageung disimpen di jerona teras diaksés ku sawah. Dokumén ieu kedah ngandung sadaya inpormasi ngeunaan pasien. Urang sadayana terang kumaha kandel catetan pasien. Ukuran kartu maksimum 16MB geuwat nempatkeun hiji tungtung ka pasien anu kartu panyakit ngawengku file MRI, scan X-ray jeung studi lianna. Dina hiji cabang global anjeun tiasa gaduh gigabytes sareng terabyte inpormasi. Sacara prinsip, urang tiasa ngeureunkeun ieu, tapi kuring bakal neraskeun.
  2. Waktos eling / robah / ngahapus sipat anyar dina bagan pasien. database misalna kudu maca sakabéh peta kana mémori (ieu jumlah badag!), parse BSON, nambahkeun / ngarobah / mupus titik anyar, ngamutahirkeun indexes, pak kana BSON, sarta simpen ka disk. A global ngan perlu ngakses sipat husus sarta ngamanipulasi eta.
  3. Aksés gancang ka sipat individu. Kalawan loba sipat dina dokumen jeung struktur multi-tingkat na, aksés ka sipat individu bakal leuwih gancang alatan kanyataan yén unggal jalur di global mangrupa B-tangkal. Dina BSON, anjeun kedah nga-parse dokumen sacara linier pikeun milarian harta anu dipikahoyong.

3.3.2 Array gaul

Asép Sunandar Sunarya asosiatif (sanajan jeung susunan nested) pas sampurna dina globals. Contona, hiji Asép Sunandar Sunarya ti PHP bakal dipintonkeun dina gambar munggaran 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 Dokumén hirarki: XML, JSON

Ogé gampang disimpen di globals. Bisa diteundeun kaluar dina cara béda pikeun neundeun.

XML
Cara panggampangna pikeun nguraikeun XML kana global nyaéta pikeun nyimpen atribut tag dina titik. Sareng upami aksés gancang ka tag atribut diperyogikeun, maka urang tiasa mindahkeun kana cabang anu misah.

Globals mangrupakeun harta-pedang pikeun nyimpen data. Tatangkalan. Bagian 2

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

Dina COS ieu bakal pakait sareng kode:

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

Catetan: Pikeun XML, JSON, arrays associative, anjeun bisa datang nepi ka loba cara béda pikeun mintonkeun on globals. Dina hal ieu, kami henteu ngagambarkeun urutan subtags dina tag catetan. Sacara global ^xml subtags bakal dipintonkeun dina urutan abjad. Pikeun leres-leres ngagambarkeun pesenan, anjeun tiasa nganggo, contona, tampilan ieu:

Globals mangrupakeun harta-pedang pikeun nyimpen data. Tatangkalan. Bagian 2
JSON.
Gambar munggaran tina bagian 3.3.1 nunjukkeun pantulan dokumén JSON ieu:

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

3.3.4 Struktur idéntik disambungkeun ku hubungan hirarkis

Conto: struktur kantor penjualan, lokasi jalma dina struktur MLM, database bukaan dina catur.

Debut database. Anjeun tiasa nganggo perkiraan gaya stroke salaku nilai indéks titik global. Lajeng, dina raraga milih move neneng, éta bakal cukup pikeun milih cabang kalawan beurat greatest. Di global, sadaya cabang dina unggal tingkat bakal diurutkeun dumasar kakuatan gerak.

Globals mangrupakeun harta-pedang pikeun nyimpen data. Tatangkalan. Bagian 2

Struktur kantor penjualan, struktur jalma di MLM. Node bisa nyimpen nilai cache tangtu nu ngagambarkeun karakteristik sakabéh subtree. Contona, volume jualan subtree dibikeun. Iraha waé urang tiasa kéngingkeun tokoh anu ngagambarkeun prestasi cabang mana waé.

Globals mangrupakeun harta-pedang pikeun nyimpen data. Tatangkalan. Bagian 2

4. Dina kasus naon eta paling mangpaat ngagunakeun globals?

Kolom kahiji presents kasus dimana anjeun bakal meunang gain speed signifikan ku ngagunakeun globals, sarta kadua lamun desain atawa model data bakal disederhanakeun.

kagancangan
Gampang ngolah / presentasi data

  1. Selapkeun [kalayan asihan otomatis dina unggal tingkat], [indexing ku master key]
  2. Ngahapus subtrees
  3. Objék sareng seueur pasipatan anu meryogikeun aksés individu
  4. Struktur hierarkis kalayan kamampuan pikeun ngaliwat cabang anak tina cabang mana waé, bahkan anu henteu aya
  5. Jero-mimiti traversal tina subtrees
  1. Objék/éntitas kalawan sajumlah badag sipat/éntitas opsional [jeung/atawa nested].
  2. Data kirang skéma. Nalika sipat anyar sering tiasa muncul sareng anu lami ngaleungit.
  3. Anjeun kudu nyieun database custom.
  4. Dasar jalur sareng tangkal kaputusan. Nalika éta merenah pikeun ngagambarkeun jalur salaku tangkal.
  5. Ngahapus struktur hirarki tanpa nganggo rekursi

ngahadean "Globals mangrupikeun harta karun pikeun nyimpen data. Asép Sunandar Sunarya. Bagian 3".

Bantahan: Tulisan ieu sareng koméntar kuring kana éta mangrupikeun pendapat kuring sareng henteu aya hubunganana sareng posisi resmi InterSystems Corporation.

sumber: www.habr.com

Tambahkeun komentar