محتويات الدورة

هندسة البيانات / الأساسي: العقود والدفعات القابلة للإعادة / الدرس 4

مستوى صف SQL والربط والمصالحة

احفظ صحة التحويل العلاقي عندما يغير الربط الأعداد، وصالح المقاييس بمستوى معلن قبل الوثوق بالمجموع المنشور.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • توقع تعددية الربط وسلوك الأصل الاختياري.
  • استخدام تجميع مستقل وفحوص الثوابت.

حدد ما يمثله الصف بكل مرحلة

يمثل صف العميل وصف الشحنة وصف البند حقائق مختلفة. يكرر ربط أصل بفروع عدة حقول الأصل، وقد يضاعف ربط مجموعتين فرعيتين مستقلتين كليهما. نجاح تنفيذ SQL لا يجعل مستوى النتيجة صحيحاً. اكتب التعددية المتوقعة بجوار كل تحويل، وحدد هل ينتمي المقياس للأصل أم الفرع. قد تزيل DISTINCT صفوفاً معروضة متكررة، لكنها لا تصلح عموماً مجموعاً مالياً مضخماً؛ فالمبالغ المتساوية قد تكون أحداثاً صحيحة مستقلة. يجب أن تتبع المصالحة المعنى، لا مجرد تقليل العدد.

احفظ الأصل وعد هوية الفرع

ينشئ البرنامج الكامل قاعدة SQLite في الذاكرة فقط، ويغلقها بعد العمل. لا يملك العميل الثاني عملية شراء، لذلك يحفظه LEFT JOIN وتعيد COUNT(p.id) صفراً. ستعد COUNT(*) الصف الخارجي المحفوظ واحداً. يجعل التجميع والترتيب الصريحان عقد النتيجة مرئياً. يستخدم المثال أعداداً وأسماء اصطناعية لا قاعدة تطبيق. إنه يوضح دلالة الصفوف لا قياس الأداء، ولا يثبت أن كل علاقة اختيارية في مسار أكبر يجب أن تتبع سياسة الحفظ نفسها.

python عد ربط خارجي اصطناعي في ذاكرة SQLite
import sqlite3

db = sqlite3.connect(':memory:')
db.executescript('''
CREATE TABLE customer(id INTEGER PRIMARY KEY);
CREATE TABLE purchase(id INTEGER PRIMARY KEY, customer_id INTEGER);
INSERT INTO customer VALUES(1),(2);
INSERT INTO purchase VALUES(10,1),(11,1);
''')
rows = db.execute('''SELECT c.id,COUNT(p.id) FROM customer c
LEFT JOIN purchase p ON p.customer_id=c.id GROUP BY c.id ORDER BY c.id''').fetchall()
assert rows == [(1, 2), (2, 0)]
db.close()

النتيجة المحددة[(1,2),(2,0)] دون قاعدة قرص أو اتصال معد.

ضع شرط الفرع الاختياري بحده المقصود

عادة يضع تقرير جميع العملاء مع مشترياتهم المدفوعة شرط الدفع داخل شرط الربط. قد يسقط نقله إلى WHERE الأصول غير المطابقة لأن حقول فروعها null. ما زالت حدود المستأجر أو مجتمع التقرير الإلزامية تحتاج شروطاً مستقلة صريحة. ويختلف ترشيح المدخلات قبل التجميع عن ترشيح المجموعات المكتملة بـHAVING. اختبر انعدام الفروع وتعددها والصفات الفارغة وتكرار المبالغ؛ فقد تجعل عينة مريحة متطابقة بالكامل استعلاماً خاطئاً يبدو صحيحاً. تسبق هذه الأمثلة المضادة تحسين الأداء في تدفق الإنتاج.

أظهر تضاعف اثنين في ثلاثة صراحة

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

python مثال مضاد محلي للتعددية
from itertools import product

lines = [10, 15]
payments = [5, 8, 12]
joined = list(product(lines, payments))
assert len(joined) == 6
assert sum(line for line, payment in joined) == 75
assert sum(payment for line, payment in joined) == 50
assert sum(lines) == sum(payments) == 25

تكرر الستة البند ثلاثاً والدفعة مرتين ويحفظ المستقل المعنى.

تحقق من المفتاح والمجتمع والمقياس معاً

يقارن فحص تحويل مفيد تغطية المفاتيح المتوقعة والتفرد ومعالجة null والعلاقات بين المجاميع. قد يخفي تساوي الأعداد مفتاحاً مفقوداً وآخر مكرراً، وقد تخفي المجاميع المتساوية أخطاء متعاكسة. احفظ فترة المصدر وإصداره مع دليل المصالحة. SQLite هنا محرك علاقي تعليمي؛ وتحتاج SQL المستودع وترتيب null وصياغة merge وسلوك المحسن أدلتها الخاصة. لا تجعل نجاح مثال بمحرك واحد إثباتاً لصحة استعلام إنتاج غير مختبر أو أدائه عند حجم مختلف.

الأخطاء الشائعة وإصلاحها

تكبر المجاميع بعد فرع آخر

لماذا يحدث؟
تضاعفت علاقتان متعددتان.
كيف تصلحه؟
جمع كل فرع بالمستوى المشترك.
كيف تتجنب تكراره؟
استخدم مثال اثنين في ثلاثة.

تختفي أصول بلا شراء

لماذا يحدث؟
رفض WHERE صفوف الفرع الفارغة.
كيف تصلحه؟
ضع الاختياري بحد الربط الصحيح.
كيف تتجنب تكراره؟
اختبر الأصل غير المطابق.

يعد تساوي العدد إثبات تطابق

لماذا يحدث؟
لم تقارن الهوية والعلاقات.
كيف تصلحه؟
صالح المفتاح والمقياس والعدد.
كيف تتجنب تكراره؟
ضمّن مفقوداً ومكرراً متعادلين.

اختبر فهمك

1. يحتوي خرجان مئة صف. ما غير المثبت؟

اعرض الحل المشروح

قد تختلف المفاتيح والتكرارات وnull والقيم رغم تساوي العدد. قارن المجتمع المتوقع والعلاقات عند مستوى المفتاح، ثم المجاميع ذات المعنى عند المستوى المعلن. تساوي أعداد الصفوف إشارة مفيدة، لكنه لا يثبت وحده تكافؤ التحويل كله أو تغطية المصدر.

2. لشحنة بندان وثلاث دفعات. لماذا لا يصلح SUM(DISTINCT amount) التضخم بأمان؟

اعرض الحل المشروح

قد تحمل أحداث صحيحة مستقلة مبالغ متساوية، فتسقط DISTINCT قيمة تجارية حقيقية وهي تخفي خطأ ربط. جمع حقائق البنود والدفعات مستقلة حسب الشحنة أولاً، ثم اربط الملخصات وتحقق من معناها. تحدد الهوية ومستوى الصف الحقائق المتميزة، لا مصادفة المبلغ.

أهم ما تعلمته

  • يحدد مستوى الربط صلاحية المقياس.
  • صالح الهوية والقيمة لا العدد فقط.

المراجع الرسمية