Recursos de design de um modelo de dados para NoSQL

Introdução


"VocĂŞ precisa
correr o mais rápido possível para permanecer no lugar, mas para chegar a algum lugar, você deve correr pelo menos duas vezes mais rápido!"
c) Alice no paĂ­s das maravilhas


Algum tempo atrás, fui convidado para dar uma palestra aos analistas da nossa empresa sobre o tema do design de modelos de dados, porque, quando nos sentamos em projetos por um longo tempo (às vezes por vários anos), perdemos de vista o que está acontecendo no mundo das tecnologias de TI. Em nossa empresa (por acaso), os bancos de dados NoSQL não são usados ​​em muitos projetos (pelo menos por enquanto); portanto, em minha palestra, prestei atenção a eles usando o exemplo do HBase e tentei orientar a apresentação do material para aqueles que nunca trabalhou. Em particular, ilustrei alguns recursos do design de modelo de dados usando um exemplo que li há vários anos no artigo “Introdução ao HB ase Schema Design”, de Amandeep Khurana. Analisando os exemplos, comparei entre si várias opções para solucionar o mesmo problema, a fim de melhor transmitir ao público as principais idéias.


Recentemente, "não há nada a fazer", me perguntei (fins de semana prolongados de maio em modo de quarentena são especialmente adequados para isso), quanto os cálculos teóricos corresponderão à prática? Na verdade, a idéia deste artigo nasceu. Um desenvolvedor que trabalha com o NoSQL há vários dias pode não aprender nada de novo com ele (e, portanto, pode gastar imediatamente meia centena). Mas para analistas que ainda não trabalharam em estreita colaboração com o NoSQL, acho que será útil obter um entendimento básico dos recursos de design dos modelos de dados para o HBase.


Analisando um Exemplo


, 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 .. , . « » .


Em conclusão - recomendações para quem está apenas começando a projetar modelos de dados no HBase: abstraia da experiência anterior com bancos de dados relacionais e lembre-se dos “mandamentos”:


  • Ao projetar, partimos dos padrões de manipulação de tarefas e dados, e nĂŁo do modelo de domĂ­nio
  • Acesso efetivo (sem verificação completa da tabela) - apenas por chave
  • Desnormalização
  • Linhas diferentes podem conter colunas diferentes
  • A composição dinâmica das colunas

All Articles