Global adalah pedang harta karun untuk menyimpan data. pokok. Bahagian 2

Global adalah pedang harta karun untuk menyimpan data. pokok. Bahagian 2Bermula - lihat bahagian 1.

3. Varian struktur apabila menggunakan global

Struktur seperti pokok yang dipesan mempunyai pelbagai kes khas. Mari kita pertimbangkan yang mempunyai nilai praktikal apabila bekerja dengan global.

3.1 Kes khas 1. Satu nod tanpa cawangan


Global adalah pedang harta karun untuk menyimpan data. pokok. Bahagian 2Globals boleh digunakan bukan sahaja seperti tatasusunan, tetapi juga seperti pembolehubah biasa. Sebagai contoh, sebagai kaunter:

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

Dalam kes ini, global, sebagai tambahan kepada maknanya, juga boleh mempunyai cabang. Satu tidak mengecualikan yang lain.

3.2 Kes khas 2. Satu bucu dan banyak cabang

Secara umum, ini ialah asas nilai kunci klasik. Dan jika kita menyimpan satu tuple nilai sebagai nilai, kita akan mendapat jadual yang sangat biasa dengan kunci utama.

Global adalah pedang harta karun untuk menyimpan data. pokok. Bahagian 2

Untuk melaksanakan jadual pada global, kita perlu menjana sendiri baris daripada nilai lajur, dan kemudian menyimpannya ke global menggunakan kunci utama. Untuk membolehkan anda membahagikan rentetan kepada lajur sekali lagi semasa membaca, anda boleh menggunakan:

  1. watak pembatas.
    Set ^t(id1) = "col11/col21/col31"
    Set ^t(id2) = "col12/col22/col32"
  2. skim tegar di mana setiap medan menduduki bilangan bait yang telah ditetapkan. Seperti yang dilakukan dalam pangkalan data hubungan.
  3. fungsi khas $LB (tersedia dalam Cache), yang mencipta rentetan nilai.
    Set ^t(id1) = $LB("col11", "col21", "col31")
    Set ^t(id2) = $LB("col12", "col22", "col32")

Menariknya, tidak sukar untuk menggunakan global untuk melakukan sesuatu yang serupa dengan indeks sekunder dalam pangkalan data hubungan. Mari kita panggil indeks struktur sedemikian global. Indeks global ialah pokok tambahan untuk mencari medan dengan pantas yang bukan sebahagian daripada kunci utama global utama. Untuk mengisi dan menggunakannya, anda perlu menulis kod tambahan.

Mari buat indeks global pada lajur pertama.

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

Kini, untuk mencari maklumat dengan cepat dalam lajur pertama, kita perlu melihat ke dalam global ^i dan cari kunci utama (id) yang sepadan dengan nilai yang dikehendaki bagi lajur pertama.

Apabila memasukkan nilai, kami boleh mencipta nilai dan indeks global dengan serta-merta untuk medan yang diperlukan. Dan untuk kebolehpercayaan, mari kita bungkus semuanya dalam transaksi.

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

Butiran tentang cara melakukannya pada M jadual mengenai global, emulasi indeks sekunder.

Jadual sedemikian akan berfungsi secepat dalam pangkalan data tradisional (atau lebih pantas) jika fungsi untuk memasukkan/mengemas kini/memadam baris ditulis dalam COS/M dan disusun.Saya menyemak kenyataan ini dengan ujian pada INSERT dan SELECT pukal ke dalam satu jadual dua lajur, termasuk menggunakan arahan TSTART dan TCOMMIT (transaksi).

Saya belum menguji senario yang lebih kompleks dengan akses serentak dan transaksi selari.

Tanpa menggunakan urus niaga, kadar sisipan ialah 778 sisipan/saat setiap juta nilai.
Dengan 300 juta nilai - 422 sisipan/saat.

Apabila menggunakan transaksi - 572 sisipan/saat untuk sisipan 082M. Semua operasi dilakukan daripada kod M yang disusun.
Pemacu keras adalah biasa, bukan SSD. RAID5 dengan Tulis Balik. Pemproses Phenom II 1100T.

