Global minangka pedhang bandha kanggo nyimpen data. Wit-witan. Bagean 2

Global minangka pedhang bandha kanggo nyimpen data. Wit-witan. Bagean 2Miwiti - deleng bagean 1.

3. Varian saka struktur nalika nggunakake globals

Struktur kayata wit dhawuh duwe macem-macem kasus khusus. Ayo dipikirake sing duwe nilai praktis nalika nggarap global.

3.1 Kasus khusus 1. Siji simpul tanpa cabang


Global minangka pedhang bandha kanggo nyimpen data. Wit-witan. Bagean 2Global bisa digunakake ora mung kaya array, nanging uga kaya variabel biasa. Contone, minangka counter:

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

Ing kasus iki, global, saliyane kanggo makna, uga bisa duwe cabang. Siji ora ngilangi liyane.

3.2 Kasus khusus 2. Siji vertex lan akeh cabang

Umumé, iki minangka basis nilai kunci klasik. Lan yen kita nyimpen tuple nilai minangka nilai, kita bakal entuk tabel sing biasa banget kanthi kunci utama.

Global minangka pedhang bandha kanggo nyimpen data. Wit-witan. Bagean 2

Kanggo ngleksanakake tabel ing global, kita kudu nggawe baris dhewe saka nilai kolom, lan banjur nyimpen menyang global nggunakake tombol utami. Kanggo nggawe bisa dibagi string menyang kolom maneh nalika maca, sampeyan bisa nggunakake:

  1. karakter delimiter.
    Set ^t(id1) = "col11/col21/col31"
    Set ^t(id2) = "col12/col22/col32"
  2. skema kaku ing ngendi saben lapangan manggoni jumlah bita sing wis ditemtokake. Kaya sing ditindakake ing basis data relasional.
  3. fungsi khusus $ LB (kasedhiya ing Cache), kang nggawe senar saka nilai.
    Set ^t(id1) = $LB("col11", "col21", "col31")
    Set ^t(id2) = $LB("col12", "col22", "col32")

Apike, ora angel nggunakake global kanggo nindakake sing padha karo indeks sekunder ing basis data relasional. Ayo diarani indeks struktur kasebut global. Indeks global minangka wit tambahan kanggo nggoleki lapangan kanthi cepet sing dudu bagean saka kunci utama global utama. Kanggo ngisi lan nggunakake, sampeyan kudu nulis kode tambahan.

Ayo nggawe indeks global ing kolom pisanan.

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

Saiki, kanggo nggoleki informasi kanthi cepet ing kolom pisanan, kita kudu nggoleki global ^i lan temokake kunci utama (id) sing cocog karo nilai sing dikarepake ing kolom pisanan.

Nalika nglebokake nilai, kita bisa langsung nggawe nilai lan indeks global kanggo kolom sing dibutuhake. Lan kanggo linuwih, ayo mbungkus kabeh ing transaksi.

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

Rincian babagan carane nindakake ing M tabel ing globals, emulasi indeks sekunder.

Tabel kasebut bakal bisa digunakake kanthi cepet kaya ing basis data tradisional (utawa luwih cepet) yen fungsi kanggo nglebokake / nganyari / mbusak baris ditulis ing COS / M lan dikompilasi.Aku mriksa statement iki karo tes ing akeh INSERT lan SELECT menyang siji tabel loro-kolom, kalebu nggunakake printah TSTART lan TCOMMIT (transaksi).

Aku durung nyoba skenario sing luwih rumit kanthi akses bebarengan lan transaksi paralel.

Tanpa nggunakake transaksi, tingkat selipan ana 778 sisipan / detik saben yuta nilai.
Kanthi 300 yuta nilai - 422 sisipan / detik.

Nalika nggunakake transaksi - 572 sisipan / detik kanggo 082M sisipan. Kabeh operasi ditindakake saka kode M sing dikompilasi.
Hard drive biasa, ora SSD. RAID5 karo Tulis-bali. Prosesor Phenom II 1100T.

