ميزات تصميم نموذج بيانات NoSQL

المقدمة


"أنت بحاجة إلى
الجري بسرعة لمجرد البقاء في مكانك ، ولكن للوصول إلى مكان ما ، يجب أن تركض بسرعة مضاعفة على الأقل!"
(ج) أليس في بلاد العجائب


طُلب مني منذ بعض الوقت أن ألقي محاضرة لمحللي شركتنا حول موضوع تصميم نماذج البيانات ، لأنه عندما نجلس في المشاريع لفترة طويلة (أحيانًا لعدة سنوات) ، نفقد ما يحدث حول عالم تكنولوجيا المعلومات. في شركتنا (حدث ذلك للتو) ، لا يتم استخدام قواعد بيانات NoSQL في العديد من المشاريع (على الأقل في الوقت الحالي) ، لذلك في محاضرتني ، قمت بإعطائها بعض الاهتمام بشكل منفصل باستخدام مثال HBase وحاولت توجيه عرض المواد على أولئك الذين لم يسبق لهم عمل. على وجه الخصوص ، لقد أوضحت بعض ميزات تصميم نموذج البيانات باستخدام مثال قرأته قبل عدة سنوات في مقالة "مقدمة إلى HB ase Schema Design" بقلم أمانديب خورانا. بتحليل الأمثلة ، قارنت فيما بينها عدة خيارات لحل نفس المشكلة من أجل توصيل الأفكار الرئيسية للجمهور بشكل أفضل.


تساءلت مؤخرًا ، "ليس هناك ما يجب فعله" ، (تعد عطلات نهاية الأسبوع الطويلة في شهر مايو في وضع الحجر الصحي مناسبة بشكل خاص لهذا) ، إلى أي مدى تتوافق الحسابات النظرية مع الممارسة؟ في الواقع ، ولدت فكرة هذه المقالة. قد لا يتعلم المطور الذي يعمل مع NoSQL لعدة أيام أي شيء جديد منه (وبالتالي يمكن أن ينفق على الفور نصف مائة). ولكن بالنسبة للمحللين الذين لم يعملوا بعد بشكل وثيق مع NoSQL ، أعتقد أنه سيكون مفيدًا للحصول على فهم أساسي لميزات تصميم نماذج البيانات لـ HBase.


تحليل مثال


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


في الختام - توصيات لأي شخص بدأ للتو في تصميم نماذج البيانات في HBase: الملخص من التجربة السابقة مع قواعد البيانات العلائقية وتذكر "الوصايا":


  • عند التصميم ، ننتقل من أنماط معالجة المهام والبيانات ، وليس من نموذج المجال
  • الوصول الفعال (بدون مسح جدول كامل) - فقط عن طريق المفتاح
  • الحرمة
  • قد تحتوي الخطوط المختلفة على أعمدة مختلفة
  • التكوين الديناميكي للأعمدة

All Articles