Untuk menguji pangkalan data SQL dengan cara yang sama, anda perlu menulis prosedur tersimpan yang akan melakukan sisipan dalam gelung. Apabila menguji MySQL 5.5 (storan InnoDB), menggunakan kaedah ini saya menerima nombor tidak lebih daripada 11K sisipan sesaat.
Ya, pelaksanaan jadual pada global kelihatan lebih kompleks daripada dalam pangkalan data hubungan. Oleh itu, pangkalan data industri pada global mempunyai akses SQL untuk memudahkan kerja dengan data jadual.

Global adalah pedang harta karun untuk menyimpan data. pokok. Bahagian 2Secara umum, jika skema data tidak akan berubah dengan kerap, kelajuan sisipan tidak kritikal dan keseluruhan pangkalan data boleh diwakili dengan mudah dalam bentuk jadual yang dinormalkan, maka lebih mudah untuk bekerja dengan SQL, kerana ia menyediakan tahap abstraksi yang lebih tinggi. .

Global adalah pedang harta karun untuk menyimpan data. pokok. Bahagian 2Dalam kes ini saya ingin menunjukkannya globals boleh bertindak sebagai pembina untuk mencipta pangkalan data lain. Seperti penghimpun di mana bahasa lain boleh ditulis. Berikut ialah contoh cara anda boleh mencipta analog pada global nilai kunci, senarai, set, jadual, pangkalan data berorientasikan dokumen.

Jika anda perlu mencipta beberapa jenis pangkalan data bukan standard dengan usaha yang minimum, maka anda harus melihat ke arah global.

3.3 Kes khas 3. Pokok dua peringkat, setiap nod tahap kedua mempunyai bilangan cawangan tetap

Global adalah pedang harta karun untuk menyimpan data. pokok. Bahagian 2Anda mungkin meneka: ini adalah pelaksanaan alternatif jadual pada global. Mari kita bandingkan pelaksanaan ini dengan yang sebelumnya.

Jadual pada pokok dua tingkat vs. pada pokok satu tingkat.

Kekurangan
Kelebihan

  1. Lebih perlahan untuk sisipan, kerana anda perlu menetapkan bilangan nod sama dengan bilangan lajur.
  2. Lebih banyak penggunaan ruang cakera. Memandangkan indeks global (difahamkan sebagai indeks tatasusunan) dengan nama lajur mengambil ruang cakera dan diduplikasi untuk setiap baris.

  1. Akses lebih cepat kepada nilai lajur individu, kerana tidak perlu menghuraikan rentetan. Menurut ujian saya, ia adalah 11,5% lebih pantas pada 2 lajur dan lebih banyak pada bilangan lajur yang lebih besar.
  2. Lebih mudah untuk menukar skema data
  3. Kod yang lebih jelas

Kesimpulan: Bukan untuk semua orang. Memandangkan kelajuan adalah salah satu faedah utama global, tiada gunanya menggunakan pelaksanaan ini, kerana ia berkemungkinan besar akan berprestasi tidak lebih pantas daripada jadual dalam pangkalan data hubungan.

3.4 Kes am. Pokok dan pokok yang dipesan

Sebarang struktur data yang boleh diwakili sebagai pepohon sangat sesuai dengan global.

3.4.1 Objek dengan subobjek

Global adalah pedang harta karun untuk menyimpan data. pokok. Bahagian 2

Ini adalah kawasan penggunaan tradisional global. Dalam bidang perubatan terdapat sejumlah besar penyakit, ubat-ubatan, gejala, dan kaedah rawatan. Adalah tidak rasional untuk mencipta jadual dengan sejuta medan untuk setiap pesakit. Selain itu, 99% daripada medan akan kosong.

Bayangkan pangkalan data SQL jadual: "pesakit" ~ 100 medan, "Perubatan" - 000 medan, "Terapi" - 100 medan, "Komplikasi" - 000 medan, dsb. dan sebagainya. Atau anda boleh membuat pangkalan data beribu-ribu jadual, setiap satu untuk jenis pesakit tertentu (dan mereka boleh bertindih!), rawatan, ubat-ubatan dan beribu-ribu lagi jadual untuk sambungan antara jadual ini.

Globals sesuai untuk perubatan, kerana ia membolehkan anda mencipta bagi setiap pesakit penerangan yang tepat tentang sejarah perubatannya, pelbagai terapi, dan tindakan ubat-ubatan, dalam bentuk pokok, tanpa membuang ruang cakera tambahan pada lajur kosong, seperti yang akan menjadi kes dalam kes hubungan.

