سؤال

أحاول كتابة برنامج C ++ بسيط يستخدم Berkeley DB للتخزين. مفتاح قاعدة البيانات من النوع time_t والبيانات هي integer.

أحتاج إلى أخذ الفرق بين اثنين من البيانات المجاورة في مفتاحين. أفتح مؤشرًا مع Flag db_set_range ثم أستخدم db_next للتكرار.

مشكلتي هي أن المؤشر يرجع البيانات غير المصنفة. هل هناك طريقة لتحديد وظيفة Sorter مخصصة للمؤشر؟

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

المحلول

بعض الأسباب التي تجعلك ترغب في توفير وظيفة فرز مخصصة هي:

أنت تستخدم نظامًا صغيرًا للإنديان (مثل x86) وأنت تستخدم الأعداد الصحيحة كمفاتيح لقاعدة البيانات الخاصة بك. تخزن Berkeley DB مفاتيح كأسلاك بايت والأعداد الصحيحة في الإنديان لا يتم فرزها بشكل جيد عند النظر إليها على أنها سلاسل بايت. هناك العديد من الحلول لهذه المشكلة ، واحدة لتوفير وظيفة مقارنة مخصصة. يرى http://www.oracle.com/technology/documentation/berkeley-db/db/ref/am_misc/faq.html للمزيد من المعلومات.

يمكنك تعيين وظيفة مقارنة مفتاح Btree باستخدام DB-> set_bt_compare ().

على سبيل المثال ، مثال روتين يستخدم لفرز مفاتيح عدد صحيح في قاعدة البيانات هو:

int
compare_int(DB *dbp, const DBT *a, const DBT *b)
{
    int ai, bi;

    /* 
     * Returns: 
     * < 0 if a < b 
     * = 0 if a = b 
     * > 0 if a > b 
     */ 
    memcpy(&ai, a->data, sizeof(int)); 
    memcpy(&bi, b->data, sizeof(int)); 
    return (ai - bi); 
} 

نصائح أخرى

أعتقد أنه يجب عليك إنشاء ملف فهرس ثانوي لبياناتك.

لقد حاولت Sleeping Cat Berkeley قاعدة بيانات (بسبب صيانة الكود) لكنني لم أحاول مؤشرات ثانوية.
إذا لم يكن Perfomance أمرًا بالغ الأهمية ويمكنك تبديل محرك قاعدة البيانات ، فإنني أوصي sqlite :-)

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