Kanggo nguji database SQL kanthi cara sing padha, sampeyan kudu nulis prosedur sing disimpen sing bakal nindakake sisipan ing daur ulang. Nalika nyoba MySQL 5.5 (panyimpenan InnoDB), nggunakake metode iki aku nampa nomer ora luwih saka 11K sisipan per detik.
Ya, implementasine tabel ing global katon luwih rumit tinimbang ing basis data relasional. Mulane, database industri ing global duwe akses SQL kanggo nyederhanakake karya karo data tabular.

Global minangka pedhang bandha kanggo nyimpen data. Wit-witan. Bagean 2Umumé, yen skema data ora kerep diganti, kacepetan sisipan ora kritis lan kabeh database bisa gampang diwakili ing wangun tabel normal, mula luwih gampang nggarap SQL, amarga menehi tingkat abstraksi sing luwih dhuwur. .

Global minangka pedhang bandha kanggo nyimpen data. Wit-witan. Bagean 2Ing kasus tartamtu iki aku wanted kanggo nuduhake sing globals bisa tumindak minangka konstruktor kanggo nggawe database liyane. Kaya assembler ing ngendi basa liyane bisa ditulis. Ing ngisor iki conto carane nggawe analog ing global nilai kunci, dhaptar, set, tabel, database berorientasi dokumen.

Yen sampeyan kudu nggawe sawetara jinis database non-standar karo gaweyan minimal, sampeyan kudu katon menyang global.

3.3 Kasus khusus 3. Wit loro tingkat, saben simpul tingkat kapindho duwe cabang sing tetep.

Global minangka pedhang bandha kanggo nyimpen data. Wit-witan. Bagean 2Sampeyan mbokmenawa guessed: iki minangka implementasine alternatif saka tabel ing globals. Ayo mbandhingake implementasine iki karo sing sadurunge.

Tabel ing wit loro-tingkat vs. ing wit siji tingkat.

Минусы
Плюсы

  1. Luwih alon kanggo selipan, amarga sampeyan kudu nyetel jumlah simpul sing padha karo jumlah kolom.
  2. Konsumsi papan disk luwih akeh. Wiwit indeks global (dimangerteni minangka indeks array) kanthi jeneng kolom njupuk spasi disk lan diduplikasi kanggo saben baris.

  1. Akses luwih cepet menyang nilai kolom individu, amarga ora perlu ngurai senar kasebut. Miturut tesku, 11,5% luwih cepet ing 2 kolom lan luwih akeh ing kolom sing luwih akeh.
  2. Luwih gampang ngganti skema data
  3. Kode luwih cetha

Kesimpulan: ora kanggo kabeh wong. Wiwit kacepetan iku salah siji saka keuntungan paling tombol saka global, ana sethitik titik ing nggunakake implementasine iki, awit iku paling kamungkinan bakal nindakake ora luwih cepet saka tabel ing database hubungan.

3.4 Kasus Umum. Wit lan wit dhawuh

Sembarang struktur data sing bisa diwakili minangka wit cocok banget karo global.

3.4.1 Obyek karo subyek

Global minangka pedhang bandha kanggo nyimpen data. Wit-witan. Bagean 2

Iki minangka area panggunaan tradisional global. Ing lapangan medis ana akeh penyakit, obat, gejala, lan cara perawatan. Ora rasional nggawe tabel kanthi yuta lapangan kanggo saben pasien. Kajaba iku, 99% lapangan bakal kosong.

Bayangake database SQL tabel: "pasien" ~ 100 kolom, "Kedokteran" - 000 kolom, "Terapi" - 100 kolom, "Komplikasi" - 000 kolom, lsp. lan liya-liyane. Utawa sampeyan bisa nggawe database akeh ewu tabel, saben kanggo jinis tartamtu saka sabar (lan padha bisa tumpang tindih!), Pangobatan, pangobatan, lan ewu tabel liyane kanggo sambungan antarane tabel iki.

