سؤال

دعونا نقول أنا أكتب تحليل سجل التطبيق.المجال الرئيسي الكائن سيكون LogEntry.بالإضافة إلى ذلك.مستخدمي تطبيق تحديد LogTopic الذي يصف ما إدخالات السجل أنهم مهتمون.كما يتلقى تطبيق إدخالات سجل وتضيف لهم couchDB ، كما يتحقق لهم ضد كل LogTopics في النظام لمعرفة ما إذا كانت تطابق المعايير في هذا الموضوع.إذا كان كذلك فإن النظام يجب أن تسجل دخول المباريات الموضوع.وبالتالي ، هناك عدة العلاقة بين LogEntries و LogTopics.

إذا كنت تخزين هذا في RDBMS أود أن تفعل شيئا مثل:

CREATE TABLE Entry (
 id int,
 ...
)

CREATE TABLE Topic (
 id int,
 ...
)

CREATE TABLE TopicEntryMap (
 entry_id int,
 topic_id int
)

باستخدام CouchDB حاولت أولا وجود اثنين فقط من أنواع المستندات.كنت قد LogEntry نوع, أبحث عن شيء مثل هذا:

{
  'type': 'LogEntry',
  'severity': 'DEBUG',
  ...
}

و كان لدى LogTopic نوع, أبحث عن شيء مثل هذا:

{
  'type': 'LogTopic',
  'matching_entries': ['log_entry_1','log_entry_12','log_entry_34',....],
  ...
}

يمكنك أن ترى أن أنا أمثل العلاقة باستخدام matching_entries الميدانية في كل LogTopic الوثائق لتخزين قائمة LogEntry الوثيقة معرفات.هذا يعمل بشكل جيد إلى حد ما, ولكن لدي مشاكل عند العديد من العملاء على حد سواء في محاولة لإضافة مطابقة الدخول إلى الموضوع.كل محاولة متفائلة التحديثات و فشل أحد.الحل أنا أستخدم الآن هو في الأساس إنتاج RDBMS النهج ، إضافة الوثيقة الثالثة اكتب شيئا مثل:

{
  'type':'LogTopicToLogEntryMap',
  'topic_id':'topic_12',
  'entry_id':'entry_15'
}

هذا يعمل و يحصل في الماضي المتزامنة التحديث القضايا ، ولكن لدي تحفظات:

  1. أخشى أن أنا فقط باستخدام هذا النهج لأنه ماذا أفعل في العلائقية ديسيبل.وأتساءل عما إذا كان هناك أكثر couchDB مثل (relaxful?) الحل.
  2. وجهات نظري لم يعد استرداد كافة الإدخالات على محددة الموضوع في مكالمة واحدة.بلدي الحل السابق لهم: (إن أنا تستخدم include_docs المعلمة).

أي شخص يكون حلا أفضل بالنسبة لي ؟ من شأنه أن يساعد إذا كنت أيضا نشر آراء أستخدمه ؟

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

المحلول

النهج الخاص بك على ما يرام.باستخدام CouchDB لا يعني فقط التخلي عن العلائقية النمذجة.سوف تحتاج إلى تشغيل اثنين من الاستفسارات ولكن هذا لأن هذا هو "الانضمام".استعلامات SQL مع ينضم أيضا بطيئة ولكن بناء جملة SQL تمكنك من التعبير عن الاستعلام في بيان واحد.

في بضعة أشهر من الخبرة مع CouchDB هذا ما اكتشفت:

  1. لا يوجد مخطط, حتى تصميم نماذج التطبيق هو سريعة ومرنة
  2. CRUD هناك وبالتالي تطوير التطبيق الخاص بك هو سريعة ومرنة
  3. وداعا حقن SQL
  4. ماذا سيكون SQL الانضمام يتطلب أكثر قليلا من العمل في CouchDB

اعتمادا على الاحتياجات الخاصة بك لقد وجدت أن couchdb-لوسين مفيد أيضا من أجل بناء المزيد من الاستعلامات المعقدة.

نصائح أخرى

لقد عبر نشر هذا السؤال couchdb المستخدمين القائمة البريدية و ناثان ستوت وأشار لي إلى a مفيدة جدا بلوق وظيفة كريستوفر لينز

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

ثم بسيط خريطة وظيفة تنبعث منها LogEntry مرة واحدة لكل LogTopic تنتمي إليها ، أساسا بناء الخاصة بك TopicEntryMap على الطاير:

"map": function (doc) {
    doc.topics.map(function (topic) {
        emit(topic, doc);
    });
}

هذه طريقة الاستعلام عن الرأي مع ?key=<topic> الحجة سوف تعطيك كل الإدخالات التي تنتمي إلى هذا الموضوع.

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