MySQL / التزامن والأداء والتشغيل / الدرس 15
JSON وحدود النموذج العلائقي
استخدم الوثائق المرنة في موضعها واحفظ الهويات والعلاقات ومسارات الاستعلام بأنواع صريحة.
في هذه الصفحة
أهداف الدرس
- ميّز قيم JSON و SQL و JSON null والمسارات المفقودة.
- حوّل المصفوفات بـ JSON_TABLE وخطط لفهرسة قيم قياسية ذات نوع.
الخصائص المرنة ليست مخططاً كاملاً
تبقى هوية المنتج وسعره ومخزونه أعمدة علائقية ذات أنواع. وقد تلائم خصائص اختيارية كاللون والتغليف وثيقة JSON. لكن وضع أرقام العملاء وبنود الطلب في وثائق غامضة يضعف المفاتيح الخارجية ويعقد الربط. تنقل المرونة مسؤولية التحقق ولا تلغي الحاجة إلى مواصفات موثقة.
يستخدم MySQL نوع JSON أصلياً
يتحقق MySQL8.4 من JSON ويخزنه بتمثيل ثنائي داخلي. النص والعدد والمنطق والكائن والمصفوفة و null أنواع مختلفة، وتبقى SQL NULL مختلفة أيضاً. يختلف تمثيل JSON في MariaDB فلا تفترض تطابق التخزين أوالفهرسة. تستخدم الأمثلة التالية قيماً حرفية مستقلة ولا تغير مخطط المتجر.
WITH sample AS (
SELECT CAST('{"color":"blue","note":null}' AS JSON) AS doc
)
SELECT JSON_EXTRACT(doc,'$.color') AS json_color,
JSON_UNQUOTE(JSON_EXTRACT(doc,'$.color')) AS sql_color,
JSON_CONTAINS_PATH(doc,'one','$.note') AS has_note,
JSON_CONTAINS_PATH(doc,'one','$.missing') AS has_missing
FROM sample;
json_color | sql_color | has_note | has_missing
"blue" | blue | 1 | 0
اللون المستخرج نص JSON هو "blue" ويعطي فك الاقتباس نص SQL blue. يوجد مفتاح note رغم أن قيمته JSON null، لذا has_note يساوي 1 و has_missing للمفقود يساوي 0. يختلف فحص IS NULL لاستخراج غائب عن اختبار وجود المسار.
حوّل المصفوفات إلى صفوف ذات نوع
تحول JSON_TABLE الوثيقة إلى صفوف بأعمدة ومسارات وأنواع صريحة. تحفظ FOR ORDINALITY موضع العنصر بدءاً من 1. حدد سلوك الحقول المفقودة وأخطاء التحويل بـ ON EMPTY و ON ERROR. قد تجعل البدائل الصامتة البيانات المشوهة سليمة ظاهرياً، فتفضل إجراءات الاستيراد الصارمة ERROR ON ERROR عند الملاءمة. اختبر السياسة بمدخلات مشوهة.
SELECT j.position,j.product_id,j.quantity
FROM JSON_TABLE(
'[{"product_id":1,"quantity":2},{"product_id":2,"quantity":2}]',
'$[*]' COLUMNS (
position FOR ORDINALITY,
product_id INT PATH '$.product_id' ERROR ON EMPTY ERROR ON ERROR,
quantity INT PATH '$.quantity' ERROR ON EMPTY ERROR ON ERROR
)) AS j ORDER BY j.position;
position | product_id | quantity
1 | 1 | 2
2 | 2 | 2
تضم النتيجة الموضعين 1 و 2 بالمنتجين 1 و 2 وكمية 2 لكل منهما. لا يثبت الإسقاط وجود المنتجات أوكفاية المخزون. يجب التحقق من الكميات الموجبة والمفاتيح وحماية المخزون وإدراج البنود العلائقية داخل معاملة.
افهرس قيمة قياسية محددة النوع
لا يمثل عمود JSON مباشرة مفتاح B-tree قياسياً تقليدياً. يستخرج تصميم شائع قيمة إلى عمود مولّد بنوع SQL صريح ويفهرسه. يحدد توافق التعبير والمقارنة والتحويل إمكان استخدام الفهرس. توجد فهارس متعددة القيم لحالات مصفوفات مدعومة لكنها مقيدة، ولا تعوض جداول البنود والمفاتيح الخارجية.
رقّم مواصفات الوثيقة
حدد المفاتيح المطلوبة والأرقام مقابل النصوص وعمق التداخل ومعنى الغياب مقابل null الصريح. تحدّث JSON_SET مسارات مختارة، لكن التحديث الجزئي تحسين مشروط لا ضمان عام. قس التخزين والسجلات ولا تفترض أن كل تعديل صغير رخيص. احفظ التوافق عندما تظل تطبيقات قديمة ترسل أشكالاً سابقة.
الأخطاء الشائعة وإصلاحها
ERROR 3140 (22032): Invalid JSON text.
- لماذا يحدث؟
- تستخدم الوثيقة صياغة مشوهة مثل مفاتيح JSON باقتباس مفرد.
- كيف تصلحه؟
- استخدم مكتبة JSON فعلية وارفض المدخل غير الصحيح قبل الحفظ.
- كيف تتجنب تكراره؟
- اختبر الهروب و Unicode والتداخل عبر أداة التسلسل.
خلط مفتاح مفقود مع JSON null صريح.
- لماذا يحدث؟
- استُخدم الاستخراج دون فحص الوجود والنوع.
- كيف تصلحه؟
- استخدم JSON_CONTAINS_PATH وافحص JSON_TYPE عندما يهم الفرق.
- كيف تتجنب تكراره؟
- وثق null والغياب منفصلين في مواصفات الواجهة.
يتجاهل بحث JSON الفهرس القياسي المقصود.
- لماذا يحدث؟
- يختلف تعبير الاستعلام أونوعه عن التعبير المولّد المفهرس.
- كيف تصلحه؟
- طابق الاستخراج المحدد النوع وافحص EXPLAIN ببيانات ممثلة.
- كيف تتجنب تكراره؟
- راجع تعريف الأعمدة المولدة وتعبيرات الاستعلام معاً.
اختبر فهمك
1. هل تثبت has_note = 1 أن note نص مفيد؟
اعرض الحل المشروح
لا؛ المفتاح موجود ويحمل JSON null. الوجود والنوع وصحة المجال فحوص منفصلة. اشترط نص JSON ثم تحقق منه إذا كانت الملاحظة مطلوبة، ولا تستبدلها بسلسلة فارغة تمحو الفرق.
2. لماذا لا تُدرج نتيجة JSON_TABLE كبنود موثوقة مباشرة؟
اعرض الحل المشروح
يسند الإسقاط الأنواع والمسارات فقط، ولا يخول العميل أويضمن موجب الكمية أووجود المنتج أوحجز المخزون. طبق الفحوص داخل الشراء واستخرج أسعاراً موثوقة من سياسة العمل وأبق القيود العلائقية عند الإدراج.
أهم ما تعلمته
- تحتاج مرونة JSON إلى مواصفات ذات أنواع وإصدارات.
- احفظ الثوابت العلائقية وافحص الفهرسة القياسية صراحة.