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 موجودة:
- إعادة تسمية البنية المتداخلة نفسها بالكامل (على سبيل المثال، من
GoalsإلىConversions). - نقل عمود فرعي إلى بنية متداخلة أخرى (على سبيل المثال، من
Goals.IDإلىOtherNested.ID). - نقل عمود فرعي إلى خارج بنية متداخلة أو إلى داخلها (على سبيل المثال، من
Goals.IDإلىGoalIDأو العكس).