سؤال

يستخدم ريلز مفهوم الترحيلات للتعامل مع تغييرات النموذج باستخدام ActiveRecord API.

يستخدم CouchDB JSON (الخرائط والمصفوفات المتداخلة) لتمثيل كائنات النموذج الخاصة به.

في العمل مع CouchDB حتى الآن، لا أرى طرقًا جيدة للتعرف على متى تغيرت بنية المستند (بخلاف الانضباط كمطور)، أو لترحيل المستندات من نموذج قديم إلى نموذج جديد.

هل توجد ميزات موجودة أو هل لديك أفضل الممارسات للتعامل مع تغييرات النموذج في CouchDB؟

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

المحلول

حان الوقت لغسل دماغ RDBMS.:)

تهدف إحدى أكبر نقاط التصميم الخالي من المخططات في Coudb إلى منع الحاجة إلى عمليات الترحيل.إن تمثيل JSON للكائنات يجعل من السهل كتابة الكائنات الخاصة بك.

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

إذا كنت تريد أن تكتمل، يمكنك العودة وإضافة moon_phase إلى المشاركات القديمة، ولكن هذا ليس ضروريًا تمامًا.

في طرق العرض الخاصة بك، يمكنك الوصول إلى moon_phase كسمة.وسيكون فارغًا أو يسبب استثناءً أو شيء من هذا القبيل.(لست خبيرًا في JS، أعتقد أن القيمة null هي الإجابة الصحيحة)

الشيء هو أنه لا يهم حقا.إذا كنت ترغب في تغيير شيء ما، فقط قم بتغييره.مع ذلك تأكد من أن وجهات نظرك تتفهم هذا التغيير.والذي في تجربتي لا يتطلب الكثير حقًا.

أيضًا، إذا كنت مصابًا بجنون العظمة حقًا، فيمكنك تخزين سمة الإصدار/النوع، كما في:

{
   _id: "foo-post",
   _rev: "23490AD",
   type: "post",
   typevers: 0,
   moon_phase: "full"
}

امل ان يساعد.

نصائح أخرى

إذا كنت ترغب في الحصول على المخططات وما زلت ترغب في استخدام CouchDB، فستحصل على "عدم تطابق المعاوقة".

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

def read(doc_id):
    doc = db.get(doc_id)
    if doc.schema_version == 1:
        # version 1 had names broken down too much
        doc.name = "%s %s" % (doc.first, doc.last)
        del doc.first
        del doc.last
        doc.schema_version = 2
        db.put(doc)
    if doc.schema_version == 2: weight
        # version 2 used kg instead of g
        doc.weight_g = doc.weight_kg * 1000
        del doc.volume_kg
        doc.schema_version = 3
        db.put(doc)
    return doc

إذا كنت ترغب في ترقية قاعدة البيانات بأكملها مرة واحدة، فما عليك سوى الاتصال read(doc_id) لكل وثيقة.

الدفع ActiveCouch.

CouchDB لا يحتوي على مخططات عن قصد، لذلك لا يوجد تعيين 1 إلى 1 للمفاهيم من عمليات ترحيل ActiveRecord إلى مكافئ CouchDB.ومع ذلك، يتضمن ActiveCouch عمليات ترحيل لعروض CouchDB.

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