Fitur merancang model data untuk NoSQL

pengantar


"Kamu harus
berlari secepatnya hanya untuk tetap di tempat, tetapi untuk mendapatkan suatu tempat, kamu harus berlari setidaknya dua kali lebih cepat!"
(c) Alice di Negeri Ajaib


Beberapa waktu yang lalu saya diminta untuk memberikan ceramah kepada analis perusahaan kami tentang topik merancang model data, karena ketika kita duduk di proyek untuk waktu yang lama (kadang-kadang selama beberapa tahun) kita kehilangan pandangan tentang apa yang terjadi di dunia TI. Di perusahaan kami (kebetulan begitu), database NoSQL tidak digunakan pada banyak proyek (setidaknya untuk saat ini), jadi dalam kuliah saya, saya secara terpisah memperhatikan mereka menggunakan contoh HBase dan mencoba mengarahkan presentasi materi pada mereka yang tidak pernah bekerja. Secara khusus, saya menggambarkan beberapa fitur desain model data menggunakan contoh yang saya baca beberapa tahun yang lalu dalam artikel "Pengantar Desain Skema HB ase" oleh Amandeep Khurana. Menganalisis contoh-contoh itu, saya membandingkan di antara mereka sendiri beberapa opsi untuk memecahkan masalah yang sama agar dapat menyampaikan gagasan utama kepada audiens dengan lebih baik.


Baru-baru ini, "tidak ada yang bisa dilakukan", saya bertanya-tanya (akhir pekan panjang Mei dalam mode karantina sangat cocok untuk ini), berapa banyak perhitungan teoritis yang sesuai dengan praktik? Sebenarnya, ide artikel ini lahir. Pengembang yang telah bekerja dengan NoSQL selama beberapa hari mungkin tidak belajar sesuatu yang baru darinya (dan karenanya dapat langsung menghabiskan setengah ratus). Tetapi untuk analis yang belum bekerja sama dengan NoSQL, saya pikir ini akan berguna untuk mendapatkan pemahaman dasar tentang fitur desain model data untuk HBase.


Parsing Contoh


, NoSQL , «» «». . NoSQL . NoSQL , , . , ( ). , «» , . NoSQL . , , .


«» , :


. , ( , Linkedin). :
  • , ( )
  • / / ( )

, . (, , , , : , .., «»), /. :


user_idfriend_id

ID


HBase , :


  • , full table scan,
    • , SQL- – ; , , Impala SQL- Join’ HBase, …

ID . « ID ?» . «» ( 1 (default), ):


RowKey
1:2:3:
1:2:

. : 1, 2, … — , ID . , . (1, 2 3), – (1 2) – HBase, :


  • ( -> , -> )

:


  • : , , , RowKey = «» , «» . , « » False;
  • : : RowKey = «», . - , , ID .
  • : :
    • RowKey = «» , , ;
    • , , «» , «» .

, , « », , -. n. (n-1). (-1) , - .


  • : . (n)
  • : : , => (n)
  • : :
    • – => (n)
    • «» . « », (n-1) . , «-» - – n. ( , (2)) (n) . : «» , , :

, O(n).
, , , , - . «count», . - , «count». , «count» . .. 2 (count):


RowKey
1:2:3:count: 3
1:2:count: 2

:


  • : « ?» => (n)
  • : : , , «count» .. . (1)
  • : : , - «» . , , , => O(n)
  • , «count», , -

2 , « ». «» 3 (col).
« »: ! – , 1 (, , , «// ..»). «», NoSQL-, HBase :


RowKey
: 1: 1: 1
: 1: 1

. , :


  • : , , , «»: , True, – False => O(1)
  • : : : «ID » => O(1)
  • : : «ID » => O(1)

, , , , . , …


- . ? userID.friendID? ( 4(row)):


RowKey
.: 1
.: 1
.: 1
.: 1
.: 1

, , (1). 3 - .


«». , 4 , , , ( , HBase ). , . , userID friendID, , , . ( 5(hash)):


RowKey
dc084ef00e94aef49be885f9b01f51c01918fa783851db0dc1f72f83d33a5994: 1
dc084ef00e94aef49be885f9b01f51c0f06b7714b5ba522c3cf51328b66fe28a: 1
dc084ef00e94aef49be885f9b01f51c00d2c2e5d69df6b238754f650d56c896a: 1
1918fa783851db0dc1f72f83d33a59949ee3309645bd2c0775899fca14f311e1: 1
1918fa783851db0dc1f72f83d33a5994dc084ef00e94aef49be885f9b01f51c0: 1

, , , 4 – (1).
, :


1 (default)O(n)O(n)O(n)
2 (count)O(1)O(n)O(n)
3 (column)O(1)O(1)O(1)
4 (row)O(1)O(1)O(1)
5 (hash)O(1)O(1)O(1)

, 3-5 . , , , «», « ». 3. , , .



– . « » , (n). , , , « », «-». «-» :


  • ,

, , :


  • . n. " " – . , « » HBase . – «-»
  • . «», , . = - , «», – «». , «» «» ( 1 2). .
  • . . – ( «» , ). .

5 , , . n , , 5 .
n= 5. «» ID-:



{0: [1], 1: [4, 5, 3, 2, 1], 2: [1, 2], 3: [2, 4, 1, 5, 3], 4: [2, 1]} #  15 

{0: [1, 10800], 1: [5, 10800, 2, 10801, 4, 10802], 2: [1, 10800], 3: [3, 10800, 1, 10801, 5, 10802], 4: [2, 10800]} #  18  

{0: [1], 1: [1, 3, 2, 5, 4], 2: [1, 2], 3: [4, 1, 2, 3, 5], 4: [1, 2]} #  15 

, ID, 10 000 – , False. , «» .


Windows 10, - HBase, – Python Jupyter Notebook. 2 CPU 2 . , « », «» Python. HBase happybase, (MD5) 5 — hashlib


n = 10, 30, …. 170 – ( n) - ( 15 ).


, . . n, « » , «» , ( ).



– , . – .

3-5 «-», .
2 , , 2 3-5. , – - / HBase 2 . , .
1 , .
.

3-5 – , . 1 2 . 2 – - «count», n . - , . , ( , 1 2, ) ( " ").


– .



. 3-5 .
, , 4 5, , , 3. , – , , .


1 2, , . 2 1 – - - «» count.


:


  • 3-5 , HBase; .
  • 4 5 . , 5 . , .
  • , «-» , .


. , ( ). , thrift, happybase, , Python ( , ), HBase, Windows 10 .. , . « » .


Kesimpulannya - rekomendasi untuk siapa saja yang baru mulai merancang model data dalam HBase: abstrak dari pengalaman sebelumnya dengan database relasional dan ingat "perintah":


  • Saat mendesain, kita beralih dari pola manipulasi tugas dan data, dan bukan dari model domain
  • Akses efektif (tanpa pemindaian tabel penuh) - hanya dengan kunci
  • Denormalisasi
  • Baris yang berbeda mungkin berisi kolom yang berbeda
  • Komposisi kolom yang dinamis

All Articles