0Pricing
SQL Academy · درس

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

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

جداول الحقائق والأبعاد درس مجاني في SQL Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Academy 4 دروس في المجموع.

ما هو مستودع البيانات

مستودع البيانات هو مستودع مركزي مصمم لإعداد التقارير والاستعلامات التحليلية. وعلى خلاف قاعدة البيانات الخاصة بالمعاملات، التي تُحسَّن لعمليات الكتابة السريعة، يُهيَّأ المستودع لعمليات القراءة السريعة عبر كميات كبيرة من البيانات التاريخية.

الطريقة الأكثر شيوعاً لتنظيم المستودع هي استخدام مخطط النجمة، الذي يقسم البيانات إلى نوعين من الجداول: جداول الحقائق وجداول الأبعاد.

تعريف جداول الحقائق

يخزّن جدول الحقائق الأحداث الكمية القابلة للقياس — أي الأمور التي تريدون تحليلها. ويمثل كل صف وقوعاً واحداً لحدث تجاري، مثل عملية بيع أو مشاهدة صفحة ويب أو تذكرة دعم.

تكون جداول الحقائق عادةً كبيرة من حيث عدد الصفوف وقليلة الأعمدة، ويكون معظم أعمدتها إما مفاتيح خارجية تشير إلى جداول الأبعاد، وإما مقاييس رقمية مثل quantity أو revenue.

CREATE TABLE fact_sales (
  sale_id      SERIAL PRIMARY KEY,
  date_key     INT NOT NULL,
  product_key  INT NOT NULL,
  customer_key INT NOT NULL,
  store_key    INT NOT NULL,
  quantity     INT NOT NULL,
  unit_price   NUMERIC(10, 2) NOT NULL,
  total_amount NUMERIC(12, 2) NOT NULL
);

تعريف جداول الأبعاد

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

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

CREATE TABLE dim_product (
  product_key  SERIAL PRIMARY KEY,
  product_name VARCHAR(200) NOT NULL,
  category     VARCHAR(100),
  brand        VARCHAR(100),
  unit_cost    NUMERIC(10, 2)
);

CREATE TABLE dim_customer (
  customer_key SERIAL PRIMARY KEY,
  full_name    VARCHAR(200) NOT NULL,
  email        VARCHAR(200),
  country      VARCHAR(100),
  segment      VARCHAR(50)
);

بُعد التاريخ

يُعد بُعد التاريخ أكثر الأبعاد شيوعاً في أي مستودع. وبدلاً من تخزين قيمة TIMESTAMP خام في جدول الحقائق، تخزّنون مفتاحاً عددياً يشير إلى جدول تقويم مُنشأ مسبقاً.

يتيح ذلك للاستعلامات التصفية أو التجميع حسب الربع المالي أو يوم الأسبوع أو مؤشرات العطلات وغيرها من سمات التقويم، من دون إجراء حسابات للتواريخ وقت الاستعلام.

CREATE TABLE dim_date (
  date_key       INT PRIMARY KEY,  -- e.g. 20240315
  full_date      DATE NOT NULL,
  day_of_week    VARCHAR(10),
  day_of_month   INT,
  month_num      INT,
  month_name     VARCHAR(20),
  quarter        INT,
  year           INT,
  is_holiday     BOOLEAN DEFAULT FALSE,
  fiscal_quarter INT
);

-- Sample row
INSERT INTO dim_date VALUES
  (20240315, '2024-03-15', 'Friday', 15, 3, 'March', 1, 2024, FALSE, 2);

نمط مخطط النجمة

عند رسم مخطط يضم جدول حقائق واحداً في المركز وجداول أبعاد تمتد منه إلى الخارج، سيبدو المخطط كأنه نجمة — ومن هنا جاءت تسمية مخطط النجمة.

تشير المفاتيح الخارجية في جدول الحقائق إلى المفاتيح الأساسية لكل بُعد. وعادةً ما تربط الاستعلامات جدول الحقائق ببُعد واحد أو أكثر لإضافة سياق وصفي إلى الأرقام الخام.

-- Join fact to two dimensions to enrich a sales report
SELECT
  dp.product_name,
  dp.category,
  SUM(fs.quantity)     AS total_units_sold,
  SUM(fs.total_amount) AS total_revenue
FROM fact_sales fs
JOIN dim_product  dp ON dp.product_key  = fs.product_key
JOIN dim_date     dd ON dd.date_key     = fs.date_key
WHERE dd.year = 2024
GROUP BY dp.product_name, dp.category
ORDER BY total_revenue DESC;

