الانتقال إلى المحتوى الرئيسي
تشبه بنية بيانات متداخلة جدولًا داخل خلية. وتُحدَّد معلمات بنية بيانات متداخلة — أي أسماء الأعمدة وأنواعها — بالطريقة نفسها كما في استعلام CREATE TABLE. ويمكن أن يقابل كل صف في الجدول أي عدد من الصفوف في بنية بيانات متداخلة.
تجنّب استخدام النقاط في أسماء الأعمدةيمكن تفسير أسماء الأعمدة التي تحتوي على نقاط، والأعمدة التي تشترك في بادئة منتهية بنقطة، والأعمدة من النوع Array، كلٌّ منها على أنه جزء من بنية Nested مُسطَّحة عندما تكون flatten_nested = 1 (وهو الإعداد الافتراضي). وقد يؤدي ذلك إلى عمليات تحقق غير متوقعة من طول المصفوفات عند الإدراج، وإلى فرض قيود على إعادة التسمية.تجنّب استخدام النقاط في أسماء الأعمدة إن أمكن. استخدم الشرطة السفلية (_) أو أي فاصل آخر بدلًا من النقاط في أسماء الأعمدة، ما لم تكن تحتاج عمدًا إلى دلالات Nested.
مثال:
تُعرّف عبارة DDL ‏CREATE TABLE أعلاه بنية بيانات متداخلة Goals، التي تتضمن بيانات عن التحويلات أو الأهداف التي تم تحقيقها. ويرتبط كل صف في جدول ‘visits’ بصفر أو أكثر من عمليات التحويل. عند ضبط الإعداد flatten_nested على 0 (في حين أن القيمة الافتراضية هي flatten_nested=1)، يكون دعم مستويات تداخل عشوائية متاحاً. في معظم الحالات، عند العمل مع بنية بيانات متداخلة، تُحدَّد أعمدتها باستخدام أسماء أعمدة يفصل بينها نقطة. وتشكّل هذه الأعمدة مصفوفة من الأنواع المتطابقة. ولجميع مصفوفات الأعمدة ضمن بنية بيانات متداخلة واحدة الطول نفسه. على سبيل المثال:
من الأسهل تصور بنية بيانات متداخلة على أنها مجموعة من عدة مصفوفات أعمدة ذات الطول نفسه.

تصفية أعمدة Nested في WHERE

نظرًا إلى أن كل عمود في بنية Nested يُخزَّن على هيئة Array، فإن الإشارة إليه في بند WHERE تعيد لك المصفوفة كاملةً لكل صف، لا عنصرًا منفردًا. ولا يمكنك مقارنة عمود متداخل مباشرةً بقيمة مفردة، لذا يجب استخدام دوال المصفوفات بدلًا من ذلك. على سبيل المثال، هذا الاستعلام لا يعيد أي صفوف بصمت، بل يثير استثناءً، لأن Goals.ID من النوع Array(UInt32)، وequals(Array(UInt32), UInt32) ليست مقارنة صالحة:
استخدم has للتحقّق مما إذا كانت المصفوفة تحتوي على قيمة معيّنة:
استخدم arrayExists عندما يكون الشرط أكثر تعقيدًا:
يمكنك التصفية حسب طول المصفوفات باستخدام length أو استبعاد المصفوفات الفارغة باستخدام notEmpty:
للتصفية حسب العناصر الفردية داخل بنية متداخلة بدلًا من الصفوف بأكملها، استخدم ARRAY JOIN لفرد المصفوفات أولًا. بعد ARRAY JOIN، يصبح كل عنصر صفًا منفصلًا، لذا يُطبَّق بند WHERE على القيم المفردة. لمزيد من المعلومات، راجع بند ARRAY JOIN. مثال:
لا يمكنك تنفيذ SELECT على بنية بيانات متداخلة كاملة. يمكنك فقط تحديد الأعمدة الفردية التي تكون جزءًا منها صراحةً.

إدراج البيانات

في استعلام INSERT، يجب تمرير جميع مصفوفات الأعمدة المكوِّنة لبنية بيانات متداخلة كلٌّ منها على حدة (كما لو كانت مصفوفات أعمدة مستقلة). أثناء الإدراج، يتحقق النظام من تساوي أطوالها. يُدرج كل عمود فرعي متداخل في قائمة الأعمدة باستخدام ترميز النقطة (Goals.ID, Goals.Serial, …)، وتكون القيم المقابلة مصفوفات:
يجب أن تكون جميع مصفوفات الأعمدة الفرعية المتداخلة ضمن صف واحد بالطول نفسه. ويؤدي اختلاف الأطوال إلى حدوث خطأ:
في استعلام DESCRIBE، تُدرَج الأعمدة في بنية بيانات متداخلة بشكل منفصل وبالطريقة نفسها.

قيود ALTER

تخضع استعلامات ALTER على بُنى البيانات المتداخلة للقيود التالية: تعمل إضافة الأعمدة الفرعية بشكل طبيعي. يمكنك إضافة عمود فرعي جديد إلى بنية Nested موجودة:
حذف الأعمدة الفرعية ينطبق على الأعمدة الفرعية الفردية:
تعديل النوع لعمود فرعي ممكن ويؤدي إلى mutation (إعادة كتابة البيانات):
إعادة التسمية تخضع لبعض القيود. يمكنك إعادة تسمية عمود فرعي داخل البنية المتداخلة نفسها:
ومع ذلك، لا يمكنك:
  • إعادة تسمية البنية المتداخلة نفسها بالكامل (على سبيل المثال، من Goals إلى Conversions).
  • نقل عمود فرعي إلى بنية متداخلة أخرى (على سبيل المثال، من Goals.ID إلى OtherNested.ID).
  • نقل عمود فرعي إلى خارج بنية متداخلة أو إلى داخلها (على سبيل المثال، من Goals.ID إلى GoalID أو العكس).
آخر تعديل في ٢ يوليو ٢٠٢٦