Monday, 12 March 2018

استراتيجية إصدار كوشدب


استراتيجية إصدار كوشدب.
ضع كل نوع مستند في دب-d الخاص به أو إذا كان هذا يبدو متطرفا، على الأقل فصل أعلى حجم الوثائق إلى قواعد البيانات الخاصة بهم. وهذا النهج مماثل لنهج العقد الأصلي والتعديلات اللاحقة له. البيرة تثبيت نسخة محددة من الصيغة؟ الآن لمستقبل ممكن من سوشدب: وإذا كنت تتمتع هذه المقالة، قد ترغب أيضا مقالنا على سكالينغ مراجعة المدونة.
فيديو حسب الموضوع:
نودب ويبينار سيريز - نظرة عامة على التقنية.
5 ردود على & لدكو؛ استراتيجية إصدار كوتشدب & رديقو؛
مؤشر قناة السلع (تسي) هو مذبذب قدمه دونالد لامبرت في عام 1980.
افتح حساب فكست فوريكس التجريبي وممارسة مخاطر تداول العملات الأجنبية مجانا.
معرفة المزيد عن كل وسيط من خلال قراءة الاستعراضات المفصلة لدينا، ثم ببساطة اختيار.
احصائيات كاملة على اللاعبين لفك، منتجات النادي، الشركاء الرسميين وغيرها الكثير.