المفاتيح البديلة مقابل المفاتيح الطبيعية

تستخدم جداول الأبعاد مفاتيح بديلة — وهي أعداد صحيحة اصطناعية تنشئها قاعدة البيانات، ومستقلة عن أي معنى تجاري. وقد تتغير المفاتيح الطبيعية، مثل SKU الخاص بمنتج أو البريد الإلكتروني للعميل، بمرور الوقت، بينما لا تتغير المفاتيح البديلة أبداً.

يحمي استخدام المفاتيح البديلة جدول الحقائق من التغييرات في الأنظمة المصدرية، ويجعل عمليات الربط أسرع لأن مقارنات الأعداد الصحيحة أقل تكلفة من مقارنات السلاسل النصية.

-- Surrogate key approach: integer join is fast
SELECT fs.sale_id, dc.full_name, fs.total_amount
FROM fact_sales fs
JOIN dim_customer dc ON dc.customer_key = fs.customer_key
WHERE dc.country = 'Germany'
LIMIT 10;

-- Natural key approach (avoid in warehouses): slower string join
-- JOIN dim_customer dc ON dc.email = fs.customer_email

الحبيبية: مستوى التفاصيل في جدول الحقائق

تصف حبيبية جدول الحقائق بدقة ما يمثله صف واحد. وقبل بناء مستودع البيانات، يجب أن تحددوا الحبيبية — فعلى سبيل المثال، صف واحد لكل بند منتج فردي في طلب بيع.

تمنع الحبيبية المحددة جيداً التجميعات الملتبسة. فإذا كانت الصفوف المختلفة تمثل أحداثاً مختلفة، فستكون نتائج SUM وCOUNT بلا معنى.

-- Grain: one row per product per order line
-- Each row = one line item sold in one transaction
SELECT
  sale_id,
  date_key,
  product_key,
  quantity,
  unit_price,
  total_amount
FROM fact_sales
WHERE date_key = 20240315
ORDER BY sale_id;

المقاييس القابلة للجمع وشبه القابلة للجمع وغير القابلة للجمع

تأتي الحقائق في ثلاثة أنواع وفقاً لطريقة تجميعها:

  • قابلة للجمع — يمكن جمعها عبر جميع الأبعاد، مثل revenue وquantity.
  • شبه قابلة للجمع — يمكن جمعها عبر بعض الأبعاد دون غيرها، مثل balance الخاص بالحساب، الذي يمكن جمعه عبر العملاء ولكن ليس عبر الزمن.
  • غير قابلة للجمع — لا يمكن جمعها بطريقة ذات معنى، مثل unit_price وratio. استخدموا AVG أو تجميعات أخرى بدلاً من ذلك.
SELECT
  dd.month_name,
  SUM(fs.total_amount)         AS total_revenue,   -- additive
  AVG(fs.unit_price)           AS avg_unit_price,   -- non-additive: use AVG
  SUM(fs.quantity)             AS total_units       -- additive
FROM fact_sales fs
JOIN dim_date dd ON dd.date_key = fs.date_key
WHERE dd.year = 2024
GROUP BY dd.month_name, dd.month_num
ORDER BY dd.month_num;

الأبعاد بطيئة التغيّر (SCD: النوعان 1 و2)

تتغير سمات الأبعاد بمرور الوقت — فقد ينتقل عميل من بلد إلى آخر، أو يتغير تصنيف منتج. وتتولى الأبعاد بطيئة التغيّر (SCD) معالجة هذه التغييرات:

  • النوع 1 — استبدال القيمة القديمة. أسلوب بسيط، لكنه يفقد السجل التاريخي.
  • النوع 2 — إضافة صف جديد بمفتاح بديل جديد وتواريخ سريان. يحافظ هذا الأسلوب على السجل الكامل، بحيث تظل الحقائق التاريخية تشير إلى الإصدار الصحيح من البُعد.
-- SCD Type 2: add a new version of the row
ALTER TABLE dim_customer ADD COLUMN valid_from DATE;
ALTER TABLE dim_customer ADD COLUMN valid_to   DATE;
ALTER TABLE dim_customer ADD COLUMN is_current BOOLEAN DEFAULT TRUE;

-- Expire the old row
UPDATE dim_customer
SET is_current = FALSE,
    valid_to   = CURRENT_DATE - INTERVAL '1 day'
WHERE email = 'anna@example.com' AND is_current = TRUE;

-- Insert the updated version
INSERT INTO dim_customer (full_name, email, country, segment, valid_from, valid_to, is_current)
VALUES ('Anna Muller', 'anna@example.com', 'Austria', 'Premium', CURRENT_DATE, '9999-12-31', TRUE);

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

