[Python] باستخدام مونغودب كقاعدة بيانات رئيسية لدينا، يجب استخدام قاعدة بيانات الرسم البياني منفصلة لتنفيذ العلاقات بين الكيانات؟


Answers

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

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

بصراحة على الرغم من أن أفضل طريقة لمعرفة ما يصلح لك هو أن تفعل بوك - منخفضة التكلفة، وقيمة عالية.

تنويه: أعمل ل نيو التكنولوجيا.

Question

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

كجزء من هذا الحل كرم نود أن تخزين العلاقات والجمعيات بين الكيانات، ومن الأمثلة على ذلك تخزين المعلومات تضارب المصالح والمساهمين والأمناء الخ ربط جميع هذه الكيانات معا في الطريقة الأكثر فعالية قررنا نموذجا مركزيا من "العلاقة" كان ضروريا . وينبغي أن تتضمن جميع العلاقات معلومات عن التاريخ مرتبطة بها (تواريخ البدء والانتهاء)، فضلا عن بيانات ميتا متفاوتة؛ على سبيل المثال علاقة المساهمين سوف تحتوي أيضا على عدد من الأسهم المحتفظ بها.

كما حلول ردبس التقليدية لا تناسب احتياجاتنا السابقة، واستخدامها في وضعنا الحالي ليست قابلة للحياة. ما أحاول تحديده هو ما إذا كان استخدام قاعدة بيانات الرسم البياني أكثر ملاءمة في حالتنا، أو إذا كان في الواقع مجرد استخدام مونغو المدمج في المعلومات العلائقية هو المناسب.

سيتم استخدام المعلومات العلاقة بشكل كبير جدا في جميع أنحاء النظام. ومن الأمثلة على بعض الاستفسارات المعلوماتية التي نرغب في تنفيذها هي:

  • الحصول على جميع الناس 'الاتصال الرئيسية' من الشركات الذين هم 'عملاء' شيز محدودة '
  • الحصول على جميع "المساهمين" الآخرين من الشركات حيث 'جون' هو مساهم
  • الحصول على جميع الناس "مفتاح الاتصال" من الكيانات الذين هم "عملاء" من "أبك محدودة" وعملاء من "الثقة بنا البنك محدودة"

وبالنظر إلى هذا "شجرة" هيكل العلاقات، يستخدم قاعدة بيانات الرسم البياني (مثل Neo4j) أكثر ملاءمة؟




انتهى بنا الأمر باستخدام كلاهما، ونحن نقوم بتنفيذ محرك بحث لشبكة النقل.

محاولة تنفيذ العلاقات في مونغودب يمكن أن تصبح غير عملي بمجرد تجاوز 1 أو 2 "وصلات". أساسا سوف يتم تخزين أوبجكتيدس في صفيف وإذا كنت ترغب في تنفيذ العلاقات ثنائية الاتجاه، ثم لديك لتنفيذ اثنين من وصلات منفصلة. في مونغو، "مؤشر" إلى كيان (أو "وصلة") هو مجرد خاصية نص آخر (التي يمكن تفسيرها بشكل مختلف)، فإنه ليس كائن من الدرجة الأولى مثل علاقة في Neo4j.

لذلك قررنا استخدام Neo4j لتخزين العلاقات و مونغودب لتخزين كل شيء آخر. ثم أصبح التحدي الحفاظ على متزامنة اثنين من المتاجر.

نحن نستخدم مشروع مختبر 10gen يسمى "مونغوكونكتور" وهو آلية للحفاظ على مونغودب متزامنة مع متجر آخر. المشروع غير معتمد حاليا، ولكن الشفرة متاحة:

http://blog.mongodb.org/post/29127828146/introducing-mongo-connector

يستخدم مونغوكونكتور آلية النسخ المتماثل لتنفيذ المزامنة. أساسا كنت مراقبة أوبلوغ مونغودب وكنت تنفذ الاستدعاءات لأي أوبيرتس (تحديث أو إدراج) وحذف. ويسمى هذا التنفيذ "دوكومنتماناجر" في مونغوكونكتور الكلام. انتهينا من تنفيذ Neo4jDocumentManager.

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

لقد كنت تخطط للحصول على الحديث وبلوق وظيفة، ولكن أنا لم تحصل عليه حتى الآن:

http://www.meetup.com/graphdb-boston/events/91703472/

هناك عيوب لهذا الحل، مثل الامور التي تخرج من المزامنة اذا كانت العملية تنخفض أو المزامنة بطيئة (وليس في الوقت الحقيقي).