2.1 · العلاقات (Relationships) ونموذج البيانات (Data Model)

المستوى 2 · النموذج و DAX

2.1العلاقات (Relationships) ونموذج البيانات (Data Model)

الهدف: إنشاء العلاقات (Relationships) والتحقق منها في عرض النموذج (Model View)، وتمييز عَرَض العلاقة المفقودة مدى الحياة.
الوقت المقدّر: 18 دقيقة · قراءة ذاتية · إذا كان لديك 5 دقائق فقط: اقرأ «الأساسي في 30 ثانية» + المخطط.

الأساسي في 30 ثانية

  • العلاقات تربط جدولين على عمود مشترك (المنتجات[الرمز] ↔ المبيعات[رمز_المنتج]): فينشر النموذج المرشحات، دون أي صيغة.
  • العلاقة الطبيعية: واحد-إلى-متعدد (1 ← *)، من المرجع (جانب «1») نحو الحقائق (جانب «*»)؛ واتجاه التصفية الأحادي هو المعيار السليم.
  • التشخيص رقم 1: إجماليات متطابقة في كل سطور مرئي = علاقة مفقودة أو معطلة — نتحقق دائمًا من العلاقات المكتشفة تلقائيًا.

حالة مصغّرة متسلسلة — زينب تربط مبيعاتها بمرجع المنتجات

تريد زينب، مراقبة التسيير في شركة صغيرة للصناعة الغذائية بالجزائر، أن تقاطع مبيعاتها حسب فئة المنتج، لكن جدولي المبيعات والمنتجات يعيش كل منهما من جهته. فتطبق الدرس: في عرض النموذج (Model View)، تسحب المبيعات[رمز_المنتج] على المنتجات[الرمز] — فيظهر الخط — وتقرأ العلاقة 1:* واتجاه التصفية الأحادي، ثم تبرهن بمدرج تكراري الفئة × المبلغ أن الجدولين يتحاوران. ولرؤية العَرَض، تحذف العلاقة: فتصبح كل الإجماليات متطابقة في كل فئة. ثم تعيد إنشاءها فورًا وتحفظ التشخيص رقم 1 إلى الأبد.

حالة مستقلة لهذا القسم: تعود في الدرس والمخطط والنص البرمجي وتحدي 48 ساعة للقسم 2.1.

1. ربط الجداول

مستوى حاسم: النموذج (Model). تصل بياناتك الحقيقية في عدة جداول (مبيعات، ومنتجات، وعملاء) يربطها Power BI عبر العلاقات (Relationships): خط بين جدولين على عمود مشترك. وبمجرد إقامة العلاقة، يتقاطع مرئي «تسمية المنتج» مع «مبلغ المبيعات» دون أي صيغة — فالنموذج ينشر المرشحات. وهكذا تحل زينب محل صيغ RECHERCHEV / VLOOKUP القديمة: فينتقل المرشح من تلقاء نفسه من جدول إلى آخر.

2. العلاقة الأساسية والاتجاه

نقرأ العلاقة الأساسية (Cardinality) (واحد-إلى-متعدد في الغالبية العظمى من الحالات: منتج واحد ↔ عدة مبيعات) واتجاه التصفية (Filter Direction) (من جانب «1» نحو جانب «*»). والاتجاه الأحادي هو المعيار السليم؛ والثنائي الاتجاه يخلق غموضًا وبطئًا. ويجب دائمًا التحقق من العلاقات المكتشفة تلقائيًا عند الاستيراد في عرض النموذج (Model View). وتنقر زينب نقرة مزدوجة على الخط لتقرأ 1:* و«أحادي» قبل أن تستنتج.

3. التشخيص رقم 1

العَرَض الكلاسيكي لعلاقة مفقودة أو معطلة: إجماليات متطابقة في كل السطور في مرئي — فتعرض كل فئة الإجمالي نفسه. ويُعرف ذلك إلى الأبد. وسبب آخر لفشل علاقة 1:* من جانب «1»: تكرارات أو قيم فارغة في عمود المفتاح، لأن البُعد له سطر واحد لكل عنصر. وتصحح زينب ذلك في Power Query (إزالة التكرارات، وترشيح القيم الفارغة).

