ما هي الطريقة الاصطلاحية لتنفيذ المفاتيح الأجنبية في Couchdb؟

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

  •  16-09-2019
  •  | 
  •  

سؤال

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

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

ستعمل كلتا الطريقتين، على الرغم من أنني تقلق بشأن Couchdb عدم وجود قيود مفاجئة أجنبية؛ في الطريقة الأولى، يمكن حذف مستند التسلق، مما يتركك مع مجموعة بيانات تالفة.

كيف تقرر الطريقة التي يجب استخدامها؟ هي واحدة من هذه الأساليب المزيد من الاصطلاحية إلى couchdb؟ هل هناك أي طرق فاتني؟

أنا جديد على Couchdb، لذا من الصعب علي أن أرى مزايا / عيوب وجود هيكل أكثر أو أقل طبيعيا.

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

المحلول

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

function(doc) {
  if (doc.type == 'order') {
    emit([doc.cartid, 1], doc);
  } else if (doc.type == 'cart') {
    emit([doc.id, 0], doc);
  }
}

سيتم جمع المستندات من قبل CartoD مع الطلبات التي تأتي بعد العربة. يمكن بسهولة الانضمام رمز التطبيق بسهولة إلى هذا الدفق ويمكنك الاستعلام عن طريق رسمي معين باستخدام StartKey و Endeckey.

يرى: عرض الترتيب لقواعد الترتيب.

يمكنك أيضا استخدام تقليل للانضمام إليهم معا أيضا.

ما عليك سوى تغيير وظيفة الخريطة إلى هذا:

function(doc) {
  if (doc.type == 'order') {
    emit([doc.cartid, 1], {cartid: doc.cartid, orders: [doc]});
  } else if (doc.type == 'cart') {
    emit([doc.id, 0], {cartid: doc.id, orders: [], cart: doc);
  }
}

وإضافة وظيفة تقليل مثل هذا:

function(keys, values) {
  var out = {cartid: null, orders: [], cart: null};
  for (idx in values) {
    var doc = values[idx];
    out['cartid'] = doc.cartid;
    if (doc.cart) { out['cart'] = doc.cart };
    for (idx2 in doc.orders) {
      out.orders.push(doc.orders[idx2]);
    }
  }
  return out;
}

سيعود ذلك وثيقة واحدة لكل عربة تقوم بالطلقات، وهي مجموعة من وثائق الطلب ومستندلة عربة.

الاعتذار إذا كانت هناك أخطاء في التعليمات البرمجية أعلاه ولكن ليس لدي مثيل اختبار CouchDB مفيد لتجربةها. يجب أن تحصل على الفكرة العامة رغم أن Couchdb Wiki لديه المزيد من التفاصيل.

نصائح أخرى

إذا كانت كائنات الترتيب والسلة لديها علاقة واحدة إلى واحدة (والتي هي الطريقة التي تبدو بها)، فإن النهج الثاني هو الأكثر إهمالا ... فقط احتفظ بالكائنات المرتبطة الواردة في واحد. هذا يمنحك سلامة البيانات التي تبحث عنها وتجعلها بسيطة ؛-)

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