MySQL / الأسس العلائقية و SQL الدقيقة / الدرس 6
الأنواع والتطبيع وتطوير المخطط
اختر تمثيلات تحفظ المعنى وخطط لتغييرات المخطط دون اعتبار DDL كتابة عادية داخل معاملة.
في هذه الصفحة
أهداف الدرس
- اختر الأرقام الدقيقة والنصوص والأنواع الزمنية عن قصد.
- افهم موازنات التطبيع وخطوات الترحيل المتوافقة.
مثّل المجال بدقة
تفصل بيانات المتجر العملاء والطلبات والمنتجات والبنود لاختلاف هوياتها ودورات حياتها. يسبب تكرار البريد في كل طلب شذوذ تحديث؛ فتغيير عنوان واحد يتطلب كتابات كثيرة. يضع التطبيع كل حقيقة مستقلة مع مفتاحها. أما اللقطة التاريخية، مثل عنوان الشحن وقت الطلب، فحقيقة أخرى يصح حفظها مع الطلب.
الأرقام الدقيقة والتقريبية
استخدم DECIMAL للأموال ذات المقياس الثابت؛ فـ FLOAT و DOUBLE تقريبيان وقد يربكان اختبارات المساواة. تمثل الدقة كل الأرقام ويمثل المقياس الكسور؛ لذا يسمح DECIMAL(10,2) بثماني خانات صحيحة واثنتين عشريتين. اختر مدى الأعداد بناءً على النمو المتوقع، وراع تطابق الإشارة بين المفتاح الخارجي الصحيح والعمود المرجعي.
SELECT CAST(0.10 AS DECIMAL(10,2))
+ CAST(0.20 AS DECIMAL(10,2)) AS amount;
SELECT CAST(123.456 AS DECIMAL(6,2)) AS rounded;
amount
0.30
rounded
123.46
يعيد التعبير الأول 0.30 بدقة باستخدام قيم عشرية. ويعيد الثاني 123.46 موضحاً أن المقياس قد يقرب القيمة. تحقق من سياسة التقريب التجارية قبل التخزين بدلاً من افتراض رفض كل منزلة زائدة.
مساواة النص سياسة محددة
حد VARCHAR حد للمحارف؛ وتظل البايتات وحدود الفهرسة مسألتين منفصلتين. استخدم utf8mb4 ليشمل العربية ومحارف Unicode الإضافية. تحدد collation المقارنة والترتيب وحساسية الحالة واللهجات. لذلك يتبع تفرد البريد مقارنة العمود وليس قاعدة عالمية لهوية البريد. حدد التسوية في التطبيق واختر مقارنة متوافقة في القاعدة.
الزمن والقيم المفقودة
يمثل DATE تاريخاً تقويمياً و DATETIME تاريخاً ووقتاً معطيين، ويحوّل TIMESTAMP عبر منطقة الجلسة عند التخزين والاسترجاع. اختر اصطلاح UTC للحظات الزمنية ووثقه واحفظ المنطقة التجارية منفصلة إذا كان التفسير التقويمي مهماً. تفيد NULL حين تكون المعلومة المجهولة أو غير المنطبقة حالة صحيحة. ولا تمنع NOT NULL النص الفارغ أو الصفر.
SELECT DATE('2026-01-10 10:00:00') AS order_day;
SELECT COUNT(*) AS customers, COUNT(city) AS known_cities
FROM customers;
order_day
2026-01-10
customers | known_cities
3 | 2
تستخرج DATE القيمة 2026-01-10. ويعيد الاستعلام ثلاثة عملاء ومدينتين معروفتين فقط. يؤدي تخزين سلسلة فارغة لـ Noor إلى زيادة COUNT(city) دون إضافة معلومة جغرافية، فيغيّر معنى التقارير.
طوّر المخطط على مراحل متوافقة
لخاصية مطلوبة جديدة أضف أولاً عموداً قابلاً لـ NULL وانشر شيفرة تقرأ الصفوف القديمة والجديدة، ثم عبئه بدفعات محدودة وتحقق من اكتماله قبل فرض NOT NULL. قيّم أقفال البيانات الوصفية والحجم وخوارزمية ALTER المدعومة قبل الإنتاج. تحسن DDL الذرية التعافي من الأعطال للعمليات المدعومة، لكنها لا تجعل CREATE TABLE أو ALTER TABLE قابلتين للإلغاء بمعاملة التطبيق.
الأخطاء الشائعة وإصلاحها
ERROR 1264 (22003): Out of range value.
- لماذا يحدث؟
- تجاوزت كتابة في الوضع الصارم مدى النوع الرقمي.
- كيف تصلحه؟
- صحح القيمة أو نفذ توسيعاً مدروساً للنوع.
- كيف تتجنب تكراره؟
- قدّر حدود المجال المستقبلية وافحص الأطراف قبل النشر.
ERROR 1406 (22001): Data too long.
- لماذا يحدث؟
- تجاوز المدخل حد محارف VARCHAR في الوضع الصارم.
- كيف تصلحه؟
- ارفض القيمة أو وسع المجال عن قصد ولا تبتر الأسماء بصمت.
- كيف تتجنب تكراره؟
- طابق تحقق التطبيق مع حدود محارف القاعدة.
يبقى تغيير المخطط بعد ROLLBACK.
- لماذا يحدث؟
- سببت DDL تثبيتاً ضمنياً وليست DML عادية قابلة للتراجع.
- كيف تصلحه؟
- استخدم ترحيلاً عكسياً مدروساً أو استراتيجية استعادة.
- كيف تتجنب تكراره؟
- راجع سلوك تثبيت DDL وأقفالها قبل التدريب.
اختبر فهمك
1. اختر تمثيل سعر المنتج واسم العميل والمدينة المجهولة.
اعرض الحل المشروح
استخدم في بياناتنا DECIMAL(10,2) و VARCHAR(80) مع utf8mb4 ومدينة VARCHAR(40) قابلة لـ NULL. تحفظ الخيارات أجزاء العملة الدقيقة وأسماء Unicode وتميز غياب المدينة. وهي قرارات خاصة بالمجال وليست مقاسات عامة لكل متجر.
2. اشرح لماذا لا يُستبدل unit_price في البند بربط سعر الكتالوج الحالي.
اعرض الحل المشروح
سيغيّر تحديث الكتالوج القيمة الظاهرية للمبيعات القديمة. يعتمد سعر البند التاريخي على اتفاق الشراء، ويصف products.price العرض الحالي. يصح الاحتفاظ بكليهما لأنهما حقيقتان زمنيتان مختلفتان؛ ولا تقارنهما إلا عندما يسأل التقرير عن تغير الأسعار.
أهم ما تعلمته
- اختر الأنواع من معنى المجال وسلوك الحدود.
- طبّع الحقائق المستقلة واحفظ اللقطات التاريخية المقصودة.