خطأ شائع في الفهم: «العلاقة اختيارية: مرئياتي تعمل رغم ذلك، والاتجاه الثنائي أكثر عملية، ومفتاحي يمكن أن يحتوي تكرارات». لا، ثلاثة أخطاء. بدون علاقة لا يتحاور الجدولان: فتتكرر الإجماليات في كل السطور — وهذا هو التشخيص رقم 1. والاتجاه الثنائي لا يكاد يُحتاج إليه أبدًا ويخلق غموضًا وبطئًا: فالمنعكس هو الاتجاه الأحادي (1 ← *). وعمود المفتاح في جانب البُعد يجب أن يكون فريدًا، دون تكرار أو فراغ، وإلا رُفضت العلاقة 1:*.
علاقة واحدة، قناة المرشحات ينتقل المرشح من البُعد (جانب 1) نحو الحقائق (جانب *). البُعد (Dimension) (جانب 1)المنتجات[الرمز] — سطر واحد لكل منتج+الحقائق (Facts) (جانب *)المبيعات[رمز_المنتج] — عدة سطور+اتجاه التصفية (Filter Direction)1 ← * (أحادي، المعيار السليم) إجماليات متطابقة في كل مكان = علاقة مفقودة (التشخيص رقم 1).
ينتقل المرشح من البُعد (جانب 1) نحو الحقائق (جانب *).
نص المخطط (SEO / قارئات الشاشة / الترجمة): 1) تربط زينب، مراقبة التسيير بالجزائر، مبيعاتها بمرجع منتجاتها: في عرض النموذج (Model View)، تسحب المبيعات[رمز_المنتج] على المنتجات[الرمز] فيظهر الخط — وينشر النموذج المرشحات، دون صيغة. 2) وتقرأ العلاقة (1:* — منتج واحد، وعدة مبيعات) واتجاه التصفية الأحادي، من جانب «1» نحو جانب «*»، وتتحقق دائمًا من العلاقات المكتشفة تلقائيًا. 3) وتتعلم التشخيص رقم 1: إجماليات متطابقة في كل سطور مرئي تدل على علاقة مفقودة أو معطلة — وغالبًا مفتاح به تكرارات أو فراغات في جانب البُعد. الدرس: ربط الجداول يحل محل RECHERCHEV، ونحافظ على الاتجاه الأحادي، ونتحقق من المفتاح في جانب البُعد.

🔎 مثال ملموس — 🔎 مثال ملموس — المبيعات ↔ المنتجات

تقاطع زينب الفئة والمبلغ، وهما جدولان مرتبطان:

العلاقة: المبيعات[رمز_المنتج] ← المنتجات[الرمز]  (1:*)
← مرئي الفئة (من المنتجات) × المبلغ (من المبيعات)
   يتحاور الجدولان، دون أي صيغة.
حذف العلاقة ← إجماليات متطابقة في كل مكان (العَرَض).

القراءة: العلاقة 1:* يحملها المفتاح الفريد في جانب البُعد (المنتجات[الرمز]).

الدرس: حذف العلاقة يُظهر إجماليات متطابقة — وهو منعكس التشخيص الذي يجب تمييزه.

مفردات القسم

العلاقة (Relationship)
الرابط بين جدولين على عمود مشترك (المنتجات[الرمز] ↔ المبيعات[رمز_المنتج]): القناة التي تعبرها المرشحات.

مثال بسيط: تربط زينب المبيعات والمنتجات لتقاطع الفئة والمبلغ.

ما ليس كذلك: جدولان موضوعان جنبًا إلى جنب، دون خط بينهما.

رد فعل: جدولان يجب تقاطعهما ← علاقة على عمود المفتاح.

العلاقة واحد-إلى-متعدد (1:*)
الحالة المعيارية: منتج واحد من المرجع ↔ عدة سطور مبيعات.

مثال بسيط: تقرأ زينب 1:* على الخط بين المنتجات والمبيعات.