ما وراء تطبيقات الويب التقدمي الجزء 3: ما هو في النسخة؟
هذا هو الجزء الثالث من سلسلة جزء ثلاثة حول مزامنة البيانات وراء تطبيقات الويب التقدمية. يرجى قراءة الجزء الأول والجزء الثاني قبل المتابعة.
دعونا القفز الحق في!
في المثال من الجزء الثاني، مع تحديث القصص بعد إنشائها، ومع تمكن التطبيقات من طلب قائمة من القصص الحالية في أي وقت، رأينا بالفعل كيفية التعامل مع إصدارات مختلفة من القصة في حسابنا ل دلتا للحصول على التطبيق لتحميل.
ويستكشف هذا الجزء الثالث مخططات إصدار مختلفة ويناقش مقايضات كل منها. قبل أن نذهب إليها، دعونا ننظر بإيجاز إلى أي نوع من التقنية التي نبحث عنها.
وبالنظر إلى كائنين مع نفس الهوية، ونحن بحاجة إلى أن تكون قادرة على معرفة أي واحد جاء بعد الآخر، لذلك نحن نعرف أي واحد هو آخر واحد.
إذا كان لدينا أكثر من اثنين، ونحن بحاجة إلى أن تكون قادرة على وضعها في قائمة أمر، لذلك نحن نعرف أي منها تأتي بعد الآخرين، وحتى نتمكن من معرفة أي واحد هو الأحدث، أو أحدث. ونحن بحاجة إلى أن نكون قادرين على معرفة ما إذا كان إصدار أحدث من كائن هو سلف واحد أقدم.
زيادة عدد صحيح.
الفكرة الأولى والأكثر طبيعية للدلالة على إصدارات وثيقة زيادة الأعداد الصحيحة. هذا مجرد وسيلة الهوى لقول "الإصدار 1"، "الإصدار 2"، "الإصدار 3"، وهلم جرا.
ميزة هنا هي أن هذه الأرقام نسخة من السهل جدا أن نفهم للبشر وأجهزة الكمبيوتر على حد سواء.
إذا ما هي المشكلة؟
تخيل جهاز العميل والخادم تحديث واحد من كائنات قصتنا بشكل مستقل. قصتنا هي في "الإصدار 1". ثم يقوم الخادم بإنشاء "الإصدار 2" لأن هذا هو التالي في السلسلة.
العميل أيضا بإنشاء "الإصدار 2"، ولكن ليس لدينا أي وسيلة لمعرفة ما إذا كانت محتويات الإصدارات هي نفسها. عندما نحاول مزامنة العميل والخادم الآن، واجهنا مشكلة.
نحن بحاجة إلى العثور على شيء أفضل لوصف الإصدارات لدينا.
الطوابع الزمنية.
الفكرة المشتركة التالية للدلالة على إصدارات وثيقة هو الطابع الزمني، لقطة من ساعة على بعض الأجهزة، السبت 23 يوليو 02:16:57 2005، أو 12569537329. على سبيل المثال، يمكن أن يكون لدينا كائنات قصة مع خاصية محدثةأننا تعيين الطابع الزمني من التحديث الأخير ل. وعندما نقوم أولا بإنشاء الكائن، ونحن أيضا تسجيل الوقت الحالي.
جانبا: هناك العديد من الأشكال للطوابع الزمنية مع خصائص تتراوح من السهل أن تقرأ للبشر لتسهيل معالجتها لأجهزة الكمبيوتر. أيا كان اختيارك يعتمد على مجموعة من المقايضات لطلبك ومناقشة مزايا شكل واحد ضد آخر هو خارج نطاق هذه المادة. إذا كنت ترغب فقط في اختيار واحدة جيدة عموما، انتقل مع إسو 8601.
عندما يكون لدينا اثنين من الأشياء قصة مع نفس الهوية، يمكننا مقارنة الطوابع الزمنية لمعرفة أي واحد هو أحدث نسخة من قصتنا. مع الوقت لديه خاصية مريحة من زيادة رتابة، وبعبارة أخرى: الساعات فقط من أي وقت مضى يذهب إلى الأمام، وهذا سوف يكون إلى الأبد صحيح.
أو سوف؟ قبل أن تذهب، أود منك أن تقرأ هذه المجموعة الرائعة من الباطل أن المبرمجين يعتقدون حول الوقت و تتمة.
ويقول نحن تحرير دفتر العناوين لدينا على الهاتف لدينا. أولا نضيف رقم هاتف جديد لجهة الاتصال. أرقام الهاتف هي إيكي لكتابة ذلك مرة واحدة نقوم به ومقارنتها إلى حيث كتب عليه، ونحن نرى تبادلنا رقمين.
تحت غطاء محرك السيارة سجلنا الطابع الزمني الحالي للهاتف في إصدارات الكائن لدينا، لذلك نحن نعرف أي واحد كان آخر. نحن إصلاح الأرقام مبادلة بسرعة، لا ضرر القيام به. أو هل هناك؟
كما رأينا في الباطل، وهذا ليس صحيحا دائما. في الواقع، حتى الشركات مع الهندسة اللانهائية والموارد العمليات مثل جوجل يمكن أن تواجه مشكلة مع هذا.
هناك عدد من الأشياء التي يمكن أن تحدث، مثل خادم الوقت المارقة تخبر ساعة الهاتف للتكيف مع وقت سابق، أو مفتاح التوقيت الصيفي (محظوظا يحدث في الليل!)، كما حافظت فون أبل وجود مشاكل مع أجهزة الإنذار تعيين ل 1 يناير.
في مثالنا، هذا يعني أن رقم الهاتف مع الخطأ المطبعي البقاء على قيد الحياة كما أحدث تعديل على كائننا، وليس الصحيح. هذا ليس ما أردنا.
وأيا كان السيناريو الدقيق، فهذا أمر معقول ووثيقة موثقة في الأنظمة الصغيرة والكبيرة الحجم: لا يمكنك الاعتماد على الطوابع الزمنية لضمان ترتيب عنصرين، حتى لو تم إنشاء الطوابع الزمنية على نفس الجهاز حيث تؤدي إلى البيانات خسارة .
حسنا. كيف يمكننا تحسين الطوابع الزمنية؟
وقبل أن نكتشف ذلك، نحتاج إلى إدخال مفهوم جديد آخر: الصراعات.
احتضان الصراعات.
لتوضيح الصراعات، نحتاج إلى توسيع مثالنا قليلا. تخيل التطبيق لدينا ليست مجرد التطبيق الاستهلاك للأشخاص الذين يرغبون في قراءة قصصنا، وإنما هو جزء من نظام إدارة المحتوى (كمس) حيث يمكن للكتاب قصة تحديث قصصهم.
نظامنا كما تم تصميمه حتى الآن يعمل بالفعل في هذه الحالة؛ يمكن أن يكون لدينا طلب الخادم آخر التحديثات قصة من التطبيق من جميع المؤلفين، ويمكن بعد ذلك إرسال التحديثات إلى أي تطبيقات القراء لدينا.
الآن تخيل هذا يحدث: محرر باستخدام كمس لتحرير قصة من قبل المؤلف لإصلاح الخطأ المطبعي، في حين أن المؤلف هو تحديث نفس القصة مع أحدث التطورات، ونحن نستخدم الطابع الزمني للدلالة على أي إصدار هو الأحدث.
حتى لو كان لدينا الآن جهازين مع الساعات متزامنة تماما (التي تعلمناها بالفعل، ونحن لا يمكن أن نضمن لدينا)، وهذا يدل على مشكلة أكبر: ماذا يحدث إذا كان شخصين إجراء تغييرات على نفس الكائن على جهازين مختلفين تقريبا في نفس الوقت؟
أنها لا تساعد أن نعرف أي واحد تم تحديثها بعد الآخر، إما أن نختار أحدث التطورات قصة والحفاظ على الخطأ المطبعي، أو العكس بالعكس. وهذا ما يسمى تقليديا بالصراع.
إذا كنت أي شيء مثلي (ربما كنت لا، ولكن تحمل معي)، كنت لا تحب فكرة الصراعات. أنا، كما يطلقون عليه، نفوذ الصراع. وفي حين أن تبني الصراعات قد يكون استراتيجية لائقة في الحياة الحقيقية، في الحوسبة، ونحن عادة تدرب على أن الصراعات سيئة. سيئ جدا.
هذا هو حتى نبدأ في التعلم عن النظم الموزعة. هذا هو مصطلح قوي بالنسبة لكثير من الأفكار والمفاهيم، ولكن عادة ما يتلخص في: لديك اثنين أو أكثر من أجهزة الكمبيوتر متصلة بشبكة من نوع وكنت تحاول جعله حتى بعض قطعة من البيانات تبدو هي نفسها على كل من أجهزة الكمبيوتر .
الآن الجزء الصعب هو: إما أن الكمبيوتر يمكن أن تفشل في أي وقت، والشبكة يمكن أن يكون العديد من سيناريوهات الفشل (سف فالاسيز من الشبكات الحاسبات) التي تتراوح من جعل الكمبيوتر الآخر تظهر بعيدا جدا، أو مشغول جدا، أو أطفئ.
أنظمة الموزعة هي حقل كبير مع الكثير من التطبيقات، ولكن هذا يجب أن لا يخيف لنا. من ناحية، لدينا نظام موزع في أيدينا: جهازين وخادم، كل متصل عبر الإنترنت.
هذا يناسب "اثنين أو أكثر من أجهزة الكمبيوتر المتصلة بواسطة شبكة" تعريف. ولكن بدلا من إدخال حقل جديد كامل من الحوسبة في مناقشتنا، سوف نتعلم فقط بعض أفضل الممارسات من النظم الموزعة ومن ثم تكون في طريقنا، لذلك لا تقلق!
على العكس من الحوسبة آلة واحدة، وهو ما نقوم به عادة، حيث تعلمنا أن الصراعات هي شيء سيء، في الصراعات الحوسبة الموزعة هي يمكن أن تحدث بيانات الحالة الطبيعية في. وهذا لا يعني أننا يمكن تجاهل فقط لأنهم "طبيعيون". وهذا يعني أننا لا نستطيع تجاهل حقيقة أن هذه الأشياء موجودة، أو محاولة لبناء وهم أن هذه الأشياء لا وجود لها. وعلينا أن نعتنق الصراعات.
لقد رأينا بالفعل أننا يمكن أن تخلق صراعا، والآن يمكننا أن ننظر في كيفية حل واحد. ربما في السيناريو أعلاه، إصلاح الخطأ المطبعي في الفقرة الثانية والتطورات الجديدة في القصة هي في الأسفل.
إذا كنا نخزن فقرة قصة من فقرة، على سبيل المثال، يمكن أن يكون لدينا إجراء حل النزاع الذي يتحقق مما إذا كان التعديلين لدينا في فصول منفصلة، ​​وإذا كان الجواب نعم، بتحديث كائن مع كل من الإصدارات الجديدة من الفقرات منها ثم يخزن النتيجة مرة أخرى إلى كائننا.
ويشار إلى هذا عادة باسم الدمج. إذا كنت قد استخدمت أنظمة التحكم في إصدار شفرة المصدر أو غيرها من أنظمة المصدر (خاصة تلك التي تنتمي إلى مجموعة التوزيع الموزعة)، فربما تكون قد رأيت استراتيجيات الدمج التي تحقق ذلك بالضبط.
في هذه الحالة، يمكن للكمبيوتر أن يقرر ما هي النسخة النهائية الصحيحة غير المتعارضة من قصتنا.
ولكن الآن تخيل كل من المؤلف والمحرر إصلاح الخطأ المطبعي، ولكن قرر المؤلف لاستخدام كلمة مختلفة تماما، في حين أن محرر تصحيح فقط الإملاء، وكلاهما يفعل ذلك في نفس الوقت.
في هذه الحالة، فإنه من المستحيل على الكمبيوتر لمعرفة ما هو الإصدار الصحيح. يمكننا تطبيق سياسة في التطبيق لدينا أنه في حالة وجود صراع تغييرات المؤلف يجب أن تكون سابقة. أو المحررين الحصول على العلاج المفضل. أيا كان، وهذا يمكن أن يكون استراتيجية قابلة للتطبيق لتطبيقات محددة.
كما ذكر من قبل، هذه كلها أمثلة، ونحن نحاول أن تصبح خبراء في مزامنة أكثر عمومية. لذلك نحن بحاجة إلى حل أفضل.
وهنا قليلا من المشكل: هناك بعض أنواع الصراعات التي لا يمكن للكمبيوتر حل أي وقت مضى. سنحتاج إلى تدخل بشري. لا توجد طريقة حول هذا، ولكن في نهاية اليوم، أدمغتنا هي أكثر تطورا بكثير من أجهزة الكمبيوتر وحل النزاعات هو حيث يلعب هذا.
على الرغم من هذا، وآمل أن تشعر قليلا أكثر راحة مع الصراعات.
كما مكافأة إضافية، والآن نحن مجهزة لمعرفة كيفية تحسين الطوابع الزمنية لإصدار كائنات لدينا.
سهم التوجيه، كلوكس.
إذا كنت تبدأ في البحث عن تقنيات لحل القضايا مع الطوابع الزمنية من ساعة الحائط، وسوف تجد في نهاية المطاف إشارة للساعات ناقلات، لمتغير، انظر الطوابع لامبرت. ساعة ناقلات يعمل أيضا مع الطوابع الزمنية، ولكن مصدرها ليس ساعة الحائط، مثلنا البشر استخدام، ولكن ما يسمى ساعة منطقية.
عند استخدام الساعات المتجهة كما محددات الإصدار، ونحن لا نرسل فقط الطوابع الزمنية المنطقية مع كائنات لدينا، ولكن أيضا حالة من ساعة منطقية، بحيث في وقت لاحق، عندما يحين الوقت (القصد المقصود)، لمقارنة كائنين، يمكننا حساب أي واحد يأتي في المرتبة الأولى. عظيم!
شيء واحد فقط أكثر.
تذكر عندما تحدثنا عن المؤلف ومحرر قصة تحديد الخطأ المطبعي وإضافة إلى القصة في نفس الوقت؟ ونحن نعلم الآن للكشف عن هذا الصراع وكيفية حله.
ولكن ماذا لو كان الإصلاح المطبعي على حد سواء خلق نتيجة في نفس النص؟ مع الطوابع الزمنية أو ساعات النواقل، لا يزال يتولد الصراع، ولدينا إجراءات دمج لاحق لم يحصل على أي شيء للقيام به. حتى نتمكن من التعامل مع هذا أيضا، ولكن بما أن القصة الناتجة هي نفسها، لن يكون من الجميل أن لا تخلق صراعا هنا في المقام الأول؟
وأنا أدرك هذا المثال هو مفتعلة قليلا، ولكن آمل من خلال البقاء ضمن مشروع مثالنا، يمكننا أن نرى المشكلة هنا. حيث أن المشكلة سوف تجعل حياتنا أكثر صعوبة هو عندما لا يكون لدينا ملقم مزامنة واحد، ولكن مجموعة من خوادم المزامنة، والتي قد نحتاجها للتحجيم إلى أعلى وأعلى الأحمال من نظامنا.
شرح كل هذا يستغرق وقتا طويلا، وهذا البرنامج التعليمي هو بالفعل الحصول على فترة طويلة، لذلك نحن ذاهبون لتخطي تفاصيل هذا. اتمنى ان تسامحني. إذا كنت لا، آمل أن يكون هذا جيف من السنجاب يعوض عن ذلك:
المحتوى عناوين عناوين.
لحل مشكلة نفس التعديلات ولدت الصراعات، ونحن بحاجة إلى النظر في تقنية أخرى: المحتوى عناوين عناوين. والفكرة هنا هي: أخذ محتويات الكائن، وتمريره من خلال وظيفة التجزئة، واستخدام التجزئة الناتجة عن الإصدار. إذا أجرينا الآن نفس التغيير على جهازين، فإننا لا ننتج تعارضا. الصيحة!
لدينا مشكلة قديمة واحدة على الرغم من: لا يتم طلب المحتوى المحتوى عناوين. لا توجد طريقة لاتخاذ اثنين من تلك الإصدارات ومعرفة من قيمتها التي جاءت قبل الآخر. هذا أمر مؤسف، ولكن يمكننا حل هذا.
بدلا من استبدال النسخة مع كل تحديث الكائن، نحتفظ قائمة مرتبة من الإصدارات جنبا إلى جنب مع المستند. عندما نقوم بتحديث الكائن، نضع هذا المحتوى فيرسيونابل فيرسيون أعلى القائمة. ثم يمكننا أن نعرف أي إصدار جاء قبل آخر عن طريق اجتياز قائمتنا.
وقبل أن يكون ذلك مفيدا بوجه عام، يجب أن نضيف مقايضة عملية واحدة. إذا قمنا بتحديث كائناتنا كثيرا، لدينا قائمة من الإصدارات يحصل طويل جدا، ونحن تخزين الكثير من البيانات، ونقل البيانات المذكورة عبر الأجهزة، وعند نقطة ما ونحن نفقد كل الفوائد التي غطيناها عندما ناقشنا الدلتا أعلاه.
ونتيجة لذلك، نجعل هذه القائمة قائمة محدودة، على سبيل المثال، يمكن أن تحتوي على إدخالات "X" على الأكثر. يمكننا حتى جعل هذا طول قابل للتعديل اعتمادا على طلبنا. أي شيء بين 10 و 1000 هو معقول لتطبيقات الأغراض العامة، لذلك سيكون لدينا للعب مع التطبيق لدينا لمعرفة ما هو أفضل.
المفاضلة هنا هو تجنب الصراعات غير الضرورية على حساب مساحة تخزين أكثر قليلا، ونحن سوف تحصل على تحديد مقدار التخزين نريد أن تنفق لهذه الفائدة.
قد تعتقد أن قائمة الإصدارات هي بدلا من الكرات بدلا من حل أنيق مثل المتجهات ساعات، ولكن تكون قادرة على تجنب الصراعات حيث يصبح ممكنا أولوية عندما يصبح الخادم لدينا مجموعة من الخوادم التي تعمل جميعا بشكل مستقل للتعامل مع تحميل التطبيق لدينا ونحن ترغب في تقديم مجموعة متسقة من البيانات لمستخدمينا.
تخزين النزاعات بكفاءة.
ثم، أخيرا، شيء آخر. عندما نخزن قائمة الإصدارات المطلوبة، يبدو ذلك مبسطا لاستخدام الأرقام بدلا من إصدارات المحتوى القابلة للتوزيع:
لدينا خمسة إصدارات. الآن نحن خلق الصراع. من أجل الإشارة إلى أن لدينا نسختين متعارضتين، نضعهما في قائمة فرعية في أعلى قائمتنا:
ونحن نعلم الآن أن النسخة "6" والنسخة "5" في الصراع. الآن تخيل بدلا من حل الصراع أولا، ونحن إنشاء واحد آخر:
الآن لدينا إصدارات "7" و "6" في الصراع، وأن الصراع يجري في نزاع مع النسخة "5" الاشياء الثقيلة!
نحن نمثل الإصدارات في هيكل شجرة. انها تسمح لنا:
وتخزين النزاعات بكفاءة، و.
حلها بشكل متكرر، لذلك بغض النظر عن عدد الصراعات لدينا، يمكننا دائما الحصول على دولة غير متضاربة في نهاية المطاف.
ضع كل شيء معا.
وفيما يلي ملخص لخوارزمية لدينا، دون شرح لماذا نفعل كل الأشياء، تلخيص كل ما سبق:
هناك نوعان من الأجهزة A و B التي تريد مزامنة البيانات من A إلى B.
اقرأ نقاط تفتيش عالمة مائية عالية من كال الجهازين، إن وجدت.
بدء قراءة تسلسل التحديث على A من علامة مائية عالية المسجلة أو من البداية، إذا لم يكن موجودا.
لكل إد / زوج الإصدار: هل هو حذف؟ نعم: تخزين الحذف محليا (انظر أدناه) على B. هل لدينا زوج معرف / نسخة محليا محليا على B؟ لا: جلب إد / نسخة من A وتخزينها محليا (انظر أدناه) على B. مخزن علامة مائية عالية من تسلسل التحديث الحالي على A و B.
تحقق من قائمة الإصدار لمعرفة ما إذا كان الإصدار الجديد هو خلف مباشر لأحدث إصدار حاليا على B. نعم: إضافة الإصدار الجديد إلى مخزن البيانات على B. لا: إنشاء تعارض.
ملاحظة: أنا ألمع بعض التفاصيل هنا التي تنطوي على تتبع الصراعات المحذوفة، والتي هي خارج نطاق هذا البرنامج التعليمي.
استنتاج.
شكرا لقرائتك! آمل أن تتعلم الكثير عن المزالق من مزامنة البيانات بشكل موثوق وأنك لا تثبيط لمعالجة حلول المزامنة الخاصة بك على أساس المبادئ التي استكشفنا هنا.
مع كل المعرفة كنت قد اكتسبت هنا، وآمل أن تشعر بالسلطة لاتخاذ الخاص بك التقدمي تطبيقات الويب إلى المستوى التالي!
يرجى ترك أي ردود فعل في التعليقات أدناه أو على تويتر.
دون أن تعرف، شرحت لك لماذا وكيف من بروتوكول النسخ المتماثل كوشبب، والذي يسمح السلس مزامنة البيانات بين الأقران بين أي عدد من الزملاء، بما في ذلك جميع السيناريوهات التي استكشفنا أعلاه.
يتم تنفيذ بروتوكول النسخ المتماثل سوشدب في سوشدب نفسها، بحيث يغطي عنصر الخادم لدينا. ثم هناك مشروع بوشدب تنفيذ نفس البروتوكول في جافا سكريبت تستهدف تطبيقات المتصفح و Node. js. التي تغطي العملاء وخوادم ديف. وأخيرا، هناك كوشباس موبايل و كلودانت المزامنة التي تعمل على دائرة الرقابة الداخلية والروبوت وتنفيذ بروتوكول سوشدب سينك في الهدف - C وجافا، على التوالي.
هناك نوعان من التكنولوجيات ذات الصلة سأكون من الجميل أن لا أذكر: التحويلات التشغيلية و كردتس.
التحويلات التشغيلية.
إذا كنت قد رأيت من أي وقت مضى تعديل نص تعاوني على إيثرباد أو محرر مستندات غوغل أو ما شابه ذلك، يتم تشغيله بواسطة تقنية تسمى "التحويلات التشغيلية". وهي مصممة للسماح لأي عدد من الناس التعاون على النص في نفس الوقت، ويمكن التعامل مع مستوى معين من عدم استقرار الشبكة، ولكن عموما، فإنه يتطلب العملاء لتكون متصلا في جميع الأوقات. إذا ذهبت وواصلت التحرير، يمكن دمج التغييرات في وقت لاحق، ولكن ليس لاحقا إلى أجل غير مسمى.
وبالإضافة إلى ذلك، تم تصميمه للنص، وليس للأشياء العامة، وذلك للقدرات حاليا الحقيقية من كائنات البيانات العامة، تحويلات التشغيلية هي أقل فائدة. تحقق منها إذا كنت في حاجة الى حل للنص متصل في الغالب.
أنواع البيانات المتماثلة الخالية من النزاعات أو كردتس هي هياكل البيانات المتخصصة المصممة للاستخدام في النظم الموزعة ولديهم الكثير من الخصائص التي ناقشناها في هذا البرنامج التعليمي، ولكن الأبرز من ذلك، أنهم ليس لديهم مفهوم للصراعات. كم هو عظيم ؟! جدا، في الواقع.
ألاس، كل شيء في البرمجة هو المقايضات، فماذا نحن التجارة لكونها قادرة على هياكل البيانات خالية من الصراع؟ حسنا، فهي هياكل البيانات المتخصصة، مثل مجموعات والعدادات، وليس تمثيلات وجوه عامة مثل جسون، لذلك سيكون لدينا لشراء في عالم كامل من هذه الهياكل البيانات المتخصصة، وربما لدينا صعوبة في رسم خرائط كائنات التطبيق لدينا لهم . إذا كنت تعتقد أن طلبك يمكن أن تستفيد من كردتس، وأنا أشجع بشدة لك لمحاولة الخروج منها.
بفضل نوح سلاتر، تيف، كاثارينا هول، جيك أرشيبالد، والرموز التعبيرية الفكر زعيم شارلوت لاستعراضاتها ❤
هوديي | | hood. ie مقدمة ما هو هودي؟ بدء التطبيقات & أمب؛ ششاسيس الحصول على مساعدة أسئلة وأجوبة الإبلاغ عن علة المساهمة تصميم التنمية كتابة ملاحظات تقديم محادثات إعطاء المال توظيف لنا مساهمي المجتمع مدونة قواعد السلوك حول الحيوانات مبادرات الأصدقاء أحداث بضائع اتصال هوديي على جيثوب هودي بلوق على تويتر لدينا نعرفكم إمبريسوم © 2018-2018 ذي هوديي المجتمع وغيرها المساهمين. هودي مرخصة تحت رخصة أباتشي 2.0.
جميع الصور والصور والرسوم التوضيحية مملوكة من قبل مشروع هوديي المصدر المفتوح ومرخصة بموجب سيسي بي-نك-ند 4.0.