Globals cocog kanggo obat, amarga ngidini sampeyan nggawe katrangan sing akurat babagan riwayat medis, macem-macem terapi, lan tumindak obat kanggo saben pasien, ing bentuk wit, tanpa mbuwang ruang disk ekstra ing kolom kosong, kaya sing bakal ditindakake. dadi kasus ing kasus relasional.

Global minangka pedhang bandha kanggo nyimpen data. Wit-witan. Bagean 2Nggunakake globals trep kanggo nggawe database karo data bab wong, nalika iku penting kanggo nglumpukake lan systematize maksimum macem-macem informasi babagan klien. Iki dikarepake ing obat, perbankan, pemasaran, arsip lan wilayah liyane

.
Mesthi, ing SQL sampeyan uga bisa niru wit kanthi mung sawetara tabel (EAV, 1,2,3,4,5,6,7,8,9,10), nanging iki luwih rumit lan bakal luwih alon. Ateges, sampeyan kudu nulis global sing bisa digunakake ing tabel lan ndhelikake kabeh karya karo tabel ing lapisan abstraksi. Iku salah kanggo niru teknologi tingkat ngisor (global) nggunakake teknologi tingkat sing luwih dhuwur (SQL). Ora pantes.

Ora ana rahasia manawa ngganti skema data ing tabel raksasa (ALTER TABLE) bisa njupuk wektu sing cukup. MySQL, contone, nindakake ALTER TABLE ADD|DROP COLUMN kanthi nyalin informasi saka tabel lawas menyang tabel anyar (mesin MyISAM, InnoDB sing diuji). Sing bisa nyumerepi database sing bisa digunakake kanthi milyaran cathetan sajrone pirang-pirang dina, yen ora minggu.

Global minangka pedhang bandha kanggo nyimpen data. Wit-witan. Bagean 2Ngganti struktur data yen nggunakake globals ora ana biaya. Sawayah-wayah kita bisa nambah properti anyar sing dibutuhake kanggo obyek apa wae, ing tingkat hierarki apa wae. Owah-owahan sing ana gandhengane karo ngganti jeneng cabang bisa ditindakake ing latar mburi ing basis data sing mlaku.


Mulane, nalika arep nyimpen obyek kanthi akeh sifat opsional, globals minangka pilihan sing apik.

Menapa malih, mugi kula ngelingake sampeyan manawa akses menyang sembarang properti iku cepet, amarga ing global kabeh dalan sing B-wit.

Database global, umume, minangka jinis database berorientasi dokumen kanthi kemampuan kanggo nyimpen informasi hirarkis. Mula, database berorientasi dokumen bisa saingan karo global ing lapangan nyimpen cathetan medis. Nanging isih ora padhaAyo njupuk MongoDB kanggo mbandhingake. Ing domain iki kalah karo global amarga alasan ing ngisor iki:

  1. Ukuran dokumen. Unit panyimpenan yaiku teks ing format JSON (luwih tepate BSON) kanthi volume maksimal udakara 16MB. Watesan kasebut digawe khusus supaya database JSON ora alon-alon sajrone parsing yen dokumen JSON sing gedhe disimpen ing kono banjur diakses dening lapangan. Dokumen iki kudu ngemot kabeh informasi babagan pasien. Kita kabeh ngerti kepiye cathetan pasien sing kandel. Ukuran kertu maksimal 16MB langsung mungkasi pasien sing kertu penyakit kalebu file MRI, scan sinar X lan studi liyane. Ing salah sawijining cabang global sampeyan bisa duwe gigabyte lan terabyte informasi. Ing asas, kita bisa mungkasi iki, nanging aku bakal terus.
  2. Wektu eling / owah-owahan / mbusak sifat anyar ing grafik pasien. Database kasebut kudu maca kabeh peta menyang memori (iki jumlah gedhe!), Parse BSON, nambah / ngganti / mbusak simpul anyar, nganyari indeks, ngemas menyang BSON, lan nyimpen menyang disk. Global mung kudu ngakses properti tartamtu lan ngapusi.
  3. Akses cepet menyang properti individu. Kanthi akeh properti ing dokumen lan struktur multi-level, akses menyang properti individu bakal luwih cepet amarga saben path ing global minangka B-wit. Ing BSON, sampeyan kudu ngurai dokumen kanthi linear kanggo nemokake properti sing dikarepake.