ما ليس كذلك: واحد-إلى-واحد أو متعدد-إلى-متعدد، محجوزان لحالات أخرى.

رد فعل: 1:* من جانب «1» (البُعد) نحو جانب «*» (الحقائق).

اتجاه التصفية (Filter Direction)
افتراضيًا، ينتقل المرشح من جانب «1» نحو جانب «*»: ترشيح منتج يرشح مبيعاته.

مثال بسيط: تحافظ زينب على الاتجاه الأحادي، دون غموض.

ما ليس كذلك: الاتجاه الثنائي، مصدر بطء وأخطاء.

رد فعل: اتجاه أحادي افتراضيًا؛ والثنائي = حالة خاصة جدًا.

الكشف التلقائي (Auto-Detect)
يخمّن Power BI بعض العلاقات عند الاستيراد: يجب التحقق منها منهجيًا.

مثال بسيط: تتحقق زينب من كل علاقة مكتشفة تلقائيًا في عرض النموذج (Model View).

ما ليس كذلك: علاقة مفترضة صحيحة دون تحقق.

رد فعل: علاقة مكتشفة تلقائيًا ← تحقق دائمًا من العلاقة والاتجاه.

عمود المفتاح (Key Column)
العمود المشترك الذي يحمل العلاقة: فريد في جانب البُعد، ومتكرر في جانب الحقائق.

مثال بسيط: تتأكد زينب من أن المنتجات[الرمز] فريد.

ما ليس كذلك: مفتاح به تكرارات أو فراغات يعطّل 1:*.

رد فعل: مفتاح فريد في جانب «1»: نظّف في Power Query عند الحاجة.

في التطبيق — تطبيق عملي — ربط المبيعات بمرجع المنتجات

  1. استورد جدولًا ثانيًا «المنتجات» (الرمز، والتسمية، والفئة، وسعر_الوحدة) — أنشئه في Excel عند الحاجة، مثل زينب.
  2. عرض النموذج (Model View): إذا لم ينشئ Power BI العلاقة، اسحب المبيعات[رمز_المنتج] على المنتجات[الرمز] — فيظهر الخط.
  3. انقر نقرًا مزدوجًا على الخط: اقرأ العلاقة (1:*) واتجاه التصفية (أحادي) — الإعداد السليم افتراضيًا.
  4. البرهان بالمرئي: أنشئ رسم أعمدة الفئة × المبلغ. احذف العلاقة لتَرى العَرَض (إجماليات متطابقة في كل مكان)، ثم أعد إنشاءها.
أول نموذج متعدد الجداول يعمل — وعَرَض العلاقة المفقودة معروف إلى الأبد.

نص برمجي خطوة بخطوة — الربط مثل زينب (5 دقائق)

1) استورد جدول المنتجات بجانب المبيعات. 2) في عرض النموذج (Model View)، اسحب المبيعات[رمز_المنتج] على المنتجات[الرمز]: فيظهر الخط. 3) انقر نقرًا مزدوجًا على الخط واقرأ العلاقة (1:*) والاتجاه (أحادي). 4) أنشئ رسم أعمدة الفئة × المبلغ وتحقق من أن الجدولين يتحاوران. 5) احذف العلاقة، ولاحظ الإجماليات المتطابقة في كل مكان، ثم أعد إنشاءها — فيترسخ التشخيص رقم 1.

إذا رفضت العلاقة 1:*، ابحث عن تكرارات أو فراغات في المفتاح في جانب البُعد ونظّفها في Power Query.

نموذج للنسخ واللصق — قائمة تحققي من العلاقة

العلاقة: المبيعات[رمز_المنتج] ← المنتجات[الرمز]  (1:*)
[ ] عمود المفتاح فريد في جانب البُعد (لا تكرار، لا فراغ)
[ ] العلاقة مقروءة: 1:*
[ ] اتجاه التصفية: أحادي (1 ← *)
[ ] العلاقة المكتشفة تلقائيًا متحقَّق منها في عرض النموذج (Model View)
التشخيص: إجماليات متطابقة في كل مكان ← علاقة مفقودة أو معطلة.