استراتيجية إصدار كوشدب
الحصول على فيا أب ستور قراءة هذه المشاركة في التطبيق لدينا!
كوتشدب إصدار الإصدار الاستراتيجي.
هل سيكون ما يلي استراتيجية قابلة للتطبيق لتنفيذ الإصدار (باستخدام "المثال" كنوع من نوع المستند):
لديك وثيقة أصلية واحدة حيث يدعى حقل النوع example_original.
تحتوي التغييرات اللاحقة على المستند على المثال example_change ومعرف المستند example_original كمفتاح. وسيحمل التغيير أيضا طابع زمني.
احتفظ بمستند واحد بنوع example_current وهذا هو نتيجة example_original مع كل example_change "أبليد". سيتم تطبيق مستند example_change جديد تلقائيا على هذا المستند.
العثور على إصدار معين سوف تتكون في استرداد المستند example_original وتطبيق التغييرات المطلوبة (في الغالب تصل إلى الطابع الزمني معين، ولكن يمكن أيضا أن يكون عددا من التغييرات).
وأود أن أذكر أن حالة استخدام بلدي سوف تنطوي على عدد محدود من التغييرات على الأصل. ستتألف معظم التحديثات من مستندات أصلية جديدة. في حين أن هذا هو حالتي الاستخدام الحالي وأود أيضا أن تكون مهتمة في القضايا التي من شأنها أن تؤدي إذا العديد من التغييرات حيث تنطوي.
ما هي إيجابيات وسلبيات التي تراها في هذا النهج؟
أول ما يقلقني هو: عندما "الحصول على" نسخة معينة، يمكنك تطبيق التغييرات على الأصل دون تعديل قاعدة البيانات؟
سوف تحتاج من أي وقت مضى لحذف شيء من التاريخ؟ هل انت حقا متاكد؟ حقا، حقا متأكد؟ ماذا عن الفروع؟
في كل شيء، وهذا يبدو وكأنه استراتيجية معقدة. نضع في اعتبارنا أن سمعت عن كوشدب ولكن لم تستخدمه أبدا. سأذهب إلى نهج أكثر بساطة:
عند إنشاء مستند، تقوم بتعيين ويد. لا تستخدم الاسم أو سوف تواجه مشكلة أثناء إعادة تسمية العمليات. أضف حقل إصدار يقرأ "1". إنشاء مستند ثان يحتوي على قائمة المستندات بنفس التعريف ويد أو إضافة مؤشر "الأصل" إلى المستند الأول.
وجود "وثيقة التاريخ" لكل وثيقة يسمح لسرعة التنقل في التاريخ ولكن المؤشرات الأم هي أكثر "آمنة" (حيث لا يمكنك بسهولة إنشاء هياكل غير قانونية معهم).
عند إنشاء مراجعة جديدة، إعادة استخدام ويد وتعيين نسخة جديدة فريدة من نوعها. قم بتحديث وثيقة السجل أو المؤشر الأصل.
هذه الاستراتيجية بسيطة جدا لتنفيذ ويسمح لجميع أنواع المرونة في وقت لاحق. يمكنك محو أجزاء من التاريخ بسهولة، إعادة تسمية بسيطة، ويمكنك إنشاء فروع.
يجب أن نهج الإصدار كما المرفقات الموضحة في هذه المقالة تناسب معظم متطلبات الناس للإصدار.
ما هو الوضع التجاري لهذه الوثائق، وخاصة القانونية؟ لقد عملت في الحالات التي لا يكون فيها اقتراحك مناسبا من الأعمال التجارية، بسبب الحاجة إلى إثبات أن الوثيقة المعروضة ك v.3 هي حقا النسخة 3 من الوثيقة. ديناميكيا تطبيق دلتا لن تقطع الخردل الامتثال.
إذا، كما تقول، التغييرات على الوثائق نادرة، ثم أنك لن تكون إنقاذ الكثير من مساحة القرص من خلال تخزين الدلتا بدلا من الوثائق الكاملة. تخزين الوثائق كلها تسمح أيضا للتنبؤ موثوق بها من الوقت استرجاع أي وثيقة. كما أنه يقلل من تعقيد عملية الاسترجاع.
استراتيجية لإصدار مع سوشدب هو عدم أبدا من أي وقت مضى ضغط قاعدة البيانات التي تحتوي على الوثائق التي تحتاج إلى الحفاظ على التاريخ الكامل. لا يزال بإمكانك ضغط قواعد بيانات أخرى. هذه الاستراتيجية بسيطة تعمل اليوم من خارج منطقة الجزاء مع تحرير استراتيجية حل الصراع.
يمكن أن يتم حذف مستند عن طريق كتابة نسخة جديدة بدون محتوى ولكن مجموعة خصائص محذوفة.
لا يمكن تنفيذ الفروع بهذه الطريقة نظرا لأن آلية الإصدار توفر خيطا واحدا من المراجعات.
الآن للمستقبل المحتمل من سوشدب:
اليوم كل مراجعة يحمل نسخة كاملة من الوثيقة ولكن يمكن للمرء أن يعتقد أن التحسينات من محرك سوشدب يمكن يوم واحد مخزن ديلتا. ومن الممكن أيضا أن تقدم كوتشدب في المستقبل أبي لمنع ضغط أنواع معينة من الوثائق. ومن شأن ذلك أن يسمح بإبقاء جميع الوثائق في قاعدة البيانات نفسها. هذا سيكون التصحيح سهلة ل سوشدب. هذه الاستراتيجية تمكن إدارة فروع الوثيقة ولكن بالنظر إلى طبيعة سوشدب كقاعدة بيانات وثيقة، وهذا هو شيء معقول، على المدى الطويل، إمكانية.

