Caractéristiques de la conception d'un modèle de données pour NoSQL

introduction


"Vous devez
courir aussi vite pour rester en place, mais pour arriver quelque part, vous devez courir au moins deux fois plus vite!"
(c) Alice au pays des merveilles


Il y a quelque temps, on m'a demandé de donner une conférence aux analystes de notre entreprise sur le thème de la conception de modèles de données, car lorsque nous nous asseyons sur des projets pendant une longue période (parfois pendant plusieurs années), nous perdons de vue ce qui se passe dans le monde informatique. Dans notre entreprise (ce qui est arrivé), les bases de données NoSQL ne sont pas utilisées sur de nombreux projets (du moins pour l'instant), donc dans ma conférence, je leur ai prêté une attention particulière en utilisant l'exemple HBase et j'ai essayé d'orienter la présentation du matériel sur ceux qui n'ont jamais travaillé. En particulier, j'ai illustré certaines caractéristiques de la conception d'un modèle de données en utilisant un exemple que j'ai lu il y a plusieurs années dans l'article «Introduction to HB ase Schema Design» par Amandeep Khurana. En analysant les exemples, j'ai comparé entre elles plusieurs options pour résoudre le même problème afin de mieux transmettre au public les idées principales.


Récemment, "il n'y a rien à faire", je me suis demandé (les longs week-ends de mai en mode quarantaine sont particulièrement adaptés à cela), combien de calculs théoriques correspondront à la pratique? En fait, l'idée de cet article est née. Un développeur qui travaille avec NoSQL depuis plusieurs jours peut ne rien en apprendre de nouveau (et peut donc en dépenser immédiatement une demi-centaine). Mais pour les analystes qui n'ont pas encore travaillé en étroite collaboration avec NoSQL, je pense que cela sera utile pour obtenir une compréhension de base des caractéristiques de conception des modèles de données pour HBase.


Analyser un exemple


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


En conclusion - recommandations pour tous ceux qui commencent tout juste à concevoir des modèles de données dans HBase: résumé de l'expérience précédente avec les bases de données relationnelles et rappelez-vous les «commandements»:


  • Lors de la conception, nous partons des modèles de tâche et de manipulation des donnĂ©es, et non du modèle de domaine
  • Accès efficace (sans analyse complète de la table) - uniquement par clĂ©
  • DĂ©normalisation
  • DiffĂ©rentes lignes peuvent contenir diffĂ©rentes colonnes
  • La composition dynamique des colonnes

All Articles