Global adalah pedang harta karun untuk menyimpan data. pokok. Bahagian 2Menggunakan global adalah mudah untuk mencipta pangkalan data dengan data tentang orang, apabila penting untuk mengumpul dan menyusun secara maksimum pelbagai maklumat tentang pelanggan. Ini adalah permintaan dalam bidang perubatan, perbankan, pemasaran, arkib dan kawasan lain

.
Sudah tentu, dalam SQL anda juga boleh meniru pokok dengan hanya beberapa jadual (EAV, 1,2,3,4,5,6,7,8,9,10), namun ini jauh lebih rumit dan akan menjadi lebih perlahan. Pada asasnya, anda perlu menulis global yang berfungsi pada jadual dan menyembunyikan semua kerja dengan jadual di bawah lapisan abstraksi. Adalah salah untuk mencontohi teknologi peringkat rendah (global) menggunakan teknologi peringkat tinggi (SQL). Tidak sesuai.

Bukan rahsia lagi bahawa menukar skema data pada jadual gergasi (ALTER TABLE) boleh mengambil masa yang agak lama. MySQL, sebagai contoh, melakukan ALTER TABLE ADD|DROP COLUMN dengan menyalin sepenuhnya maklumat daripada jadual lama ke jadual baharu (enjin MyISAM, InnoDB yang diuji). Yang boleh menutup pangkalan data yang berfungsi dengan berbilion-bilion rekod selama beberapa hari, jika tidak berminggu-minggu.

Global adalah pedang harta karun untuk menyimpan data. pokok. Bahagian 2Mengubah struktur data jika kami menggunakan globals tidak memerlukan sebarang bayaran. Pada bila-bila masa kita boleh menambah sebarang sifat baharu yang kita perlukan pada mana-mana objek, pada mana-mana peringkat hierarki. Perubahan yang dikaitkan dengan menamakan semula cawangan boleh dijalankan di latar belakang pada pangkalan data yang sedang berjalan.


Oleh itu, apabila ia datang untuk menyimpan objek dengan sejumlah besar sifat pilihan, global adalah pilihan yang bagus.

Selain itu, izinkan saya mengingatkan anda bahawa akses kepada mana-mana sifat adalah segera, kerana di peringkat global semua laluan adalah pokok-B.

Pangkalan data global, secara amnya, adalah sejenis pangkalan data berorientasikan dokumen dengan keupayaan untuk menyimpan maklumat hierarki. Oleh itu, pangkalan data berorientasikan dokumen boleh bersaing dengan global dalam bidang menyimpan rekod perubatan. Tetapi ia masih tidak samaMari ambil MongoDB sebagai perbandingan. Dalam domain ini ia kalah kepada global atas sebab-sebab berikut:

  1. Saiz dokumen. Unit storan ialah teks dalam format JSON (lebih tepat lagi BSON) dengan volum maksimum kira-kira 16MB. Sekatan dibuat secara khusus supaya pangkalan data JSON tidak menjadi perlahan semasa menghuraikan jika dokumen JSON yang besar disimpan di dalamnya dan kemudian diakses oleh medan. Dokumen ini harus mengandungi semua maklumat tentang pesakit. Kita semua tahu betapa tebalnya rekod pesakit. Saiz kad maksimum 16MB segera menamatkan pesakit yang kad penyakitnya termasuk fail MRI, imbasan X-ray dan kajian lain. Dalam satu cabang global anda boleh mempunyai maklumat gigabait dan terabait. Pada dasarnya, kita boleh menamatkan perkara ini, tetapi saya akan teruskan.
  2. Masa kesedaran / perubahan / pemadaman sifat baru dalam carta pesakit. Pangkalan data sedemikian mesti membaca keseluruhan peta ke dalam memori (ini adalah jumlah yang besar!), menghuraikan BSON, menambah/menukar/memadam nod baharu, mengemas kini indeks, membungkusnya ke dalam BSON, dan menyimpannya ke cakera. Global hanya perlu mengakses harta tertentu dan memanipulasinya.
  3. Akses pantas ke hartanah individu. Dengan banyak sifat dalam dokumen dan struktur berbilang peringkatnya, akses kepada sifat individu akan menjadi lebih pantas disebabkan hakikat bahawa setiap laluan dalam global ialah pokok B. Dalam BSON, anda perlu menghuraikan dokumen secara linear untuk mencari harta yang dikehendaki.