تقاطع الفئة والمبلغ

تربط زينب المبيعات والمنتجات: فيعمل مرئي الفئة × المبلغ دون صيغة.

استبدال RECHERCHEV

لم تعد زينب تكتب بحثًا: فالعلاقة تنشر تسمية المنتج من البُعد.

تشخيص إجمالي جامد

كل الإجماليات متطابقة حسب الفئة؟ تتحقق زينب فورًا من العلاقة في عرض النموذج (Model View).

تنظيف مفتاح

مفتاح به تكرارات يعطّل 1:*: تحذف زينب التكرارات في جانب البُعد في Power Query.

✓ ممارسات جيدة

  • ربط الجداول عبر عمود المفتاح (فريد في جانب البُعد).
  • الحفاظ على اتجاه تصفية أحادي (1 ← *): منعكس افتراضي.
  • التحقق من كل علاقة مكتشفة تلقائيًا في عرض النموذج (Model View).

✗ أخطاء شائعة

  • ترك علاقة مكتشفة تلقائيًا خاطئة دون تحقق.
  • التحول إلى الاتجاه الثنائي «حتى تعمل» (غموض، بطء).
  • مفتاح في جانب البُعد به تكرارات أو فراغات (يعطّل 1:*).

النقاط الأساسية

  • تحل العلاقات محل RECHERCHEV: ينشر النموذج المرشحات بين الجداول.
  • العلاقة الطبيعية: واحد-إلى-متعدد، من المرجع (1) نحو الحقائق (*).
  • تحقق دائمًا من العلاقات المكتشفة تلقائيًا في عرض النموذج (Model View).
  • إجماليات متطابقة في كل سطور مرئي = علاقة مفقودة أو معطلة: التشخيص رقم 1.

تحدي 48 ساعة — طبّقه غدًا

مثل زينب، اربط جدولين بعلاقة: اسحب مفتاح الحقائق على مفتاح البُعد في عرض النموذج (Model View)، واقرأ 1:* والاتجاه الأحادي، ثم أنشئ مرئيًا يقاطع الجدولين. احذف العلاقة وسجّل العَرَض (إجماليات متطابقة في كل مكان) قبل أن تعيد إنشاءها.

قائمة الخروج من القسم
  • أستطيع إنشاء علاقة بين جدولين عبر عمود مفتاحهما.
  • أقرأ العلاقة (1:*) واتجاه التصفية (أحادي) لعلاقة.
  • أميّز التشخيص رقم 1: إجماليات متطابقة = علاقة مفقودة.
تقييم ذاتي 1-5: هل أنشئ وأتحقق من علاقة دون تردد؟تقييم ذاتي 1-5: هل حاكيت عَرَض العلاقة المفقودة كي أميّزه؟

أسئلة شائعة

متى نستخدم علاقة ثنائية الاتجاه (Both Directions)؟

تكاد لا تُستخدم أبدًا: فهي تخلق غموضًا في الحساب وبطئًا، وتُكتشف بأخطاء يصعب تشخيصها. وتوجد حالات مشروعة (بعض الترشيح عبر بُعد مشترك بين جدولي حقائق)، لكنها تُعالج أولًا بمخطط نجمة سليم (2.2) أو، ظرفيًا، بدالة DAX هي CROSSFILTER. ويبقى المنعكس الافتراضي هو الاتجاه الأحادي.

علاقتي ترفض العلاقة 1:* : لماذا؟

لأن عمود المفتاح في جانب البُعد يحتوي تكرارات أو فراغات، مع أن البُعد له سطر واحد لكل عنصر. صحّح في Power Query: إزالة التكرارات على المفتاح، وترشيح القيم الفارغة. فمرجع نظيف (سطر فريد لكل عنصر) شرط نموذج موثوق.

تحقّق من فهمك

ماذا تعني «إجماليات متطابقة في كل السطور» في مرئي؟

موارد إضافية (اختياري، للتعمّق أكثر)

اختبار المستوى 2أسئلة جديدة وأصعب للتحقق من مكتسباتك