لا تحتاج سمة البُعد أحياناً إلى جدول خاص بها. البُعد المنحط هو مفتاح بُعد يوجد مباشرةً في جدول الحقائق من دون جدول أبعاد مطابق.

ومن الأمثلة الشائعة أرقام الطلبات وأرقام الفواتير أو معرّفات التذاكر. فهي توفّر سياقاً للتعمّق في التفاصيل، لكنها لا تحتوي على أعمدة وصفية أخرى تستحق التخزين في جدول منفصل.

-- order_number is a degenerate dimension:
-- it lives in the fact table, no dim_order table needed
CREATE TABLE fact_order_lines (
  line_id      SERIAL PRIMARY KEY,
  order_number VARCHAR(20) NOT NULL,  -- degenerate dimension
  date_key     INT NOT NULL,
  product_key  INT NOT NULL,
  customer_key INT NOT NULL,
  quantity     INT NOT NULL,
  line_total   NUMERIC(12, 2) NOT NULL
);

SELECT order_number, SUM(line_total) AS order_total
FROM fact_order_lines
GROUP BY order_number
ORDER BY order_total DESC
LIMIT 5;

الاستعلام عن مخطط النجمة الكامل

بجمع كل ذلك معاً: يربط استعلام المستودع النموذجي جدول الحقائق بعدة أبعاد، ويطبّق عوامل تصفية على سمات الأبعاد، ويجمع المقاييس من جدول الحقائق.

يمكن للمحسّن التعامل مع عمليات الربط المتعددة هذه بكفاءة، لأن المفاتيح الخارجية في جدول الحقائق مفهرسة، ولأن جداول الأبعاد صغيرة نسبياً.

SELECT
  dd.year,
  dd.quarter,
  dp.category,
  dc.country,
  SUM(fs.quantity)     AS units_sold,
  SUM(fs.total_amount) AS revenue
FROM fact_sales fs
JOIN dim_date     dd ON dd.date_key     = fs.date_key
JOIN dim_product  dp ON dp.product_key  = fs.product_key
JOIN dim_customer dc ON dc.customer_key = fs.customer_key
WHERE dd.year IN (2023, 2024)
  AND dp.category = 'Electronics'
GROUP BY dd.year, dd.quarter, dp.category, dc.country
ORDER BY dd.year, dd.quarter, revenue DESC;

اختبار سريع: الحقائق مقابل الأبعاد

اختبروا فهمكم للاختلاف بين جداول الحقائق وجداول الأبعاد في مخطط النجمة.

مراجعة الدرس

تعلّمتم في هذا الدرس اللبنات الأساسية لمخطط نجمة مستودع البيانات:

  • تحتوي جداول الحقائق على أحداث قابلة للقياس، مثل المبيعات والنقرات والمعاملات، إلى جانب المقاييس الرقمية والمفاتيح الخارجية.
  • توفر جداول الأبعاد السياق الوصفي، مثل من وماذا وأين ومتى، باستخدام المفاتيح البديلة.
  • تحدد الحبيبية بالضبط ما يمثله صف الحقيقة الواحد — لذا يجب تحديدها قبل البناء.
  • تكون المقاييس قابلة للجمع أو شبه قابلة للجمع أو غير قابلة للجمع، وهذا يحدد كيفية تجميعها.
  • يحافظ SCD Type 2 على قيم الأبعاد التاريخية من خلال إضافة صفوف جديدة تتضمن تواريخ السريان.
  • توجد الأبعاد المنحطة في جدول الحقائق عندما لا تحتوي على سمات إضافية لوصفها.

يمثل فهم جداول الحقائق والأبعاد الأساس لبناء مستودعات سريعة وقابلة للتوسع وفعّالة تحليلياً.

الأسئلة الشائعة

هل درس «جداول الحقائق والأبعاد» مجاني؟

نعم — نص درس «جداول الحقائق والأبعاد» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Academy، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Academy 4 دروس في المجموع.

ماذا ستتعلم في «جداول الحقائق والأبعاد»؟

اللبنات الأساسية لمستودع البيانات تتمرن على SQL Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ SQL Academy؟

لا تُشترط خبرة سابقة. SQL Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «جداول الحقائق والأبعاد»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس SQL Academy هذا؟

نعم. كل درس في SQL Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. ‏OLTP مقابل OLAP
  2. جداول الحقائق والأبعاد
  3. مخططات النجمة ورقاقات الثلج
  4. كتابة الاستعلامات التحليلية
← العودة إلى SQL Academy