نمذجة البيانات والتخزين

أساسيات النمذجة البعدية

4 دقيقة للقراءة

النمذجة البعدية هي العمود الفقري لتصميم مستودع البيانات. أسئلة المقابلات تختبر بشكل متكرر فهمك للمخططات النجمية ومخططات ندفة الثلج وأفضل ممارسات النمذجة.

المخطط النجمي

نهج النمذجة البعدية الأكثر شيوعاً لأعباء العمل التحليلية.

الهيكل

              ┌─────────────┐
              │  dim_date   │
              └──────┬──────┘
┌─────────────┐      │      ┌─────────────┐
│dim_customer ├──────┼──────┤dim_product  │
└─────────────┘      │      └─────────────┘
              ┌──────┴──────┐
              │ fact_sales  │
              └──────┬──────┘
              ┌──────┴──────┐
              │ dim_store   │
              └─────────────┘

المكونات

المكون الغرض مثال
جدول الحقائق المقاييس/القياسات fact_sales (الكمية، الإيرادات، التكلفة)
جدول البُعد السياق/السمات dim_customer (الاسم، البريد، الشريحة)
المفاتيح الخارجية يربط الحقائق بالأبعاد customer_id, product_id
المفاتيح البديلة معرفات مستقرة أعداد صحيحة تزايد تلقائي

مثال المخطط النجمي

-- جدول الحقائق
CREATE TABLE fact_sales (
    sale_id BIGINT PRIMARY KEY,
    date_key INT REFERENCES dim_date(date_key),
    customer_key INT REFERENCES dim_customer(customer_key),
    product_key INT REFERENCES dim_product(product_key),
    store_key INT REFERENCES dim_store(store_key),
    quantity INT,
    unit_price DECIMAL(10,2),
    total_amount DECIMAL(12,2),
    discount_amount DECIMAL(10,2)
);

-- جدول البُعد
CREATE TABLE dim_customer (
    customer_key INT PRIMARY KEY,  -- مفتاح بديل
    customer_id VARCHAR(50),       -- مفتاح طبيعي/أعمال
    customer_name VARCHAR(100),
    email VARCHAR(100),
    segment VARCHAR(50),
    region VARCHAR(50),
    created_date DATE
);

مخطط ندفة الثلج

جداول أبعاد مطبعة—يقلل التكرار لكن يزيد تعقيد الاستعلام.

الهيكل

              ┌─────────────┐
              │  dim_date   │
              └──────┬──────┘
┌─────────────┐      │      ┌─────────────┐
│dim_customer ├──────┼──────┤dim_product  │
└──────┬──────┘      │      └──────┬──────┘
       │             │             │
┌──────┴──────┐┌─────┴─────┐┌──────┴──────┐
│dim_geography││fact_sales ││dim_category │
└─────────────┘└───────────┘└─────────────┘

متى تستخدم كل منهما

الجانب المخطط النجمي مخطط ندفة الثلج
أداء الاستعلام أسرع (ربط أقل) أبطأ (ربط أكثر)
التخزين أكثر (غير مطبع) أقل (مطبع)
الصيانة أسهل أكثر تعقيداً
تعقيد ETL أقل أعلى
الأفضل لـ التحليلات، أدوات BI قيود التخزين، OLTP هجين

إجابة المقابلة: "أفضل المخططات النجمية للتحليلات لأنها تقلل الربط ومحسنة لأنماط أدوات BI. سأفكر في ندفة الثلج فقط عندما تكون جداول الأبعاد كبيرة جداً مع تكرار عالي."

أنواع جداول الحقائق

حقائق المعاملات

تسجل الأحداث الفردية على أدق مستوى.

-- كل صف = معاملة واحدة
CREATE TABLE fact_order_line (
    order_line_id BIGINT,
    order_id BIGINT,
    date_key INT,
    product_key INT,
    quantity INT,
    unit_price DECIMAL(10,2)
);

حقائق اللقطة الدورية

تلتقط الحالة على فترات منتظمة.

-- كل صف = حالة الحساب في نهاية الشهر
CREATE TABLE fact_account_monthly_snapshot (
    snapshot_date_key INT,
    account_key INT,
    balance DECIMAL(15,2),
    transactions_count INT,
    average_balance DECIMAL(15,2)
);

حقائق اللقطة التراكمية

تتبع تقدم سير العمل مع تواريخ متعددة.

-- كل صف = دورة حياة الطلب
CREATE TABLE fact_order_fulfillment (
    order_key INT,
    order_date_key INT,
    ship_date_key INT,
    delivery_date_key INT,
    return_date_key INT,
    order_amount DECIMAL(12,2),
    days_to_ship INT,
    days_to_deliver INT
);

أنماط تصميم الأبعاد

الأبعاد متعددة الأدوار

نفس البُعد يُستخدم مرات متعددة في جدول الحقائق.

-- بُعد التاريخ يُستخدم لسياقات تاريخ متعددة
SELECT
    f.order_id,
    order_date.full_date as order_date,
    ship_date.full_date as ship_date,
    delivery_date.full_date as delivery_date
FROM fact_orders f
JOIN dim_date order_date ON f.order_date_key = order_date.date_key
JOIN dim_date ship_date ON f.ship_date_key = ship_date.date_key
JOIN dim_date delivery_date ON f.delivery_date_key = delivery_date.date_key;

أبعاد الخردة

تجمع العلامات منخفضة العددية في بُعد واحد.

-- بدلاً من أعمدة علامات متعددة في جدول الحقائق
CREATE TABLE dim_order_flags (
    flag_key INT PRIMARY KEY,
    is_rush_order BOOLEAN,
    is_gift BOOLEAN,
    is_online BOOLEAN,
    payment_method VARCHAR(20)
);

-- جدول الحقائق يشير إلى مفتاح واحد
CREATE TABLE fact_orders (
    order_key BIGINT,
    flag_key INT REFERENCES dim_order_flags(flag_key),
    ...
);

الأبعاد المنحطة

سمات البُعد مخزنة مباشرة في جدول الحقائق (لا بُعد منفصل).

-- order_number هو بُعد منحط
CREATE TABLE fact_order_line (
    order_line_key BIGINT,
    order_number VARCHAR(20),  -- بُعد منحط
    product_key INT,
    quantity INT,
    ...
);

أسئلة تصميم المقابلة

السؤال: "صمم نموذج بيانات لمنصة تجارة إلكترونية"

هيكل الإجابة:

  1. حدد العمليات التجارية: الطلبات، المخزون، المرتجعات، تفاعلات العملاء

  2. حدد الحبيبة: صف واحد = عنصر خط طلب واحد

  3. حدد الأبعاد:

    • dim_customer (سمات العميل، الشريحة)
    • dim_product (سمات المنتج، الفئة، العلامة التجارية)
    • dim_date (سمات التقويم)
    • dim_store/dim_channel (قناة المبيعات)
  4. حدد الحقائق/المقاييس:

    • quantity, unit_price, discount, tax
    • مشتق: net_amount, gross_amount
  5. اعتبر SCDs: تغييرات شريحة العميل، تغييرات سعر المنتج

نصيحة المقابلة: عندما تُطلب منك تصميم نموذج بيانات، ابدأ دائماً بتوضيح الحبيبة (ماذا يمثل صف واحد؟) قبل الغوص في الجداول.

بعد ذلك، سنستكشف هندسات المستودعات الحديثة ومقايضاتها. :::

اختبار

الوحدة 3: نمذجة البيانات والتخزين

خذ الاختبار