3.3.2 Susunan asosiatif

Susunan asosiatif (sanajan nganggo susunan bersarang) pas banget ing global. Contone, array kasebut saka PHP bakal ditampilake ing gambar pisanan 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 Dokumen hirarkis: XML, JSON

Uga gampang disimpen ing global. Bisa ditata ing macem-macem cara kanggo panyimpenan.

XML
Cara paling gampang kanggo ngurai XML dadi global yaiku kanggo nyimpen atribut tag ing node. Lan yen akses cepet menyang atribut tag dibutuhake, mula kita bisa mindhah menyang cabang sing kapisah.

Global minangka pedhang bandha kanggo nyimpen data. Wit-witan. Bagean 2

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

Ing COS iki bakal cocog karo kode:

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

Komentar: Kanggo XML, JSON, array asosiatif, sampeyan bisa nggawe macem-macem cara kanggo nampilake ing global. Ing kasus iki, kita ora nggambarake urutan subtag ing tag cathetan. Sacara global ^xml subtag bakal ditampilake ing urutan abjad. Kanggo strictly nggambarake urutan, sampeyan bisa nggunakake, contone, tampilan ing ngisor iki:

Global minangka pedhang bandha kanggo nyimpen data. Wit-witan. Bagean 2
JSON.
Gambar pisanan saka bagean 3.3.1 nuduhake bayangan saka dokumen JSON iki:

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

3.3.4 Struktur sing padha disambungake kanthi hubungan hirarkis

Conto: struktur kantor sales, lokasi wong ing struktur MLM, database bukaan ing catur.

Debut database. Sampeyan bisa nggunakake taksiran gaya stroke minangka nilai indeks simpul global. Banjur, kanggo milih pamindhahan sing paling kuat, bakal cukup kanggo milih cabang kanthi bobot paling gedhe. Ing global, kabeh cabang ing saben tingkat bakal diurutake miturut kekuatan pamindhahan.

Global minangka pedhang bandha kanggo nyimpen data. Wit-witan. Bagean 2

Struktur kantor sales, struktur wong ing MLM. Node bisa nyimpen nilai caching tartamtu sing nggambarake karakteristik kabeh subtree. Contone, volume dodolan subtree tartamtu. Ing wayahe kita bisa njaluk tokoh nggambarake prestasi saka cabang sembarang.

Global minangka pedhang bandha kanggo nyimpen data. Wit-witan. Bagean 2

4. Ing kasus apa sing paling migunani kanggo nggunakake globals?

Ing kolom pisanan presents kasus ngendi sampeyan bakal entuk gain kacepetan pinunjul kanthi nggunakake globals, lan kaloro nalika desain utawa model data bakal simplified.

Kacepetan
Gampang pangolahan / presentasi data

  1. Sisipan [kanthi ngurutake otomatis ing saben level], [indeks kanthi kunci master]
  2. Mbusak subtrees
  3. Obyek karo akeh properti nested sing mbutuhake akses individu
  4. Struktur hierarki kanthi kemampuan kanggo ngliwati cabang anak saka cabang apa wae, sanajan sing ora ana
  5. Jero-pisanan traversal saka subtrees
  1. Obyek/entitas kanthi sifat/entitas opsional [lan/utawa nested] akeh banget
  2. Data tanpa skema. Nalika properti anyar asring katon lan sing lawas ilang.
  3. Sampeyan kudu nggawe database khusus.
  4. Basis path lan wit keputusan. Nalika iku trep kanggo makili dalan minangka wit.
  5. Mbusak struktur hirarkis tanpa nggunakake rekursi

Lanjutan "Global minangka pedhang bandha kanggo nyimpen data. Susunan jarang. Bagian 3".

Nolak tanggung jawab: Artikel iki lan komentarku minangka pendapatku lan ora ana hubungane karo posisi resmi InterSystems Corporation.

Source: www.habr.com

Add a comment