تخزين التسلسل الهرمي دليل في تخزين البيانات الرئيسية ذات القيمة

StackOverflow https://stackoverflow.com/questions/1619058

  •  06-07-2019
  •  | 
  •  

سؤال

ما هي طريقة تنظيف / كفاءة لتخزين الدليل التسلسل الهرمي / شجرة في قاعدة بيانات الرئيسية ذات القيمة (في حالتي MongoDB ولكن أي واحد منهم)؟

وعلى سبيل المثال هيكل شجرة

- Cars 
   + Audi 
   + BMW
      - M5
   + Ford
- Color
   + Red
      - Apple
      - Cherry
   + Purple
- Funny

والأسلوب الذي أستخدمه الآن، كل الروابط الكائن لانها الأم

{ 
  dir: "red"
  parent-dir: "color"
}

وهذا يجعل من فعالة جدا / بسرعة لادخال وإعادة ترتيب أي جانب من جوانب الشجرة (على سبيل المثال إذا كنت تريد أن تتحرك الأحمر وجميع انها الأطفال إلى الدليل سيارات).

ولكن هذه الطريقة تمتص عندما أريد أن كل الدلائل وأطفالهم لدليل معين بشكل متكرر. لجعلها فعالة لتحليل I يمكن أن يكون لها هيكل على سبيل المثال

{ 
  dir: "red"
  children: "audi, bmw, ford"
}

{ 
  dir: "bmw"
  children: "m5"
}

ولكن اذا كنت تريد تعديل شجرة، في مجمله مجموعة من الأشياء تحتاج إلى لمسها وتعديلها.

هل هناك أي طرق أخرى لتخزين بنية الدليل في مخزن KV؟

هل كانت مفيدة؟

المحلول

وويطلق على الطريقة التي تستخدمها حاليا الآن قائمة الجوار نموذج .

ونموذج آخر لتخزين البيانات الهرمية في قاعدة بيانات (العلائقية) هو متداخلة مجموعة نموذج . في href="http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/" في قواعد البيانات SQL هو معروف جيدا . انظر أيضا هذا المقال لتعديل شجرة بلاي اجتياز الخوارزمية .

وهناك طريقة بسيطة جدا: هل يمكن تخزين مسار لكل كائن - مع تلك التي ينبغي أن تكون سهلة للاستعلام الأشجار في قواعد البيانات NOSQL:

{ path: "Color", ... }
{ path: "Color.Red", ... }
{ path: "Color.Red.Apple", ... }
{ path: "Color.Red.Cherry", ... }

ومتى سيتم إزالة العقد أو إعادة تسميته يجب تحديث بعض المسارات. ولكن بصفة عامة، وهذه الطريقة تبدو واعدة. لديك فقط لحجز طابع خاص كفاصل. يجب أن يكون فوق مساحة التخزين يكاد يذكر.

تحرير: وتسمى هذه الطريقة تتحقق مسار

وأخيرا، وهنا هو href="http://seancribbs.com/tech/2009/09/28/modeling-a-tree-in-a-document-database" مقارنة طرق مختلفة لالبيانات الهرمية في NOSQL قواعد البيانات .

نصائح أخرى

وليس لدي كم هائل من الخبرة NOSQL، لذلك هذه ليست إجابة محددة، ولكن هنا كيف كنت الاقتراب منه:

وأنا من المرجح أن استخدام النهج الأول، حيث لديك:

{
  dir: 'dir_name',
  parent_dir: 'parent_dir_name'
}

وثم إعداد خريطة للحد من الاستعلام بسرعة الأطفال من الدليل. خريطة للحد من MongoDB في وظيفة لا تزال متاحة فقط في فرع التنمية وأنا لم تنجح مع ذلك حتى الآن، ولكن في كاوتش دي بي (وأفترض، مع عدد قليل من التعديل، في MongoDB) هل يمكن أن تفعل شيئا مثل:

map:
function(doc) {
  emit( doc.parent_dir, doc.dir );
}

reduce:
function(key, values) {
  return( values );
}

والتي من شأنها أن تعطي لك قائمة من الدلائل الفرعية لكل الدليل الأصل.

وأقترح تخزين كومة لفي هوية من عناصر البيانات. وأعتقد أن هذا هو أفضل خطة. إذا كنت بحاجة إلى الكثير والكثير من الاشياء أي عنصر كومة يمكن أن يكون مؤشرا لكومة أخرى.

وعلى سبيل المثال

و{ "id:xxx", "id:yyy", "sub-heap-id:zzz"....}

وإذا لم يكن هذا آخر اضحة التعليق وسأشرح أكثر عندما أحصل على منزل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top