هندسة البيانات / المتوسط: التغيير والزمن والتنسيق / الدرس 7
المؤشرات التزايدية ونقاط الحفظ
استخرج تغييرات محدودة دون تخطي الوقت المتعادل أو تقديم التقدم على الأثر المقبول. حدد معنى مؤشر المصدر وحد التعافي.
في هذه الصفحة
أهداف الدرس
- بناء مؤشرات مستقرة كاملة وسياسات تداخل صريحة.
- تنسيق حالة الوجهة والتقدم ضمن حد مدعوم.
المؤشر الأعلى ادعاء عن ترتيب المصدر
يحتاج المستخرج التزايدي حقلاً للترتيب يناسب معناه نموذج تغير المصدر. قد يسبق وقت الحدث وقت الاستقبال، وقد يصحح أو يعاد تأريخه إلى الماضي، فلا يكون مؤشر تغيير كاملاً تلقائياً. وقد يتعادل الطابع بين صفوف. حدد حداً مركباً مستقراً أو لقطة مصدر أو موضع سجل، وما يستطيع كشفه من إضافة وتحديث وحذف. وثق افتراضات التغييرات المتأخرة ومسار المصالحة. لا يثبت اسم updated_at أن كل كاتب يقدمه باتساق، أو أن الصف المحذوف يترك دليلاً.
احفظ كل مكون ترتيب في المؤشر
تحتوي العينة المحلية صفين بالطابع10 وصفاً لاحقاً. يجب أن يحتفظ المؤشر(10,1) بالصف الثاني رغم تساوي وقته مع السابق. تطابق المقارنة المعجمية الترتيب التصاعدي المعلن. هذا نموذج مصدر مضبوط، لا إثبات ثبات لقطة استعلام قاعدة حقيقية أثناء التغيير. استخدم ORDER BY والشرط الكاملين المتوافقين في المحرك الفعلي، مع معالجة null وكاسر التعادل الفريد. يجب أن يحفظ ترميز المؤشر الأنواع والترتيب، لا أن يقارن سلاسل عرض اعتباطية.
rows = [(10, 1, 'a'), (10, 2, 'b'), (11, 3, 'c')]
cursor = (10, 1)
page = [row for row in rows if row[:2] > cursor]
assert page == [(10, 2, 'b'), (11, 3, 'c')]
assert [row[1] for row in page] == [2, 3]
يبقى متعادل الوقت مؤهلاً لأن معرفه أكبر، ويفقده شرط الوقت وحده.
يحتاج التداخل هوية وافتراض تأخر محدود
قد تعالج إعادة قراءة فترة حديثة بعض الوصول المتأخر، لكنها تعيد السجلات عمداً. امنع التكرار أو طبق تحديثاً يراعي الإصدار وفق هوية مصدر صريحة. لا يستعيد تداخل ثابت تصحيحات قديمة بلا حد، أو حذفاً نهائياً زال من المصدر. اختر النافذة من التأخر المقاس ومتطلبات العمل، مع مسار إصلاح أعمق أو سجل تغييرات. ميز الفترة الخالية الصحيحة عن فشل الجلب؛ فتقديم النقطة بعد خطأ المصدر قد يتخطى بيانات دائماً بينما يبلغ المجدول تقدماً.
احفظ الوجهة والنقطة معاً عندما يسمح الحد
يضع برنامج SQLite المعزول أثر وجهة واحداً وتحديث نقطته في معاملة صريحة واحدة، ثم يتراجع عنهما كبروفة فشل. يثبت بقاء الحالة حد التراجع المحلي المعروض، لا معاملة بين مصدر خارجي ومستودع. يستخدم الاتصال isolation_level=None بأسلوب الحفظ التلقائي ليكون BEGIN الصريح غير ملتبس. يحتاج التصميم الموزع الحقيقي احتفاظ مصدر وهوية ومصالحة لمعالجة الإعادة والردود المجهولة. لا تستنتج تسليماً شاملاً مرة واحدة من مثال معاملاتي محلي واحد.
import sqlite3
db = sqlite3.connect(':memory:', isolation_level=None)
db.executescript('CREATE TABLE target(id INTEGER PRIMARY KEY); CREATE TABLE progress(id INTEGER PRIMARY KEY,pos INTEGER); INSERT INTO progress VALUES(1,0);')
db.execute('BEGIN')
db.execute('INSERT INTO target VALUES(1)')
db.execute('UPDATE progress SET pos=1 WHERE id=1')
db.execute('ROLLBACK')
assert db.execute('SELECT COUNT(*) FROM target').fetchone()[0] == 0
assert db.execute('SELECT pos FROM progress').fetchone()[0] == 0
db.close()
يبقي الاثنين بالحالة الأولية دون ملف دائم أو اتصال خارجي.
سجل التقدم المقبول لا المحاوَل
احفظ فترة المدخل والمؤشر قبل وبعد وإصدار الوجهة وأعداد المقبول والمرفوض وهوية المحاولة مع قرار النقطة. يجب أن تصف النقطة حد البيانات المقبول فعلاً، لا أكبر مفتاح شوهد أثناء مسح ناقص. حد الإعادة وتحقق من تنظيف الاتصال بعد الفشل. تدرب على تعادل الأوقات وانقطاع الصفحة والتحديث غير المرتب والحذف وتعطل المصدر. تساعد API الأدوات، لكن الصحة تعتمد على مطابقة دلالة النقطة والوجهة لوعد المستهلك والتاريخ المتاح للإعادة.
الأخطاء الشائعة وإصلاحها
تتخطى صفوف تشارك آخر وقت
- لماذا يحدث؟
- أغفلت النقطة كاسر تعادل.
- كيف تصلحه؟
- استخدم مؤشراً كاملاً أو حد سجل ولقطة مدعوماً.
- كيف تتجنب تكراره؟
- اختبر صفوفاً متعادلة عند الحد.
يتقدم المؤشر بعد فشل القراءة
- لماذا يحدث؟
- عومل الفشل كفترة خالية مكتملة.
- كيف تصلحه؟
- احفظ الفشل وآخر نقطة مقبولة.
- كيف تتجنب تكراره؟
- افصل الخلو وخطأ المصدر.
يسمى الحفظ المحلي مرة واحدة شاملاً
- لماذا يحدث؟
- أُغفلت حدود المصدر والوجهة والإعادة.
- كيف تصلحه؟
- حدد الذرية والتعافي بدقة.
- كيف تتجنب تكراره؟
- اختبر الرد الضائع والإعادة.
اختبر فهمك
1. هل يستعيد تداخل يومين كل تصحيح لسنة؟
اعرض الحل المشروح
لا. يغطي التداخل فترة التأخر المفترضة فقط، ويتطلب تطبيقاً آمناً للتكرار. تحتاج التصحيحات الأقدم والحذف النهائي آلية سجل تغييرات أو مصالحة أخرى. صرّح بضمانات المصدر وأقصى أفق إصلاح، بدلاً من تقديم التداخل كحل عام للاكتمال.
2. لماذا تصف النقطة المقبول لا أكبر مرصود؟
اعرض الحل المشروح
قد يُرى مفتاح لاحق بينما تفشل صفحات سابقة أو يفشل نشر الوجهة. تقديم النقطة إليه قد يتخطى الآثار المفقودة عند إعادة التشغيل. نسق التقدم مع حد الوجهة المقبول واحفظ المدخلات القابلة للإعادة؛ فالمشاهدة وحدها ليست دليلاً على التسليم الكامل.
أهم ما تعلمته
- لا يصح المؤشر إلا بعقد ترتيب وتغيير المصدر.
- يحتاج الأثر المقبول والتقدم نشراً منسقاً.