قائمة واسترداد تنقيحات المستند؟ # 106.
شبح علق يونيو 16، 2018.
هل من الممكن الحصول على قائمة بمراجعات المستندات ومن ثم استرداد البيانات منها؟
شبح علق يونيو 16، 2018.
تقديم مثال.
محاولة استرداد المراجعة القديمة بواسطة إيتاغ.
حصلت على البيانات الحالية، وليس من التنقيح القديم.
الآن محاولة مع خيار 'ريف' في طلب أوري:
نفس ما سبق ولكن مع معرف ريف الحالي:
شبح علق 17 يونيو، 2018.
أنا أغلق هذا منذ كنت أفكر في كيفية عمل كوشدب مع إلحاق استراتيجية فقط. ومع ذلك فمن الممكن (ربما أفضل) مجرد تخزين وثائق مكررة في النظام لتنفيذ وظيفة "تغييرات المسار".
فسيلر علق 19 يونيو، 2018.
كان لدينا بعض النقاش حول هذه النقطة: وأشار مارتن إلى:
أيضا غروندزاتزليتش سيه إش دري موجليشكيتن.
داي إين موجليشكيت أوبيريرت أوف دير أبليكاتيونزيبين. داس إست.
ناتورليش نايشت ويركليش ريلاتد (ويل مان داس فاست غليشرماسن ميت.
جيدر داتنبانك ماشن كان) أوند هير نور دير فولستانديكيت.
داي زويت موجليشكيت إست وي وي دو بيشكريبست. D. h. دورش جافا سكريبت.
أكتيونس (أودر مروبي أكتيونس) داي مان ميت ديم Insert - bzw. تحديث الزناد.
فيربينديت كوبيرت مان داس ألت دوكومنت بيفور مان داس نيو إرستلت.
هيربي كونت مان دان überlegen ووهين جيناو داس ألت دوكومنت كوبيرت.
(z. B. إن إين أندر كولكتيون، etc.).
داي دريت موجليشكيت إست نوش إتواس تيفر. هيربي وورد رجل.
أوسنوتزن، داس أرانغودب جا سويسو إمر نيو دوكومنت أنليغت أوند داي.
ألتن فيرسيونن إرست لوشت وين سي نايشت مهر دورش لوفند كيريز.
ريفيرنزييرت ويردن كونن. وين رجل دان سيشرستيلت، داس سي غار.
نايشت جيلوششت ويردن، دان هات مان إين سهر تيف (أوند داميت ريلاتيف.
أوديتسيشير) موجليشكيت دير هيستوريسيرونغ. يموت في نهاية المطاف.
نايشت زو لوشن بروشن وير سويسو. دين فيرسيونين يموت دورش.
ريبليكاتيونسكونفليكت أنجيليغت ويردن دورفن نايشت أوتوماتيشش جيلوشت.
ويردن، سوندر نور إكسلزيت دورش داي إنسبريشندن فونكتيونن ويلش.
يموت كونفليكتريسولوتيون دورشفوهرين.
في دريتن فال موس - مينر مينونغ ناش - سيشرجستيلت ويردن، داس.
داي älteren فيرسيونين تيبيشيرويس نايشت سيكتبار سيند (d. h. كيريز.
في إنديزس سولتن إمر نور داي نيويست فيندين فيرسيون). نور إين.
(أودر وينيج) غانز سبيزيل أبريج.
(جيب-مير-داي-فيرسيونين-زو-ديم-دوك-ميت-دير-إد) سولت يموت نلتيرن.
لذلك أساسا، أرى ثلاثة احتمالات.
وهناك خيار واحد يعمل على مستوى التطبيق. هذا هو.
بالطبع ليس حقا ذات الصلة (لأنه على قدم المساواة تقريبا مع.
كل قاعدة بيانات يمكن القيام به) وهنا فقط لاستكمال.
الطريقة الثانية هي الطريقة التي تصفها. أي. بواسطة جافا سكريبت.
يتم الحصول على الإجراءات (أو الإجراءات مروي) مع إدراج أو تحديث الزناد.
يتصل بنسخ المستند القديم قبل إنشاء المستند الجديد.
ويمكن بعد ذلك نسخ ذلك للنظر بالضبط أين الوثيقة القديمة.
هو (على سبيل المثال، في مجموعة أخرى، وما إلى ذلك).
الخيار الثالث هو أعمق قليلا. هذا سوف يكون.
لاستغلال ذلك يخلق أرانغودب على أي حال دائما وثائق جديدة و.
يحذف الإصدارات القديمة فقط عند عدم تشغيل طلبات البحث.
يمكن الرجوع إليها. إذا كنت ثم التأكد من أنها تفعل.
لا يتم حذف، ثم سيكون لديك عميق جدا (وبالتالي نسبيا.
التدقيق-- إثبات) طريقة للتاريخية. إصدارات إمكانية.
نحن لسنا بحاجة إلى حذف على أي حال. للحصول على إصدارات من.
لا يمكن إنشاء تعارضات النسخ المتماثل تلقائيا.
يكون، ولكن فقط من خلال وظائف إنسبرشندن صراحة التي.
وحل النزاعات من قبل الرصاص.
في الحالة الثالثة، يجب - في رأيي - لضمان ذلك.
الإصدارات القديمة ليست مرئية عادة (أي الاستعلامات.
في المؤشرات يجب دائما العثور على أحدث إصدار). واحد فقط.
(أو قليل) استعلام محدد جدا.
(جيف-مي-ذي-ريليس-فور-ذي-دوك-إن-ذي-إد)، أكبر سنا.
فسيلر علق 19 يونيو، 2018.
وسوف ننفذ في نهاية المطاف إمكانية الإبقاء على التنقيحات القديمة للوثائق في قاعدة البيانات. وهذا سوف بريسوامبل يكون العلم للمجموعة، حيث يمكنك تعريف، إذا كان ينبغي أن تبقى مراجعة القديمة حولها أم لا.
شبح علق يونيو 19، 2018.
سيكون من الرائع أن تتمكن من إعادة قائمة _revs = [] داخل المستند.
ربما أيضا إعداد عتبة الضغط على المجموعة بحيث يمكنك الحد من عدد المراجعات لكل وثيقة.
علق فرانكماير 7 أكتوبر 2018.
هل هذا لا يزال على الرادار؟
اقتراح: حفظ اختياريا المراجعات القديمة بدلا من حذف / قمامة جمعها # 255.
فرانكماير علق 22 أكتوبر 2018.
مجرد التفكير في قضية صغيرة هذا قد تجلب.
حواف. يقومون بتخزين المجموعة / الوثيقة ولكن ليس مراجعة المستند. إذا كان من المفترض أن يتم تنفيذ الميزة المقترحة، يجب أن يكون هناك طريقة لربط حواف لتخزين أيضا مراجعة العقدة والحصول على المستنسخة أنفسهم من أجل الالتزام بالتنقيح الجديد للعقدة التي تتصل بها.
[1.2] الاقتراح: يجب أن يكون مولد _rev محليا لكل مستند # 334.
علق فرانكماير 2 يناير 2018.
هل يمكننا إعادة فتح هذا؟ وأعتقد أننا أغلقنا عن طريق الخطأ التكرار وهذا واحد أيضا. هذا لديه مزيد من المعلومات ومع ذلك.
جستيمان علق 2 يناير، 2018.
وأعتقد أن المسألة كانت بالفعل ولا تزال مفتوحة، لمدة 7 أشهر الآن.
علق فرانكماير 2 يناير 2018.
عفوا، كنت أبحث في مؤشر خاطئ. تحتاج إلى المزيد من القهوة، والنوم، أو مجموعة جديدة من النظارات. آسف.
التنقيحات / النسخ: هل من الممكن التقاط لقطة من حالة قاعدة البيانات في وقت محدد؟ # 785.
فسيلر علق مارس 25، 2018.
سوكو علق 30 يوليو، 2018.
مرحبا شباب، هذا الاستخدام حالة يناسب الحق في واحدة من المشاريع أنا أعمل على (في الأساس مخزن الوثائق مع تاريخ المراجعة).
يمكننا تطوير شيء على مستوى التطبيق ولكن أحب أن نرى أين هذا هو الذهاب. هل هناك المزيد من المناقشات حول هذا الموضوع؟
أوجوالت علق 25 أغسطس، 2018.
أنا مهتم جدا في هذا لأنها تناسب بلدي استخدام حالة تماما. ما هو التحديث؟
فسيلر علق 2 سبتمبر، 2018.
وسوف ننفذ ذلك في نهاية المطاف. ومع ذلك، لإطلاق سراح اثنين المقبل الميزات هناك الاستعلام محسن والسيارات تجاوز الفشل.
ومع ذلك، بعد هذا اثنين من الميزات الكبيرة، ونحن في الواقع تخطط لتحسين إمكانيات مفك. هذا ينبغي أن يسمح لقطات والتعليقات القديمة.
أوجوالت علق 2 سبتمبر، 2018.
يوم الثلاثاء، 2 سبتمبر 2018، فرانك سيلر الإخطارات @ جيثب.
وسوف ننفذ ذلك في نهاية المطاف. ومع ذلك، لإطلاق سراح المقبلين.
الميزات هناك "الاستعلام محسن" و "تجاوز تلقائي".
ومع ذلك، بعد هذا اثنين من الميزات الكبيرة، ونحن في الواقع تخطط لتحسين مفك.
الاحتمالات. هذا ينبغي أن يسمح لقطات والتعليقات القديمة.
الرد على هذا البريد الإلكتروني مباشرة أو مشاهدته على جيثب.
فسيلر تعديل المعالم: طلبات الميزة، 2.x، تراكم ديك 2، 2018.
علق كلينتوود ديك 10، 2018.
علق ليويسدياموند يونيو 19، 2018.
هذا شيء نهتم به حقا.
نود تعيين مجموعة بحيث تؤدي هذه التحديثات إلى نسخة وجلب مستند يعطي "أحدث" بشكل افتراضي. نود أن نكون قادرين على الحصول على قائمة المراجعة والحصول على مراجعة محددة للمستند.
وفيما يتعلق بما أشار إليه فرانكماير، لا أعتقد أن هذه مسألة ما لم ترغب أيضا في إصدار حواف.
dariosalvi78 علق 6 أغسطس، 2018.
وأود أيضا أن تكون مهتمة جدا في هذه الميزة. أعمل في مجال المعلوماتية الصحية، وسجلات التدقيق هي في غاية الأهمية في هذا القطاع.
إضافة واحدة فقط إلى ما سبق قوله:
فمن المهم أن يكون عدد المراجع أمر بطريقة أو بأخرى لا يمكن أن أقول حقا الذي يأتي أولا، بدلا من ذلك ينبغي أن تأتي التنقيحات أيضا مع الوقت التي تم إنشاؤها.
كوديمانكس علق 6 أغسطس، 2018.
يجب أن يكون هناك بالتأكيد الطابع الزمني. ويمكن بعد ذلك فرز التنقيحات حسب الطابع الزمني وليس من الضروري أن تكون أعدادا متزايدة.
سيكون من الرائع أيضا إذا كان بإمكان المرء توفير سلسلة من الذين قاموا بتحريرها (غير متأكد مما إذا كان ينبغي إدارة ذلك على مستوى التطبيق). المبدع المبدئي يمكن بالتأكيد أن تكون مكتوبة على الوثيقة من قبل التطبيق، لا أعتقد أن هذا يجب أن يتم من قبل النظام.
الجمعة علق 6 أغسطس، 2018 & # 8226؛
وأوافق على أن هذا سيكون ميزة مفيدة جدا، وأكثر من ذلك إذا اقترن مع الطوابع الزمنية. Storing timestamps internally would enable new features (which could be implemented later) such as listing revisions or diffing changes between two timestamps.
We wouldn't need to store separate dates for "created" and "changed" in order to find that data (a revision would only need one date. The first revision would be "created" and the last would be "changed").
flamby commented Dec 21, 2018.
what's the status on that versioning feature?
native versioning on documents is lacking in almost all document or graph oriented database (couchdb excepted). it's a pity as this pattern is so commonly useful.
having such versioning on graphs as well would be great, making arangodb unique.
jsteemann commented Dec 23, 2018.
Status as of December 23, 2018: though multiple revisions of a document may be around in ArangoDB at the same time (including some outdated revisions), there currently is no way for transactions and queries to access any but the current revision.
Making all revisions accessible by default raises a few questions, apart from the MVCC things that only require outdated revisions to be around as long as any running transaction can still access them:
Which operations should see them and how should these revisions be accessed query-wise? Obviously in many use cases there is no need to keep all the revisions around, but in some there is a huge need to do that. Do you expect your existing queries to return "old" revisions as well, or would you want to use some special filter conditions in queries to find non-current revisions? When to clean up old revisions?
An interesting question is also what unique constraints should actually mean in context of multiple revisions: should two revisions of the same document that have the same index values cause a unique key constraint violation error?
Note: this includes the primary index and thus the _key attribute of the documents too. The _key attribute is the mechanism to efficiently find and uniquely identify a document. If _key becomes non-unique because multiple revisions are around at the same time and a transaction can see all of them, then there will be some trouble.
dariosalvi78 commented Dec 23, 2018.
My 2 cents on this:
I would expect that the standard way of operation would be to just work.
with the latest version of the revision. I would also expect versioning to.
be a special feature to be activated explicitly on collections that require.
ذلك. As for queries, I guess that at least selections would need to take old.
revisions into account. A simple approach could be that, if the version is.
not specified, to work on the latest one. There must be a query though to.
ask for all existing versions of a document that are available.
Status as of December 23, 2018: though multiple revisions of a document.
may be around in ArangoDB at the same time (including some outdated.
revisions), there currently is no way for transactions and queries to.
access any but the current revision.
Making all revisions accessible by default raises a few questions, apart.
from the MVCC things that only require outdated revisions to be around as.
long as any running transaction can still access them:
Which operations should see them and how should these revisions be.
accessed query-wise? Obviously in many use cases there is no need to keep.
all the revisions around, but in some there is a huge need to do that. فعل.
you expect your existing queries to return "old" revisions as well, or.
would you want to use some special filter conditions in queries to find.
non-current revisions? When to clean up old revisions?
An interesting question is also what unique constraints should actually.
mean in context of multiple revisions: should two revisions of the same.
document that have the same index values cause a unique key constraint.
Note: this includes the primary index and thus the _key attribute of the.
documents too. The _key attribute is the mechanism to efficiently find.
and uniquely identify a document. If _key becomes non-unique because.
multiple revisions are around at the same time and a transaction can see.
all of them, then there will be some trouble.
Reply to this email directly or view it on GitHub.
flamby commented Dec 23, 2018.
as for your questions, i'm totally in phase w/ @dariosalvi78 answer.
default behavior : latest only.
explicit activation on a collection.
retrieving old versions w/ a specific query.
explicit specification of clean up (for instance: none or item-number reached or max old revision of the document size reached or max old revisions of the whole collection reached)
kibarda commented Jan 21, 2018.
I am also interested in this and in phase with @flamby and @dariosalvi78.
Would it make sense to extend the _id format to include optional version nbr ? sth like "myCollection/docKey[revNbr]" ?
bearoutthere commented May 6, 2018.
Are there any new developments with this? The "Undo" requirement is universal in application of any complexity. Being able to roll back to a previous version of a document would be a simple way to implement it.
friday commented May 11, 2018 •
Should the conceptual "unversioned" documents include those which have been manually removed with REMOVE or should there be a different function, say UNVERSION for that? I like the first method, because I think it's more consistent to treat removal of a document as a form of revision, but maybe that requires a stricter "force remove" function (maybe DELETE or PURGE )? What about "undoing" the most recent version? Should the second most recent version be activated? What if the second most recent version was manually removed? Maybe there should be no "undo", but more specifically a method to set a specific revision to to be the active version. Also: Should activating an old version create a new copy of it, like wikipedia?
According to the documentation _rev is currently unique within the list of document revisions, not per collection. I like kaerus suggestion above for example 47577922/1247 to select revision 1247 of document 47577922 (also, because it could get the document index by a simple string manipulation function) But what if we want to also store this? Say for instance we want to build a wiki. Wouldn't we want to connect authors, discussions and "flagged for abuse" to revisions rather than pages? Would this also be possible with the "/" syntax?
Also, it's presently used to mean collection/index , so would we need another character, ex collection/index#revision ?
dariosalvi78 commented May 11, 2018.
Should the conceptual "unversioned" documents include those which have.
been manually removed with REMOVE or should there be a different function,
say UNVERSION for that? I'm in favor of the first method, because I think.
it's more consistent to treat removal of a document as a form of revision,
but maybe that requires a stricter "force remove" function (maybe DELETE or.
"Normal" remove should not delete the old versions, a "force" remove or a.
different command could delete all versions in one go.
According to the documentation _rev is currently unique within the list.
of document revisions, not per collection. I like kaerus suggestion above.
for example 47577922/1247 to select revision 1247 of document 47577922.
(also, because it could get the document id by a simple string manipulation.
function) But what if we want to also store this as a connection? Say for.
instance we want to build a wiki. Wouldn't we want to connect authors,
discussions and "flagged for abuse" to revisions rather than pages? Would.
this also be possible with the "/" syntax?
Also, it's presently used to mean collection/index, so would we need.
another character, ex collection/index#revision?
It would make sense to use a different character.
homdoq commented Sep 19, 2018.
Hi, I am currently evaluating ArangoDB.
What would be more interesting to me, rather than the ability to access revisions of individual documents, would be the ability to access whole collections/graphs as they were known in the database at time T . (One can think of such a collection as a git repository with a timestamped collection revision number.)
I consider this an extension of the "Transaction Time State Table" as discussed by Richard T. Snodgrass in "Developing Time-Oriented Database Applications in SQL" (downloadable free as PDF from cs. arizona. edu/people/rts/publications. html).
A collection that was "transaction time enabled" would allow queries to.
ignore documents (including edge-documents in graph traversals) that do not exist in the collection at the specified time T check for existence of keys and associated values using the revision that was current at the specified time T.
Use cases would be, e. g., queries concerning historical trends, where the query is not known before-hand (i. e. at database design time).
Since I do not know how such a collection should behave in case this feature were enabled/disabled dynamically over the life-time of the collection, I think it would be better to make this a decision at creation-time for the collection.
In such a case the different revisions of a document should not violate a unique key constraint, since the identity of the document should be independent of its state. (This requirement makes it also very cumbersome to implement the behaviour using the currently available features of existing graph databases I am aware of.)
Therefore, I think, edge documents should not be concerned with the revision of the _from and _to documents, only with their identity. (On the other hand, I would consider changing one or both of these to be equivalent to deleting the original edge and creating a new one, so I guess the _from and _to keys of an edge document are part of its identity.)
Deleting a document in a transaction time enabled collection should lead to a new revision of the collection, and the document's revisions should be kept.
A graph (named or unnamed) should be considered transaction time enabled if all the collections (including edge collections) making up the graph are transaction time enabled collections.
I think this would be a really useful feature for many applications that are concerned with trends in "historical" data. The concepts of "Valid Time State Tables", or "Bi-Temporal Tables", also from Snodgrass, might also be interesting to look at.
dothebart commented Sep 19, 2018.
Interesting read, thank you for your participation. Time traveling graphs sounds like a very interesting aspect of this.
We're taking aspects of this into account when parts of the source are modified. The removal of legacy C source is progressing nicely and will remove further roadblocks that hinder an implementation start of this.
However, please note that since this is going to be especially complex to implement in the cluster case, we can't give an estimate if and when this is going to become hot on the roadmap - we will keep you Informed.
kurt-o-sys commented Jun 1, 2017.
Same here: having revisions is really, really useful. That's one of the main reasons I've been using Datomic for a while. I like it's model and idea and really, really don't want to miss this 'time' concept of it.
Some thoughts, based on my experience with Datomic:
here's how it handles queries: when you query a database, well, you just query the database :)
(meaning: execute query '[. ] on the database - last known values - at connection conn )
When looking for the history, this is how it's done:
(meaning: the same as above, but 'all the historical values of' the database; there's also a since and asOf filter)
Datomic limits which queries can be run on the history of the database. Can't remember which ones didn't work out nicely anymore, though.
In the queries, you can query on transactions themselves (and add data/key-value pairs to transactions, as transactions are considered normal entities - documents?). This is pretty useful, so you can check which entities (documents?) have been changed in the same transaction, or search for transactions before a certain date/time, . .
When to delete revisions: never (may be overridable, but usually, when I need revisions, I want to keep them 'forever').
fceller removed this from the Features milestone Aug 6, 2017.
bearoutthere commented Sep 27, 2017.
Just wondering if there any new updates on this topic? Is this feature on the roadmap and when?
شكرا مقدما.
solisoft commented Nov 7, 2017.
Interested in versioning feature as well . keeping a trace of any change can be great for auditing purpose.
solisoft commented Jan 4, 2018.
What can be cool also, is the ability to set number of revision to keep.
Let say I define 15, the latest 15 revisions will be kept . others will be GC.
&نسخ؛ 2018 جيثب، Inc. شروط الخصوصية تعليمات حالة الأمان.
لا يمكنك تنفيذ هذا الإجراء في الوقت الحالي.
لقد سجلت الدخول باستخدام علامة تبويب أو نافذة أخرى. أعد التحميل لتحديث الجلسة. لقد سجلت الخروج في علامة تبويب أو نافذة أخرى. أعد التحميل لتحديث الجلسة.

Couchdb versioning strategy


A little more than five years ago, I started working with CouchDB. I had recently joined Dimagi, and before I arrived on the scene, Dimagi had found some success using CouchDB in one of our largest projects at the time, an offline EMR in Zambia. We chose CouchDB because of its replication capabilities, which let us keep data from several locations reliably in sync over an unreliable network. When I started working on what became our flagship product, CommCare, the concept was to reuse a lot of the code we had already written. At this point, the experience we had with CouchDB was pretty positive: it didn’t enforce schemas, so it was easy to change schemas in our code without worrying about a data migration, and overall it was relatively intuitive to use. As a result of these positive experiences and without much additional ceremony, CouchDB became our de facto default database.
It took us some time to realize how much of a bottleneck CouchDB was to become for us. By the time it became clear, we had no choice but to double down and expand our cluster. At this point we entered into a contract with Cloudant, who provided the enterprise-level support and scalability for CouchDB that became necessary. During this period, we could tell we were abusing CouchDB, but there weren’t a lot of good resources out there on tips for using CouchDB as an application database — probably because using CouchDB as an application database is not particularly common. So everything we learned, we had to learn ourselves or in collaboration with Cloudant. It’s been an unintentional path, but we’ve picked up a thing or two worth sharing.
For the sake of this blog post, I’ll assume you know what CouchDB is, and have used it for a bit. Maybe you’re chugging along without any problems, or maybe you’ve started to scale and reached a point in which your current setup has become unmanageably slow. Either way, this blog post is for you. It’s what I wish I’d known five years ago when I first started using CouchDB.
مفاهيم أساسية.
CouchDB has few enough features that you can cover most of them in a short blog post. Since most of what I’ve learned falls into the usage of a feature, I’ll start with a breakdown of what I consider to be CouchDB’s main features.
The main division in CouchDB within a single instance is the database:
Databases further contain the following concrete objects:
Document revisions and write conflicts Replication, which I will not cover here.
There are some other less common features, but in terms of what I use, that’s pretty much it. These are the concepts I’ll be covering in this post, with a section per concept that provides a quick overview of the feature as well as the most important performance and usage “gotchas” to keep in mind. And while much of this blog post is dedicated to things that can go poorly, one thing I’ve always loved about CouchDB is that it stakes out a small space and does a few things well.
Each document is a JSON blob (a JSON “object” to be precise). It can theoretically be infinitely large, and infinitely nested, but keep in mind:
Large documents degrade performance.
Documents can be created, updated, and deleted, but keep in mind:
Each create, edit, and delete creates an entry in the changes feed that must be processed by all views Write conflicts degrade performance.
attachment.
Each document can have any number of attachments, which are conceptually “files”: they have (binary) content, a file name, and a content type. Theoretically, you can have as many as you want, and they can be as large as you want, but keep in mind:
Large attachments degrade performance Adding, updating, or removing an attachment requires an edit to the document, which must then be processed by all views Attachments are an inefficient feature, and an external object store should almost always be used instead.
As a further simple dollar cost consideration:
Since Cloudant is not trying to serve as a block storage provider, it should not be held to the same standards in terms of cost effectiveness. 1 GB of storage on a Cloudant cluster costs many times more than 1 GB of storage on any major VM host (Rackspace, Softlayer, AWS, etc), so it is an expensive choice for file storage. On a simple per GB storage basis we found Cloudant to be 10x as expensive per GB as block storage on Rackspace (something like $1.2/GB/mo vs. $0.12/GB/mo). CouchDB/Cloudant does a lot of stuff for you, but if all you’re interested in is block storage you should use a cheaper alternative.
The Map-Reduce view is CouchDB’s primary feature. For each view, CouchDB maintains a b-tree that can be queried by key or by key range. In addition to this sort key, each node in the b-tree is associated with:
Views are organized into design docs. Theoretically, you can have as many design docs as you want in a database, and as many views as you want in a single design doc. Theoretically, each view can emit arbitrarily many b-tree nodes per document, and your map/reduce code can be arbitrarily complex. But keep in mind:
Having many views degrades performance, because each view must be run on every document change All views in the same design doc are indexed together; changing, adding, or removing any view requires all of them to be reindexed Having many emits per document in a view can degrade performance (but slightly more performant than putting each emit in its own view) Complex map and reduce code degrades performance Emitting values other than null degrades performance Using reduce code other than the _sum , _count , _stats built-ins degrades performance.
As a side note CouchDB and Cloudant differ on exactly when views are updated:
CouchDB updates views lazily , that is when they are queried. This can lead to long wait times for infrequently accessed views. Cloudant updates views asynchronously in the background. This means that views that are no longer being accessed are still consuming system resources.
changes feed.
Every write, edit, or delete on a document (including to design docs) is logged by CouchDB and can be accessed through the changes feed. Each change is associated with sequence id (abbreviated seq ), which can be used to query changes from that point on. Full document bodies can be optionally included with the change stub. The changes feed is useful for:
Syncing data to another database for reporting or analytics Asynchronously performing any action in your application layer based on changes to your data.
CouchDB and Cloudant differ in both the format of the seq , as well as the guarantees that they make about ordering.
CouchDB uses integer seq s, and changes will always be in the same order Cloudant, because of its cluster model, uses (quite long) string ids that begin with (decimal representations of) integers, but no specific ordering is guaranteed—though very roughly the integer prefix goes from small to large.
In both implementations:
The feed may only contain the last relevant change to a document You can ask for all changes since a particular seq and are guaranteed to get (at least) that.
On Cloudant, you can get a lot more than you ask for in certain failure cases, such as when a node restarts:
A seq may not be recognized, in which case it will respond with the changes feed from the beginning of time If you are daisy chaining calls to the changes feed (using the last seq of each one to get the next one), this can result in silently reprocessing all changes from the beginning of time. This has happened to us enough that we’ve started calling it a “rewind” and have built a little tooling around trying to detect the situation and abort before we go down that path.
CouchDB theoretically provides a way to filter the changes feed based on an arbitrarily piece of code (for example, only showing changes to a certain type of document), but.
In practice (at least on a taxed Cloudant cluster) this has proven to be extremely slow and inefficient Consider including the full document body of all changes and filtering in your application (as inefficient as that sounds)
write-conflicts.
In addition to an id ( _id ), each document also has a magic _rev property, which is automatically set by the system. To update a document, the revision of the JSON posted must match the current revision; if it doesn’t, the write is rejected, and you get back an HTTP 409 with the message “Document update conflict.” If your application is built to handle this, it might then do a fresh fetch of the document, apply its change again, and then save again, perhaps failing after a certain number of attempts.
Things become more complicated if.
You’re using replication “master-master”-style replication, in which more than one node accepts writes You’re using Cloudant (since it uses the above architecture internally)
When two separate instances of couchdb that have accepted updates to the “same document” (documents with the same _id) replicate (in either or both directions), one version will win (it will be the same version on both nodes) and the other one becomes a conflicted revision.
Notably, in the case of Cloudant, this can actually happen in exactly the same situation as getting a 409: if you submit two edits to the same doc (quoting the same rev) in quick succession it will either 409 or silently create a conflicted revision, depending on (1) whether the two requests wrote to different nodes internally and, if so (2) whether the nodes have had time to sync with each other.
A document can theoretically have an unlimited number of conflicted revisions,* but keep in mind:
Conflicted revisions degrade performance. Even when these conflicted revisions are deleted, they leave behind a record that a revision used to exist but has been deleted, which continues to degrade performance. In the case of Cloudant conflict revisions represent times that Cloudant told your application, “Yes I accept your write,” and then threw it away into the dark dustbin of conflicts. If you don’t monitor your conflicts (by writing a view over the _conflict field of all documents), then writes to your database are failing silently, which is by design due to the cluster model.
Having conflicted revisions can also lead to other kinds of unintuitive behavior. When deleting a document, if it has any conflicted revisions, one of them will arbitrarily replace the document, resulting in something closer to a “blast from the past” than a deletion.
To effectively delete a document, you must first delete all of its conflicted revisions This is particularly important for design docs; if you’re not careful, deleting a design document without deleting its conflicted revisions could result in an expensive reindexing process that must be killed at the OS process level manually.
*in reality this number is capped by the implementation.
Views vs. SQL indexes.
I wanted to take a moment in this post to compare CouchDB and relational or SQL databases. For the most part, there’s not that much in common, but I’ve found an analogy—their respective approach to maintaining indexes on your data—to be useful to keep in mind.
CouchDB views are analogous to SQL indexes. Sort of. They’re both b-tree indexes of your data that are automatically kept up to date.
One big user-facing difference between CouchDB and SQL databases is that whereas a SQL database lets you use its Structured Query Language to specify what data you want to retrieve and then decides how to execute your query given your indexes, CouchDB forces you query indexes directly. When you make a SQL query, your database might decide to use an index to quickly whittle down a table to a manageably small set, and then finish the query with a sequential scan; if there are two indexes that could be useful, it will make the decision for you of whether to index by this and filter by that, or index by that and filter by this. CouchDB on the other hand offers no such help; it simply maintains an index and exposes it to you through the view API. This means that either you must make your views return exactly the data you are looking for, or be willing to do the extra filtering in your application. Either way, you are responsible for query planning.
Another difference is either in the terminology of “database” vs. “table,” or in behavior of “views” vs. “indexes,” depending on how you look at it. Whereas a SQL index maintains a b-tree over a (SQL) table , a CouchDB view maintains a b-tree over a (CouchDB) database . Another way to look at it is that a database in CouchDB is like a table in SQL. While you can have as many document types in a single CouchDB database as you want (indeed, CouchDB doesn’t have any built-in concept of document types), keep in mind that:
Having multiple document types in the same database degrades performance because each view must be run on every document, even if that document is irrelevant and filtered out in the map code.
Finally, while this analogy holds well for very simple views (such as one that indexes users by (domain, username) ), it breaks down in that CouchDB views can do much more complicated things (and thus start to more resemble SQL stored procedures and/or materialized views); this is one of the areas in which CouchDB supposedly shines, though keep in mind as we’ve said before:
Complex map and reduce code degrades performance.
In conclusion.
While most blog posts about a piece of software have the primary purpose of either gushing or ranting, my intention is to do neither. CouchDB is a fine piece of software, and like all software, it has its limits. There are many things I wish I’d done differently from the get-go, which all come directly from the points I’ve bulleted above:
Try and have each view in a database with only the documents relevant to it: Put every doc type in its own db—or if that seems too extreme, at least separate the highest-volume documents out into their own databases. (Since I haven’t tried the extreme version, I don’t know what the performance limits are to having hundreds of databases on the same instance.) If views should only run for a small subset of documents (such as a particular client’s data), consider having these views in their own db and asynchronously syncing the relevant data to that db Never use attachments, and store all files in an object store (like a shared filesystem or Riak) Never, ever save a document twice when you could save it once Avoid update conflicts like the plague. Put every view in its own design document so that each view can be reindexed separately. (Remember, even deleting a view causes a major reindex if it’s in a design doc with other views!) Don’t rely on the filtered changes feed Keep the number of views to a minimum: If half of your views are to index doc type X by client, delete them and write a single view that indexes all docs by doc type and client If you can get rid of a view and do some small amount of sorting or filtering in your application, it’s probably worth it. Encapsulate couch-related logic in accessor functions that are tested. This lets you easily rewrite the “plan” you use to acheive a particular query if you need to change/refactor/remove/optimize your views later on; in the comparison to SQL, if you’re using CouchDB, remember that you’re in charge of query planning, and sometimes a sequential scan on partially filtered data is more efficient than using (and maintaining!) a special index.
Always consider whether SQL (MySQL, Postgres, etc.—doesn’t matter, whatever you’re using) would be better suited to your problem.
At Dimagi, we’ve come a long way in applying these hard-learned tips, and I’m happy to say it has significantly improved the performance and reliability of our CouchDB (Cloudant) database, and having teased out these tips, we’ve matured as a team from simply venting about CouchDB to understanding what we can do with it to get the best performance it’ll give us. But I have to say, I sure do miss the days when I thought there was nothing funny about CouchDB’s tagline. Relax.
Also, We’re Hiring! Please apply if any position seems right for you. And if you enjoyed this article, you might also like our article on Scaling Code Review.
شارك هذا:
Profile cancel.
What every developer should know about CouchDB https://t. co/sA7RcOYEd8.
RT @dimagi: Using #CouchDB? Check out the tips every #developer should know before getting started: https://t. co/cGFOHjC3wn https://t. co/Ya…
Tips for Developer starting using CouchDB https://t. co/7ZAha9QheR #couchdb.
[…] What Every Developer Should Know About CouchDB, Daniel […]
After my two years with Cloudant, I found your article spot on. I plan to dig deeper into the conflict situation since we haven’t run into this issue yet. Cloudant is apparently about to release a 2.0 version so I wonder what issues might be resolved by that release. One thing we discovered today is that Cloudant needed to increase our thread pool for number of indexes and also efficiently time-out idle index threads more quickly.
[…] impression is the api interface is quite simple, all you need to make a POST call. This is a good document for starter. There is also a nice couchdb client with very straight forward client api. It also has […]
[…] Delivering open and innovative technology to underserved communities globally. & # 8211؛ Read full story at Hacker News […]
Finally a well done document.
شكرا على هذه المقالة. Being very comfortable with SQL made CouchDB tough to understand, and this helped a lot. It’s very interesting to see that CouchDB doesn’t let you flexibly query it, which is something I strugged with. Rather, a view must be created for each “query”. I appreciate the explanation!
Thank you for this tip:
Put every doc type in its own db—or if that seems too extreme, at least separate the highest-volume documents out into their own databases. (Since I haven’t tried the extreme version, I don’t know what the performance limits are to having hundreds of databases on the same instance.)
mpression is the api interface is quite simple, all you need to make a POST call. This is a good document for starter. There is also a nice couchdb client.
المشاركات الاخيرة.
الاقسام.
Delivering open & innovative technology to help underserved communities everywhere.
كوبيرايت & كوبي؛ Dimagi, Inc.
Contact Dimagi.
Keep in touch.
To improve access to protection services and reduce HIV’s impact for women and children, UNICEF worked with the Malawi government to established a Community Survivor Support Unit (CSSU) in Malawi’s 300 traditional authorities. CSSUs provide psychosocial support, mediation, and referral services for women and children survivors of abuse, exploitation, and neglect. CommCare is strengthening CSSU monitoring, activities, and information systems.
In rural Jharkhand, Rural Health Care Providers (RHCP) and Lab Technicians (LT) use CommCare to improve TB case detection, follow-up rates, symptomatic case management, and DOTS adherence.
RHCP refers symptomatic cases to LT where sputum is tested for TB. If lost to follow up, an SMS is sent to the patient, RHCP, and LT. An SMS is also sent to the patient with lab results.
ICAP is using CommCare to improve treatment outcomes of TB patients and household contacts by strengthening their DOTS system and follow-up.
Nurses use CommCare in government clinics to register TB patients, schedule appointments, and follow up on missed appointments. CHWs use CommCare during home visits to screen contacts for TB and refer potential cases to clinics. CommCare helps ICAP supervise DOTS supporters and provide TB education and counseling through multimedia.
SNEHA implemented CommCare to replace its manual data collection and entry system to track mothers and newborns in Mumbai’s slums, accompanying a programmatic scale-up in strengthening referral linkages within the municipal health system. The CommCare application allows individual children’s weights to be updated on a monthly basis, and support the health worker to follow-up with malnourished children. [CommCare Application]
RMF implemented CommCare to assist Community Nutrition Educators (CNEs) in identifying children with Severe Acute Malnutrition (SAM) and Moderate Acute Malnutrition (MAM) through measuring MUAC. In addition to tracking MUAC over time, the application supports counseling to families of malnourished children and refers these children to government treatment facilities for rehabilitation in villages of Madhya Pradesh. Their work was previously recorded in paper format and implementation of mobile data collection has reduced the latency period from 45 days to eight hours. [Published Study]
Pathfinder International, in collaboration with Dimagi, USAID, and the Haitian Ministry, has trained more than 300 CHWs under the mSante mHealth Project. This mobile application focuses on case management, health service delivery, referrals for tracking patients between home and the health facility, and features modules focused on interventions targeted at family planning and maternal and child health. Pathfinder and partners are currently working toward scaling this project to the national level.
In partnership with Dimagi and the Grameen Foundation, World Vision has deployed the MOTECH Suite for maternal, newborn, and child health (MNCH) and nutrition mobile applications in ten countries, including Afghanistan, Burundi, India, Indonesia, Mozambique, Niger, Sierra Leone, Sri Lanka, Uganda, and Zambia. These applications are designed to support CHWs to deliver MNCH and nutrition services more efficiently by reinforcing intervention protocols, serving as job aids and acting as monitoring tools.
Under the APHIA plus project in Kenya, Pathfinder, with the support of USAID, has worked with Dimagi to monitor and track the health of pregnant mothers and orphans and vulnerable children. Using CommCare, CHWs are better able to monitor maternal and newborn health indicators, keep women informed of their expected delivery date and signs of complications, and help women prepare for delivery. As of spring 2018, over 260 CHWs trained through mHMtaani were using CommCare. The application also contributed to an increased number of facility-based deliveries as a result of due date reminders.
The Harvard School of Public Health, in collaboration with the Indian government, the World Health Organization, the Gates Foundation and Population Services International, aims to assess whether the introduction of the WHO Safe Childbirth Checklist results in a decline of maternal and newborn deaths. Outcomes of 172,000 births will be tracked, in addition to the provision of essential supplies for safe birth. Dimagi is supporting the research data collection process through CommCare and CommCareHQ, where managers, supervisors, and researchers on the Better Birth Project will be able to access and analyze submitted data.
The ReMiND project in Uttar Pradesh, India is well known as a leading example of best practices for using mobile health technology to increase key maternal and newborn health practices. Through ReMIND, Catholic Relief Services (CRS) and Dimagi are using CommCare to help Accredited Social Health Activists (ASHAs) counsel and evaluate women and their newborns for danger signs both before and after birth. Case management allows ASHAs to register and track every pregnant patient through pregnancy to the postpartum period, as well as the newborns through their first year of life. Over 200 ASHAs have been trained to use these applications, ultimately reaching over 20,000 women and their children.
To improve access to protection services and reduce HIV\’s impact for women and children, UNICEF worked with the Malawi government to established a Community Survivor Support Unit (CSSU) in Malawi’s 300 traditional authorities. CSSUs provide psychosocial support, mediation, and referral services for women and children survivors of abuse, exploitation, and neglect. CommCare is strengthening CSSU monitoring, activities, and information systems.
In South Africa, CARE provides Integrated Access to Care and Treatment (iACT) literacy programmes for registered clients in local communities. They are using CommCare to register participants and provide follow up services and education for both HIV and TB, including making client referrals to clinics, recording client attendance during iACT sessions, and schedule automatic reminders for client follow up.
MSF tested a proof of concept CommCare App in the community of Khayelitsha, Cape Town to keep track of patients in ART Adherence Club (AC) clubs. By using the application, MSF staff would be able to track club attendance in real time, make referrals to clinics, and identify defaulters. The system also enabled individual feedback to facilitators based on their mobile activity, and regular email reports of clubs activities available for M&E team, as well as raw data to identify and trigger alerts for high-risk or defaulting clients.
The IMAGE Project combines a microfinance intervention with a gender and HIV awareness curriculum with the aim of improving the social and economic well-being of households and reducing the risk of HIV infection and gender-based violence. The IMAGE Project is currently working with 5000 households in 300 rural villages across 4 South African provinces – Limpopo, Gauteng, Northwest and KwaZulu Natal. The nature of the program is highly decentralized – with 35 field staff that work in small, dispersed teams. The project has additional replication sites in Tanzania, Kenya, Zimbabwe and Peru.
Dimagi partnered with Boston’s Brigham and Women’s Hospital and Social & Scientific Systems, Inc. (SSS) to develop a scalable text messaging (SMS) system to improve HIV medication adherence in 14 countries in Africa, Asia, and the Americas. The SMS intervention is part of an ongoing clinical trial, A5288, supported by the Aids Clinical Trial Group (ACTG). The system was designed to optimize combination therapy for HIV-infected patients, who currently struggle with treatment and have demonstrated resistance to common anti-retroviral drugs.
With support from Econet Wireless and the Zimbabwean Ministry of Health and Child Care, Global Solutions for Infectious Diseases (GSID) created a mobile system with Dimagi and ODK Diagnostics to better process rapid diagnostic tests for HIV and malaria. The system utilizes CommCare’s case management and reporting features to digitize health workers’ workloads, and ODK-Dx’s ability to process, analyze, and return RDT results with computer vision algorithms. The system was used in five sites in Manicaland province, including three hospitals and two health centers.
The postpartum IUD initiative aims to address the postpartum contraceptive needs of women by training community midwives, health workers, doctors and delivery unit staff in postpartum IUD counseling and insertion. As part of this project, project staff are using CommCare to collect baseline and intervention data, including data with women at the hospital after delivery, at nine months, and at 18 months after delivery.
Together with the London School of Hygiene and Tropical Medicine (LSHTM) and International Medical Corps (IMC), IPA developed a two-armed cluster-randomized trial to evaluate the effectiveness of a smartphone-based CommCare data capture and management system relative to the current paper-based system for Ebola contact tracing and monitoring in Sierra Leone. The 11 chiefdoms in Port Loko district were randomized to receive either the CommCare intervention or the paper-based system control.
In Guinea, the Earth Institute, UNFPA, and the Guinean Ministry of Health have adapted the standardized Ebola contact-tracing form to a CommCare application. Available in both English and French, the application was designed to be quickly deployed, updated with changing protocols, and includes an instructional module with videos that contact-tracers can view for post-training guidance. The Earth Institute uses a dashboard developed by Tableau and also employs user-configurable reports that are viewable directly in CommCare. A pilot was deployed in December 2018 and has since scaled up to 5 of the 8 prefectures (Conakry, Coyah, Dubreka, Forecariah, and Boffa) that currently have Ebola, with 317 contact tracers and 50 supervisors on CommCare.
IntraHealth and Dimagi have worked together to develop and deploy a CommCare Supply application for the management of all family planning commodities in 1,400 facilities across Senegal. In this deployment, mobile logisticians equipped with commodities travel to each facility to perform inventory management tasks, track indicators, calculate resupply levels, and deliver commodities on the spot. Each logistician is equipped with a tablet running CommCare Supply which allows them to easily record, manage, and review stock information for hundreds of facilities. This intervention is currently being scaled nationally in Senegal.
In 2018 Dimagi was awarded an innovation grant from the Human Development Innovation Fund (HDIF) in Tanzania. Building on the success of mLabour in India, Dimagi will leverage the HDIF grant to adapt mLabour to the Tanzanian context and build upon its impact through two tracks: Adaption & Validation and Diffusion.
Adaptation & Validation: Dimagi, in partnership with FHI 360 and other local research partners, will conduct focused user-centered design activities and engage a wide range of stakeholders to understand the requirements for scaling mLabour throughout Tanzania. During the first year of the project, Dimagi will conduct an initial 3-month study to validate the safety, usability, and suitability of mLabour. In the second year, additional studies will be conducted to assess how quality of care is impacted through the use of mLabour.
Diffusion: Through the Diffusion Track, Dimagi aims to deploy mLabour to five organizations in Tanzania, spanning both the private and public sector. Diffusion activities will include capacity building of two Tanzanian technical organizations to support mLabour, engagement with a range of private and public providers, and engagement with the Ministry of Health and Social Welfare.
World Vision has initiated an innovative IMCI mobile application to increase integrated community case management (iCCM) and ensure higher healthcare quality through job aids, referral support, and supervision checklists. Mobile phones equipped with the MOTECH suite are enabled with iCCM-specific modules. Job aids using response-triggered decision tree algorithms will ensure adherence to standardized protocols, improving diagnosis and treatment.
TulaSalud’s mHealth program in Guatemala, KAWOK, uses CommCare for its maternal and neonatal care application, in addition to others for auxiliary nurse services, community surveying, and malaria monitoring and treatment. Features include remote decision support, SMS alerts, and local language customization, and incorporating open-source products such as Google Earth for GPS tracking. A central function of the app is to strengthen Guatemala’s Zero Hunger Pact to reduce chronic and seasonal child malnutrition and child deaths among indigenous communities.
In collaboration with the London School of Hygiene and Tropical Medicine and University College of London, Malaria Consortium implemented inSCALE to demonstrate that government-led Integrated Community Case Management (iCCM) can improve healthcare services and expand coverage in Mozambique. The project uses CommCare to strengthen communication between community health workers (CHWs) and health facility supervisors, and with heavy involvement of the Ministry of Health. InSCALE has the potential to expand into other areas of the health system, with the goal of improved diagnosis, treatment, and monitoring of disease throughout Mozambique.
D-Tree International designed a CommCare application while providing technical assistance to the USAID-funded “Integrated (HIV Effect) Migration and Positive Action for Community Transformation” (IMPACT) project. This project aims to improve the quality of life of orphans and vulnerable children in three target districts in Malawi. The application functions as a job aid to health surveillance assistants (HSAs), providing decision support to accurately treat sick children and follows Malawi’s government-designated IMCI protocol.
Through funding from the Bill & Melinda Gates Foundation, Terre des Homes is deploying CommCare to 400 clinics in Burkina Faso to improve IMCI adherence. Terre des Hommes adopted the Integrated eDiagnostic Approach (IeDA) utilizing the Electronic Consultation Register (REC), a simple and low-cost IMCI diagnostic support tool to help nurses comply with IMCI protocols to ensure data accuracy. REC 2.0 is built on CommCare and includes both a tablet-based mobile app in addition to a web dashboard.
The cStock system is scaled nationally to calculate just-in-time stock needs of the over 3,000 community health workers (CHWs) in Malawi as part of the Bill & Melinda Gates Foundation-funded JSI Supply Chains for Community Case Management (SC4CCM) initiative. In Malawi, CHWs provide Community Case Management (CCM), carrying and prescribing a defined list of essential medicines such as Oral Rehydration Salts, anti-malarials, antibiotics, and family planning commodities. Built on CommCare Supply, cStock allows CHWs to use their personal phones to submit SMS with stock information, allowing community level data, previously unavailable, to be visible to decision makers at all levels of the system. A recent paper in the Journal of Global Health found that the use of cStock in Malawi contributed to significant reductions in stockout rates and lead times for resupply, as well as improvements in overall stock management [Shieshia, 2018].
The EWS system was designed to provide real-time stock status information on reproductive health commodities to decision-makers at all levels and to provide early warning of a drop in supplies. Its goal was also to foster effective supervision of ordering and delivery, reinforce the availability of all essential health commodities by improving the timeliness and accuracy of paper-based ordering and reporting from the SDPs, prevent widespread emergency ordering by aiding districts and facilities in planned ordering through effective, automated data analysis tools. In Ghana, the USAID | DELIVER PROJECT (implemented by JSI) and the Ghana Health Service have deployed the EWS in 677 public health facilities and community health compounds across 162 districts in all 10 regions, including all antiretroviral therapy (ART) facilities, teaching hospitals and regional medical stores in the country.
The Ministry of Health (MoH) in Tanzania, with support from JSI through the USAID | DELIVER PROJECT has deployed the ILSGateway on a national scale, with over 4,600 Tanzanian facilities active today. In Tanzania, 93% of facilities are reportedly counting stock and managing bin cards more regularly and 97% of facilities are submitting requisition reports more regularly. 82% of districts reported improved visibility into tracer commodities. Users responding to the pilot evaluation in Tanzania indicated that the increased recognition and real-time nature of the SMS system was as powerful an incentive as monetary rewards, and reporting rates for the pilot were comparable with other systems that provided a monetary reward for reporting, demonstrated the feasibility of maintaining high and consistent user reporting rates without the need for supplementary monetary incentives.
HOPE is a system to pay existing incentives directly to mothers/ASHAs in their bank accounts. HOPE currently allows computer-based input of events for mothers. These are approved by the block accountant, which triggers payment to the bank account. An API has been developed to integrate data captured through another CommCare app with HOPE. The API exposes a list of all mothers and the “HOPE” events that have occurred for those mothers, which will eventually lead to payment. The API matches mothers with those in HOPE using the bank account number.
TechnoServe is partnering with a national South African bank to provide business development services to beneficiaries of a regional business-grouping scheme. Technoserve business advisors provide tailored support to entrepreneurs by providing business development services that drive the competitiveness and sustainability of beneficiary businesses. The business advisors run CommCare on both tablets and laptop computers to improve timeliness of beneficiary visits and quality of services delivered. The application enables tracking of financial health of the beneficiaries as well as tracking services delivered to beneficiaries over time.
The Government of the Republic of Zambia (GRZ), with support from DFID, UNICEF and Irish Aid, is currently implementing social cash transfers (SCTs) in 13 districts with the objective of reducing extreme poverty and vulnerability. The program is transitioning from a paper-based system used since 2004 to CommCare, with the aim of addressing problems of data accuracy and completeness during registration and follow-up activities. Enumerators, CWAC leads, and District officers are equipped with a CommCare application to manage the enrollment, support, and tracking of all beneficiaries in the system. Case management enables field staff to review and update details to existing beneficiary data within the mobile application. Follow-up visit forms take into account beneficiary details and are customized according to the history of a given case. SMS reminders enable communication with beneficiaries and field staff without direct access to the application. Reminders are automated based on the information stored in each beneficiary’s case record. This solution goes beyond accurate data collection and closes the loop in the approval, payment distribution and follow-up processes.
The Intervention with Microfinance for AIDS & Gender Equity (IMAGE Project), an NGO linked to the University of the Witwatersrand School of Public Health, combines a microfinance intervention with a gender/HIV awareness curriculum with the aim of improving the social and economic well being of households and reducing the risk of HIV infection and gender-based violence. The IMAGE Project is currently working with 5000 households in 300 rural villages across four South African provinces – Limpopo, Gauteng, Northwest and KwaZulu Natal, with 35 field staff working in small, dispersed teams. The IMAGE Project uses CommCare to track the progress of individual loan clients with respect to economic well being, assess performance in the microfinance intervention, and collect periodic data on health and social outcomes. The IMAGE project also uses CommCare to conduct routine performance monitoring for program staff to assess the quality intervention delivery and the support and supervision received. The CommCare platform is digitizing paper-based routine assessment forms to achieve transparent, bi-directional and regular feedback.
Small Enterprise Foundation (SEF) is a non-profit, pro-poor microfinance institution working towards the alleviation and eventual eradication of poverty. SEF targets female-led small and medium enterprises with credit and savings services to foster sustainable income generation, job creation, and social empowerment throughout South Africa. The CommCare application helps SEF to ensure that all activities are performed according to internal policies and procedures; corrupt and/or fraudulent activities are prevented, identified and reported on; special assignments requested by senior managers are executed; weaknesses and/or threats to SEF are identified and preventative measures are recommended; and ensure the overall service to clients is of the highest quality.
Pollinate Energy is an Indian-based NGO whose mission is to eradicate energy poverty through clean energy solutions, including solar-powered lights. Pollinate Energy’s CommCare application is used by the NGO’s “pollinators” to manage their energy solutions stock, complete community profile surveys, and ensure that communities provide accurate and timely repayments for solar-powered lights. In addition to supporting Pollinators, the application also provides a solar-powered light installation guide for beneficiaries [Article].
In an effort to improve access to woman and child protection services and reduce the impact of HIV on women and children, UNICEF worked with the government of Malawi established a Community Victim Support Unit (CVSU) in each of the 300 authorities in the country. CVSUs provide psychosocial support, mediation, and referral services for women and children survivors of abuse, violence, exploitation, and neglect. CommCare has been used to strengthen monitoring and support the activities and information systems of CVSUs.
Since Sept 2018, Dimagi has been collaborating with its partners St. John’s Research Institute to apply CommCare to help auxiliary nurses and other health workers identify and manage cases of GBV. CommCare helps the health workers follow tested, standardized protocols and inform survivors of their rights and options, provide counseling messages, and facilitate support services. CommCare reduces the burden of paper-based reporting and increases adherence to tested protocols that accurately screen for GBV.
Anseye Pou Ayiti (Teach for Haiti) seeks to raise education outcomes in rural Haiti by recruiting, training, and equipping teacher-leaders to promote teacher excellence and student success. Their CommCare application enables pedagogical coaches to track teachers’ growth according to their individual professional growth plans and the organization’s competencies framework, and assists pedagogical coaches in conducting classroom observations and coaching sessions with teachers.
UNICEF Ghana is using CommCare as an e-checklist to track and assess child-friendliness of schools around Ghana. The checklists monitor teacher and student attendance, assess facilities for safety and sanitation, track lesson plan adherence and classroom behavior, and compare results to a school’s past performance and community involvement. Field workers have the ability to enter data in real time for supervisors to assess schools’ performance on relevant indicators.
Save the Children Thailand created a CommCare application for School Monitoring that enrolls students in schools along the Thai-Myanmar border. The app keeps official enrollment records and tracks attendance and reasons for absenteeism. Students are visited at the beginning of the school year, at mid-year, and at end of the year to assess progress. Information from the app can also be used to create student ID cards, complete with photos of each individual student. The app was translated into multiple languages so it could be deployed in other regions. Dimagi trained the first 23 users and Save the Children is now scaling up to 100 users.
Dimagi has been running several trials of food distribution programs for rural schools in Zambia. CommCare has been deployed to link schools to grain and cooking oil silos. Teachers send an SMS stating their attendance levels over a period, as well as on-hand levels of cooking oils and grain. CommCare is able to calculate consumption rates based on this data, alerting silo managers to when particular schools will require a resupply and at what levels. The instantaneous nature of data processing ensures neither wastage nor under-supply of commodities for the nearly 5000 children in 88 schools that rely on this program for food.
Dimagi is launching a pilot with MIA to help with premiums calculations. Household members are registered and asset values are calculated programmatically, allowing for frontline workers to focus on providing counseling videos on claims coverage. Data collected is stored on CommCareHQ to allow for swift payouts in the event of a claim. This system is designed to expand into extremely low-resource settings while shifting claims management to an off-site, remote setting to reduce overhead expenditures.
Technoserve supports agriculture extension workers and supervisors to track crop status, financials, and payroll information. The CommCare application records farmer information for easy access by extension workers and contains multimedia counseling materials such as the safe use of pesticides and seedling growing techniques.
Catholic Relief Services is using CommCare to support an agriculture project in India through the Gates Foundation’s initiative: Improved Rice-based Rainfed Agricultural Systems. This tests the extension agents and supervisors to track the progress of farms growing these various varieties of rice. Each rice variety’s effectiveness is tracked and evaluated, leading to better livelihood outcomes in this agriculturally dependent region.
Since 2018, Dimagi has been working on the CARE Pathways project, which is focused on helping female self-help agricultural groups improve their productivity and increase incomes. Dimagi has set up a custom, tablet based scheduling and activity tracking system for CARE’s extension workers, providing a “Knowledge Base” for on-site refresher training, as well as a complex data collection system to track group and individual performance on yield, income, and empowerment indicators. All content is locally contextualized and summarized in easily parsed custom reporting.
Dimagi is working with UGPCL to help better manage their cooperative of over 1,000 farmers. Cooperative supervisors track the entire value-chain of small-scale farmers from the initial loan through its repayment, the output and quality of crops during the growing season, the farm produce’s contract sale for processing, as well as value addition by third parties. By providing a mobile-based system for tracking key metrics, cooperative managers can make informed decisions about the future of their cooperative, as well as estimate future cash flow requirements based on yield and sales data. Examples of features in the application include tools to help farmers calculate planting density, step-by-step guidance that helps farmers prepare for harvest, GPS tracking, and a module with instructional videos about how to use the application.

No comments:

Post a Comment