3.3.2 Tatasusunan bersekutu

Tatasusunan bersekutu (walaupun dengan tatasusunan bersarang) sesuai dengan sempurna pada global. Sebagai contoh, tatasusunan sedemikian daripada PHP akan dipaparkan dalam gambar pertama 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 hierarki: XML, JSON

Juga mudah disimpan dalam global. Boleh dibentangkan dengan cara yang berbeza untuk penyimpanan.

XML
Cara paling mudah untuk menguraikan XML kepada global ialah menyimpan atribut tag dalam nod. Dan jika akses pantas kepada atribut tag diperlukan, maka kita boleh memindahkannya ke cawangan yang berasingan.

Global adalah pedang harta karun untuk menyimpan data. pokok. Bahagian 2

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

Pada COS ini sepadan dengan kod:

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

Ulasan: Untuk XML, JSON, tatasusunan bersekutu, anda boleh menghasilkan pelbagai cara untuk memaparkan secara global. Dalam kes ini, kami tidak menggambarkan susunan subteg dalam teg nota. Secara global ^xml subteg akan dipaparkan dalam susunan abjad. Untuk menggambarkan pesanan dengan tegas, anda boleh menggunakan, sebagai contoh, paparan berikut:

Global adalah pedang harta karun untuk menyimpan data. pokok. Bahagian 2
JSON.
Gambar pertama dari bahagian 3.3.1 menunjukkan pantulan dokumen JSON ini:

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

3.3.4 Struktur yang sama disambungkan oleh hubungan hierarki

Contoh: struktur pejabat jualan, lokasi orang dalam struktur MLM, pangkalan data pembukaan dalam catur.

Pangkalan data sulung. Anda boleh menggunakan anggaran daya lejang sebagai nilai indeks nod global. Kemudian, untuk memilih langkah terkuat, sudah cukup untuk memilih cawangan dengan berat yang paling besar. Di peringkat global, semua cawangan di setiap peringkat akan diisih mengikut kekuatan pergerakan.

Global adalah pedang harta karun untuk menyimpan data. pokok. Bahagian 2

Struktur pejabat jualan, struktur orang dalam MLM. Nod boleh menyimpan nilai caching tertentu yang mencerminkan ciri keseluruhan subpokok. Contohnya, volum jualan subpokok tertentu. Pada bila-bila masa kita boleh mendapatkan angka yang mencerminkan pencapaian mana-mana cawangan.

Global adalah pedang harta karun untuk menyimpan data. pokok. Bahagian 2

4. Dalam kes apakah penggunaan global yang paling berfaedah?

Lajur pertama membentangkan kes di mana anda akan mendapat peningkatan kelajuan yang ketara dengan menggunakan global, dan yang kedua apabila reka bentuk atau model data akan dipermudahkan.

Kelajuan
Kemudahan pemprosesan/pembentangan data

  1. Sisipan [dengan pengisihan automatik pada setiap peringkat], [pengindeksan dengan kunci induk]
  2. Mengeluarkan subpokok
  3. Objek dengan banyak sifat bersarang yang memerlukan akses individu
  4. Struktur hierarki dengan keupayaan untuk memintas cawangan anak dari mana-mana cawangan, walaupun yang tidak wujud
  5. Kedalaman-pertama lintasan subpokok
  1. Objek/entiti dengan sejumlah besar sifat/entiti pilihan [dan/atau bersarang].
  2. Data tanpa skema. Apabila sifat baru sering boleh muncul dan yang lama hilang.
  3. Anda perlu membuat pangkalan data tersuai.
  4. Pangkalan laluan dan pokok keputusan. Apabila ia sesuai untuk mewakili laluan sebagai pokok.
  5. Mengalih keluar struktur hierarki tanpa menggunakan rekursi

Tambahan “Global adalah pedang harta karun untuk menyimpan data. Susunan jarang. Bahagian 3".

Penafian: Artikel ini dan ulasan saya mengenainya adalah pendapat saya dan tidak mempunyai kaitan dengan kedudukan rasmi InterSystems Corporation.

Sumber: www.habr.com

Tambah komen