مخططات النجمة ورقاقات الثلج
صمّم البيانات لإجراء تحليلات سريعة
مخططات النجمة ورقاقات الثلج درس مجاني في SQL Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Academy 4 دروس في المجموع.
ما هو مخطط مستودع البيانات
في قاعدة بيانات خاصة بالمعاملات (OLTP)، نطبّع البيانات لتجنّب التكرار. أما في مستودع البيانات، فكثيراً ما نلغي التطبيع عمداً — فنزيد مساحة التخزين مقابل سرعة الاستعلام. ومن النمطين الكلاسيكيين لتنظيم جداول المستودع مخطط النجمة ومخطط الثلج.
يتمحور كلاهما حول جدول حقائق مركزي تحيط به جداول أبعاد. ويكمن الاختلاف في مدى تطبيع تلك الأبعاد.
جداول الحقائق وجداول الأبعاد
يخزّن جدول الحقائق الأحداث القابلة للقياس، مثل المبيعات والنقرات والشحنات. ويضم عدداً كبيراً من الصفوف، ويحتوي على مقاييس رقمية بالإضافة إلى مفاتيح خارجية تشير إلى الأبعاد.
يصف جدول الأبعاد سياق كل حدث: من وماذا ومتى وأين. وتضم الأبعاد صفوفاً أقل، لكنها أغنى بالأعمدة الوصفية.
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,
revenue NUMERIC(12, 2) NOT NULL
);
CREATE TABLE dim_product (
product_key SERIAL PRIMARY KEY,
product_name VARCHAR(200),
category VARCHAR(100),
brand VARCHAR(100),
unit_price NUMERIC(10, 2)
);مخطط النجمة
في مخطط النجمة، يتصل كل جدول أبعاد مباشرةً بجدول الحقائق. ارسموا العلاقات على الورق، وستبدو كأنها نجمة — إذ يكون جدول الحقائق في المركز، وتمثل الأبعاد نقاطها.
تكون جداول الأبعاد غير مُطبَّعة بالكامل: إذ توجد جميع السمات الوصفية في جدول واحد، حتى لو تكررت بعض السمات عبر الصفوف.
-- Star schema: all product info in one flat dimension table
CREATE TABLE dim_product (
product_key SERIAL PRIMARY KEY,
product_name VARCHAR(200),
category_name VARCHAR(100), -- denormalized
subcategory VARCHAR(100), -- denormalized
brand_name VARCHAR(100), -- denormalized
brand_country VARCHAR(100), -- denormalized
unit_price NUMERIC(10, 2)
);
CREATE TABLE dim_date (
date_key INT PRIMARY KEY, -- e.g. 20240315
full_date DATE,
year INT,
quarter INT,
month INT,
month_name VARCHAR(20),
week INT,
day_of_week VARCHAR(10)
);استعلام مخطط النجمة
تجعل جداول الأبعاد المسطّحة الاستعلامات بسيطة. إذ تربطون جدول الحقائق ببُعد واحد أو أكثر ثم تجرون التجميع. ولا توجد عمليات ربط ثانوية عبر سلاسل من الجداول المُطبَّعة.
ولهذا توفّر مخططات النجمة استعلامات تحليلية سريعة — فرسم الربط سطحي.
SELECT
d.year,
d.quarter,
p.category_name,
SUM(f.revenue) AS total_revenue,
SUM(f.quantity) AS units_sold
FROM fact_sales f
JOIN dim_date d ON d.date_key = f.date_key
JOIN dim_product p ON p.product_key = f.product_key
WHERE d.year = 2024
GROUP BY d.year, d.quarter, p.category_name
ORDER BY d.quarter, total_revenue DESC;مخطط Snowflake
يُطبّع مخطط Snowflake جداول الأبعاد بدرجة أكبر، إذ يقسمها إلى أبعاد فرعية. فبدلاً من تخزين category_name وbrand_name داخل dim_product، تنشئ جدولين منفصلين هما dim_category وdim_brand.
ويبدو المخطط الناتج مثل ندفة الثلج، بأذرع متفرعة من الجداول المترابطة.
-- Snowflake schema: product dimension is normalized
CREATE TABLE dim_brand (
brand_key SERIAL PRIMARY KEY,
brand_name VARCHAR(100),
brand_country VARCHAR(100)
);
CREATE TABLE dim_category (
category_key SERIAL PRIMARY KEY,
category_name VARCHAR(100),
subcategory VARCHAR(100)
);
CREATE TABLE dim_product (
product_key SERIAL PRIMARY KEY,
product_name VARCHAR(200),
category_key INT REFERENCES dim_category(category_key),
brand_key INT REFERENCES dim_brand(brand_key),
unit_price NUMERIC(10, 2)
);استعلام مخطط Snowflake
يتطلب الاستعلام من مخطط Snowflake تنفيذ عمليات ربط أكثر لإعادة تجميع بيانات الأبعاد التي قُسّمت بين الجداول. ويجب على محسّن الاستعلام اجتياز مستويات إضافية، مما قد يزيد زمن الاستجابة مقارنةً بمخطط Star.
لكن الأبعاد المُطبّعة تكون أصغر وأكثر اتساقاً؛ فعند تحديث اسم علامة تجارية في صف واحد من dim_brand، يُطبَّق التحديث تلقائياً في كل المواضع.
SELECT
d.year,
c.category_name,
b.brand_name,
SUM(f.revenue) AS total_revenue
FROM fact_sales f
JOIN dim_date d ON d.date_key = f.date_key
JOIN dim_product p ON p.product_key = f.product_key
JOIN dim_category c ON c.category_key = p.category_key
JOIN dim_brand b ON b.brand_key = p.brand_key
WHERE d.year = 2024
GROUP BY d.year, c.category_name, b.brand_name
ORDER BY total_revenue DESC;المفاتيح البديلة مقابل المفاتيح الطبيعية
تستخدم جداول الأبعاد عادةً مفتاحاً بديلاً، وهو عدد صحيح ينشئه مستودع البيانات (مثل SERIAL)، بدلاً من استخدام مفتاح طبيعي من نظام المصدر.
وتظل المفاتيح البديلة ثابتة حتى عند تغيّر المصدر، كما أنها مدمجة لتناسب جداول الحقائق الكبيرة، وتدعم الأبعاد المتغيرة ببطء التي يجب فيها تتبّع السجل التاريخي.
-- Surrogate key (product_key) vs natural key (sku)
INSERT INTO dim_product (product_name, category_key, brand_key, unit_price)
VALUES ('Wireless Headphones', 3, 7, 89.99);
-- product_key is assigned by SERIAL -- the natural key (SKU) lives elsewhere
-- Natural key would be:
-- INSERT INTO dim_product (sku, product_name, ...)
-- VALUES ('WH-1000XM5', 'Wireless Headphones', ...);
-- Risky: SKU can be reused or reassigned by the source systemبُعد التاريخ
يتميز بُعد التاريخ بكونه خاصاً؛ فهو موجود دائماً تقريباً، ويُملأ عادةً مسبقاً بسنوات عديدة من التواريخ. ويؤدي تخزين السمات المشتقة (السنة، والربع، واسم الشهر، والفترة المالية، ومؤشر العطلة) في جدول البُعد إلى تجنّب إعادة حسابها وقت تنفيذ الاستعلام.
-- Populate dim_date for one year using generate_series
INSERT INTO dim_date (date_key, full_date, year, quarter, month, month_name, week, day_of_week)
SELECT
TO_CHAR(d, 'YYYYMMDD')::INT AS date_key,
d AS full_date,
EXTRACT(YEAR FROM d)::INT AS year,
EXTRACT(QUARTER FROM d)::INT AS quarter,
EXTRACT(MONTH FROM d)::INT AS month,
TO_CHAR(d, 'Month') AS month_name,
EXTRACT(WEEK FROM d)::INT AS week,
TO_CHAR(d, 'Day') AS day_of_week
FROM generate_series('2024-01-01'::DATE, '2024-12-31'::DATE, '1 day') AS d;الأبعاد المتغيرة ببطء (SCD Type 2)
ماذا يحدث عندما ينتقل أحد العملاء إلى مدينة أخرى أو يتغير تصنيف أحد المنتجات؟ تحتاج إلى تتبّع السجل التاريخي. يُدرج SCD Type 2 صفاً جديداً في البُعد لكل تغيير، مع إغلاق الصف السابق بإضافة تاريخ انتهاء. ويظل صف جدول الحقائق يشير إلى مفتاح البُعد القديم، مما يحافظ على الدقة التاريخية.
-- SCD Type 2 customer dimension
CREATE TABLE dim_customer (
customer_key SERIAL PRIMARY KEY,
customer_id INT NOT NULL,
customer_name VARCHAR(200),
city VARCHAR(100),
country VARCHAR(100),
valid_from DATE NOT NULL,
valid_to DATE,
is_current BOOLEAN DEFAULT TRUE
);
-- When a customer moves, close old row and insert new one:
UPDATE dim_customer
SET valid_to = CURRENT_DATE - 1, is_current = FALSE
WHERE customer_id = 42 AND is_current = TRUE;
INSERT INTO dim_customer (customer_id, customer_name, city, country, valid_from, is_current)
VALUES (42, 'Alice Muller', 'Berlin', 'Germany', CURRENT_DATE, TRUE);Star مقابل Snowflake — المفاضلات
لا يوجد مخطط أفضل من الآخر في جميع الحالات. اختر المخطط وفقاً لأولوياتك:
- Star — عمليات ربط أقل، واستعلامات أسرع، وعمليات ETL أبسط، لكن بتكلفة تخزين أعلى. وهو الأنسب لأدوات التحليلات التي تكثر فيها عمليات القراءة (Tableau وPower BI).
- Snowflake — أبعاد مُطبّعة، وتكرار أقل، وتحديثات أسهل للأبعاد، لكن مع عمليات ربط أكثر. وهو أفضل عندما تكون الأبعاد كبيرة أو مشتركة بين عدة جداول حقائق.
-- Checking how much storage the denormalized category column costs
-- in a large dim_product (star schema) vs a separate dim_category (snowflake)
SELECT
COUNT(*) AS total_products,
COUNT(DISTINCT category_name) AS unique_categories,
pg_size_pretty(
SUM(pg_column_size(category_name))
) AS category_storage
FROM dim_product;مخطط Galaxy (تجمّع الحقائق)
عندما يحتوي المستودع على عدة جداول حقائق تشترك في جداول الأبعاد، يُسمى الناتج مخطط Galaxy (أو تجمّع الحقائق). فعلى سبيل المثال، قد يحتوي مستودع بيانات لمتجر تجزئة على جدولَي حقائق منفصلين للمبيعات وعمليات الإرجاع، ويشير كلاهما إلى dim_product وdim_date نفسيهما.
وتضمن الأبعاد المشتركة اتساق التصفية، وتجعل المقارنات بين جداول الحقائق مباشرة.
CREATE TABLE fact_returns (
return_id SERIAL PRIMARY KEY,
date_key INT NOT NULL REFERENCES dim_date(date_key),
product_key INT NOT NULL REFERENCES dim_product(product_key),
customer_key INT NOT NULL,
quantity INT NOT NULL,
refund_amount NUMERIC(12, 2) NOT NULL
);
-- Cross-fact query: net revenue = sales - refunds
SELECT
d.year,
d.month,
SUM(s.revenue) AS gross_revenue,
SUM(r.refund_amount) AS total_refunds,
SUM(s.revenue) - COALESCE(SUM(r.refund_amount), 0) AS net_revenue
FROM dim_date d
LEFT JOIN fact_sales s ON s.date_key = d.date_key
LEFT JOIN fact_returns r ON r.date_key = d.date_key
WHERE d.year = 2024
GROUP BY d.year, d.month
ORDER BY d.month;مخطط Star مقابل Snowflake
اختبر مدى فهمك لمخططي Star وSnowflake.
مراجعة الدرس
استكشفت في هذا الدرس نمطين أساسيين لتصميم مستودعات البيانات:
- مخطط Star — جدول حقائق مركزي تحيط به جداول أبعاد مسطحة وغير مُطبّعة. عمليات ربط أقل، واستعلامات أسرع، وتخزين أكبر قليلاً.
- مخطط Snowflake — تُطبّع جداول الأبعاد بدرجة أكبر إلى أبعاد فرعية. تكرار أقل، وتحديثات أسهل، لكن مع الحاجة إلى عمليات ربط أكثر.
- تحتوي جداول الحقائق على أحداث قابلة للقياس، بينما توفر جداول الأبعاد السياق (من، وماذا، ومتى، وأين).
- تحافظ المفاتيح البديلة على الدقة التاريخية، وتفصل مستودع البيانات عن تغييرات نظام المصدر.
- يتتبّع SCD Type 2 سجل الأبعاد بإضافة صفوف جديدة مع تواريخ الصلاحية، بدلاً من الكتابة فوق الصفوف القديمة.
- عندما تشترك عدة جداول حقائق في الأبعاد، يصبح التصميم مخطط Galaxy (تجمّع الحقائق).
اختر Star للبساطة والسرعة، واختر Snowflake عندما تكون الأبعاد كبيرة أو كثيرة التحديث أو مشتركة بين العديد من جداول الحقائق.
تعلم SQL مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 46
- الدروس
- 183
الأسئلة الشائعة
هل درس «مخططات النجمة ورقاقات الثلج» مجاني؟
نعم — نص درس «مخططات النجمة ورقاقات الثلج» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Academy، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Academy 4 دروس في المجموع.
ماذا ستتعلم في «مخططات النجمة ورقاقات الثلج»؟
صمّم البيانات لإجراء تحليلات سريعة تتمرن على SQL Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ SQL Academy؟
لا تُشترط خبرة سابقة. SQL Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «مخططات النجمة ورقاقات الثلج»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس SQL Academy هذا؟
نعم. كل درس في SQL Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- OLTP مقابل OLAP
- جداول الحقائق والأبعاد
- مخططات النجمة ورقاقات الثلج
- كتابة الاستعلامات التحليلية