هندسة البيانات / المتوسط: التغيير والزمن والتنسيق / الدرس 8
التقاط تغير البيانات والحالة ذات الإصدار
طبق التحديث والحذف بترتيب المصدر لا الوصول، واحفظ إصداراً يمنع حدثاً قديماً من إحياء محذوف.
في هذه الصفحة
أهداف الدرس
- تمييز اللقطة والحدث والحالة الحالية المادية.
- تطبيق سياسة الإصدار والتكرار وعلامة الحذف.
يصف حدث التغيير انتقال المصدر
تصف اللقطة حالة عند حد مختار، بينما يمثل التقاط التغيير انتقالات كالإضافة والتحديث والحذف. لمعنى غلاف الحدث وموضع المصدر وبيانات المعاملة خصوصية الأداة. لا يساوي ترتيب وصول الأحداث عبر عمال أو أقسام ترتيب الحفظ العالمي للمصدر تلقائياً. حدد الهوية ومجال الترتيب لكل مفتاح تجاري، وكيف تتصل اللقطة الأولية بتدفق التغيير اللاحق. قد تسبب فجوة أو تداخل عند الانتقال حالة مفقودة أو مكررة، رغم أن كل جزء يبدو صالحاً منفرداً.
ارفض تغيير المفتاح القديم صراحة
يطبق النموذج المحلي الأحداث ذات إصدار المصدر الأعلى للمفتاح نفسه فقط. يحفظ علامة الحذف مع الإصدار بدلاً من محو كل دليل المفتاح، فلا يحيي تحديث2 المتأخر حذف3. هذا الإصدار العددي عقد اصطناعي، لا تفسير عام للطوابع أو مواضع الموصل. ما زال تكرار الإصدار نفسه بمحتوى متعارض يحتاج كشفاً. يوضح النموذج تطبيق الحالة الحالية فقط، ولا يحفظ سجل تدقيق أو يعيد سلوك معاملات موصل حقيقي.
state = {}
def apply(key, version, value, deleted=False):
current = state.get(key)
if current is not None and version <= current['version']:
return False
state[key] = {'version': version, 'value': value, 'deleted': deleted}
return True
assert apply('s1', 3, None, True)
assert not apply('s1', 2, 'old')
assert state['s1']['deleted'] is True
يبقى الحذف مرجعاً أمام القديم بحفظ الإصدار دون استهلاك سجل مصدر.
وحد دلالة الحذف والاحتفاظ
يزيل الحذف النهائي صفوف المصدر، لذلك لا تستطيع الاستعلامات الدورية عن الموجود دائماً إعادة بناء تاريخ الحذف. قد تحفظ علامة حذف أو انتقال مكافئ ما يحتاجه المستهلك. أبقِ حالة الإصدار ومنع التكرار مدة تحقق افتراض الإعادة والتأخر، مع احترام الخصوصية والاحتفاظ. قد تحول إزالتها المبكرة إعادة قديمة إلى حدث جديد. وفي المقابل لا يبرر نفع البيانات الوصفية حفظ الحمولات الحساسة القديمة دائماً. افصل دليل الهوية والإصدار الضروري عن المحتوى الأصلي غير الضروري.
طبق الأحدث بعبارة قاعدة معزولة
تقبل عينة SQLite في الذاكرة إصدار مصدر أحدث، وتتجاهل تحديثاً قديماً باستخدام هدف تعارض وWHERE صريحين. تتحقق من الإصدار والقيمة النهائيين، لا العدد فقط. هذا تنفيذ وجهة واحد وفق UPSERT في SQLite؛ وللمستودعات الأخرى سلوك MERGE وقيود وتزامن مختلف. لا تعوض سياسة المفتاح عقد المصدر. إذا أمكن تعارض الإصدار نفسه، فقارن المحتوى وارفض أو صالح وفق القاعدة، ولا تدع ترتيب الوصول يختار الحقيقة بصمت.
import sqlite3
db = sqlite3.connect(':memory:')
db.execute('CREATE TABLE current_state(id TEXT PRIMARY KEY,version INTEGER,value TEXT)')
sql = '''INSERT INTO current_state VALUES(?,?,?) ON CONFLICT(id)
DO UPDATE SET version=excluded.version,value=excluded.value
WHERE excluded.version > current_state.version'''
db.execute(sql, ('s1', 3, 'new'))
db.execute(sql, ('s1', 2, 'old'))
assert db.execute('SELECT version,value FROM current_state').fetchone() == (3, 'new')
db.close()
لا يستبدل2 القديم3، ولا قاعدة قرص أو موصل أو مستودع.
تحقق من اتصال اللقطة والسجل والإصلاح
سجل مواضع المصدر وحالة الوجهة المقبولة عند اكتمال اللقطة وإعادة الموصل وتغير المخطط. سلامة الموصل لا تثبت بقاء كل حدث مطلوب في السجل أو قبول الوجهة له. راقب التأخر بالنسبة للاحتفاظ، وحدد إعادة اللقطة والمصالحة قبل انتهاء التاريخ. اختبر التسليم المكرر والتغيير غير المرتب والحذف وتغير المفاتيح ومجموعات المعاملات بالأداة المختارة. لا تتخط حدثاً لمجرد جعل المراقبة خضراء دون تقييم الحالة التجارية التي يخلقها الإغفال.
الأخطاء الشائعة وإصلاحها
يحيي تحديث قديم مفتاحاً محذوفاً
- لماذا يحدث؟
- حذف دليل الإصدار مبكراً.
- كيف تصلحه؟
- احفظ العلامة والإصدار وصالح المفتاح.
- كيف تتجنب تكراره؟
- اختبر الحذف ثم إعادة قديمة.
يعامل الوقت كترتيب حفظ عام
- لماذا يحدث؟
- لم يحدد مجال الساعة والترتيب.
- كيف تصلحه؟
- استخدم مواضع المصدر ودلالته الموثقة.
- كيف تتجنب تكراره؟
- وثق افتراضات الترتيب.
يخفي الموصل السليم حالة وجهة ناقصة
- لماذا يحدث؟
- اختلط الجلب والقبول.
- كيف تصلحه؟
- صالح الحدود والتغطية.
- كيف تتجنب تكراره؟
- راقب الحداثة وأفق الاحتفاظ.
اختبر فهمك
1. لماذا لا يكفي حذف صف الوجهة لسلامة الإعادة؟
اعرض الحل المشروح
قد يمحو الحذف دليل الإصدار اللازم لرفض تحديث قديم متأخر. احفظ علامة حذف وإصدار مناسبة أو سجل ترتيب مكافئ طوال أفق الإعادة المطلوب. قرر احتفاظ الحمولة منفصلاً عن الحد الأدنى الوصفي، واختبر إعادة التشغيل واللقطة الجديدة بدلاً من افتراض أن الغياب دائم.
2. هل تحل UPSERT على مفتاح العمل تعارض الإصدار نفسه؟
اعرض الحل المشروح
لا. تفرض UPSERT سلوك التعارض المكتوب، ولا تقرر أي ادعاء مصدر مشروع. حدد قواعد الهوية الثابتة وإصدار المصدر، وقارن المحتوى المتعارض، ثم ارفض أو صالح صراحة. قد يحوي جدول الحالة الحالية صفاً واحداً لكنه يمثل حقيقة خاطئة.
أهم ما تعلمته
- يحتاج CDC ترتيباً وحذفاً وانتقال لقطة صريحة.
- ترفض الوجهة القديم وتحفظ دليل الإعادة الكافي.