MongoDB با شاخص های جستجو به عنوان طرح ستاره کیمبال با حقایق و ابعاد پرسیده می شود

در پایگاه داده های اسناد مانند MongoDB ، مدل سازی داده ها به طور معمول برای الگوهای دسترسی از پیش تعریف شده بهینه می شوند ، جایی که هر دامنه یا سرویس صاحب پایگاه داده خود است. این در تضاد با مدل رابطه ای است ، که اغلب به عنوان یک پایگاه داده متمرکز و کاملاً عادی که مستقل از هر برنامه خاص طراحی شده است ، عمل می کند.
با این حال ، اکثر برنامه ها همچنین به توانایی انجام نمایش داده های موقت یا تجزیه و تحلیل در زمان واقعی نیاز دارند ، جایی که الگوهای پرس و جو از پیش تعیین نشده است.
در اینجا ، برعکس است: SQL به یک طرحواره پایگاه داده دیگری نیاز دارد ، در حالی که MongoDB همان رویکرد مدل ابعادی را در پایگاه داده عملیاتی ارائه می دهد.
در پایگاه داده های رابطه ای، یک روش معمول ایجاد یک بانک اطلاعاتی تجزیه و تحلیل جداگانه ، اغلب در یک مدل ابعادی مثل طرح محبوب شده توسط رالف کیمبال. در اینجا ، عادی شده میزهای واقعیت احاطه شده توسط denormalized میزهای ابعادیبشر این تنظیمات است جدا از پایگاه داده عملیاتی و در زمان واقعی با بارهای کاری معامله ای به روز نمی شود.
mongoDB ، یک استراتژی متفاوت را امکان پذیر می کندبشر با تشکر از ویژگی هایی مانند شاخص های جستجوی Atlas MongoDB ، تحلیلی در زمان واقعی بدون نیاز به تکثیر به یک پایگاه داده تحلیلی جداگانه ، می تواند مستقیماً در پایگاه داده عملیاتی انجام شود. در اینجا یک مثال ساده با استفاده از طرح نمونه تاریخ فروش Oracle که من در گذشته به عنوان نمونه ای از یک طرح ستاره ای که به درستی با شاخص های Bitmap در کلیدهای خارجی طراحی شده است ، استفاده کردم تا تحول ستاره را فراهم کند.
صادرات از SQL به CSV
ساده ترین مورد برای به دست آوردن طرح نمونه تاریخ فروش (SH) با داده ها ، داشتن یک پایگاه داده خودمختار در ردیف آزاد Oracle Cloud ، همانطور که به طور پیش فرض ایجاد شده است.
من برای دریافت داده ها به پرونده های CSV از Olload SQLCL استفاده کردم:
for i in CHANNELS COSTS COUNTRIES CUSTOMERS PRODUCTS PROMOTIONS SALES SUPPLEMENTARY_DEMOGRAPHICS TIMES
do
echo "set loadformat csv"
echo "alter session set nls_date_format="YYYY-MM-DD";"
echo "unload SH.$i"
done > unload.sql
sqlcl @ unload.sql
این پرونده های CSV زیر را در فهرست فعلی ایجاد کرد:
$ wc -l *.csv | sort -n
6 CHANNELS_DATA_TABLE.csv
24 COUNTRIES_DATA_TABLE.csv
73 PRODUCTS_DATA_TABLE.csv
504 PROMOTIONS_DATA_TABLE.csv
1827 TIMES_DATA_TABLE.csv
4501 SUPPLEMENTARY_DEMOGRAPHICS_DATA_TABLE.csv
55501 CUSTOMERS_DATA_TABLE.csv
82113 COSTS_DATA_TABLE.csv
918844 SALES_DATA_TABLE.csv
پرونده های CSV حاوی یک هدر با نام ستون مورد استفاده در طرح ستاره است:
تصویر از: https://docs.oracle.com/cd/b19306_01/server.102/b14198/graphics/comsc007.gif
وارد کردن به MongoDB
من یک اطلس محلی مونگود را شروع کردم:
atlas deployments setup atlas --type local --port 27017 --force
من پرونده های CSV را وارد کردم:
mongoimport -j 8 --type=csv --headerline --drop --file=CHANNELS_DATA_TABLE.csv --db=sh --collection=channels $@ &&
mongoimport -j 8 --type=csv --headerline --drop --file=COSTS_DATA_TABLE.csv --db=sh --collection=costs &&
mongoimport -j 8 --type=csv --headerline --drop --file=COUNTRIES_DATA_TABLE.csv --db=sh --collection=countries &&
mongoimport -j 8 --type=csv --headerline --drop --file=CUSTOMERS_DATA_TABLE.csv --db=sh --collection=customers &&
mongoimport -j 8 --type=csv --headerline --drop --file=PRODUCTS_DATA_TABLE.csv --db=sh --collection=products &&
mongoimport -j 8 --type=csv --headerline --drop --file=PROMOTIONS_DATA_TABLE.csv --db=sh --collection=promotions &&
mongoimport -j 8 --type=csv --headerline --drop --file=SALES_DATA_TABLE.csv --db=sh --collection=sales &&
mongosh sh --eval "show collections"
این نهصد هزار واقعیت و ابعاد مربوطه را در ده ثانیه وارد می کند:
من به پایگاه داده “SH” متصل می شوم و نمونه ای از اسناد “فروش” را ذکر می کنم:
mongosh
use sh;
db.sales.find().limit(2)
نمایه سازی طرحواره ستاره
در بانکهای اطلاعاتی SQL ، یک شاخص بهینه واحد برای یک داده مارتی که در ترکیب های مختلف ابعاد پرسیده می شود ، ایجاد نمی شود. طرح SH در پایگاه داده Oracle از یک شاخص Bitmap برای هر کلید خارجی در جدول واقعیت استفاده می کند.
نمایش داده ها تمام شاخص های لازم را می خوانند و نتایج را با عملیات bitmap ترکیب می کنند ، که وقتی پیش بینی های فردی فاقد انتخابی هستند ، ایده آل است ، اما ترکیب آنها آن را به مجموعه کوچکی از ردیف ها کاهش می دهد تا از جدول واقعیت بخواند.
شاخص های BITMAP برای انبارهای داده اما برای پایگاه داده های عملیاتی مؤثر هستند ، زیرا می توانند منجر به تکه تکه شدن شاخص و موارد قفل شدن در سیستم های OLTP شوند. برای تجزیه و تحلیل در زمان واقعی ، اوراکل یک فروشگاه ستون در حافظه ارائه می دهد ، که به عنوان یک حافظه پنهان بهینه شده تحلیلی برای پایگاه داده های معامله ای عمل می کند.
MongoDB یک راه حل متفاوت دارد: می تواند در هر جدول FACT از یک شاخص جستجوی واحد استفاده کند. شاخص های جستجوی ATLAS در پایگاه داده عملیاتی اجرا می شوند و به طور همزمان از جریان تغییر به روز می شوند و امکان تجزیه و تحلیل نزدیک به زمان واقعی در پایگاه داده های عملیاتی را فراهم می کنند.
من شاخص جستجوی زیر را در قسمت های کلید ابعاد در جدول واقعیت اعلام کردم:
db.sales.createSearchIndex(
"SalesDimension",
{
"mappings": {
"fields": {
"PROD_ID": { "type": "number" },
"CUST_ID": { "type": "number" },
"TIME_ID": { "type": "token" },
"CHANNEL_ID": { "type": "number" },
"PROMO_ID": { "type": "number" },
}
}
}
)
من داده ها را مستقیماً از CSV بدون تعریف داده ها وارد کردم. Time_ID یک رشته کاراکتر در قالب YYYY-MM-DD است ، بنابراین من آن را به عنوان یک نشانه اعلام کردم. زمینه های دیگر اعداد هستند. همه زمینه ها به عنوان کلیدهای خارجی که به مجموعه های ابعاد اشاره می کنند ، خدمت می کنند. مقادیر آنها از داشتن نظم طبیعی اهمیت کمتری دارند ، که ممکن است نمایش داده های دامنه را تسهیل کند.
این مثال را می توان در Atlas MongoDB Free Tier (M0) اجرا کرد که امکان سه فهرست جستجو را فراهم می کند:
اندازه کل طرح SH ، بدون شاخص جستجو ، 60 مگابایت است:
Logical Data Size: 172.12 MB
Storage Size: 31.49 MB
Index Size: 30.32 MB
Total Collections: 9
که بیشتر مجموعه فروش است:
Storage Size: 20.83MB
Logical Data Size: 124.4MB
Total Documents: 918843
Indexes Total Size: 26.01MB
شاخص جستجو تقریباً به همان اندازه طول می کشد:
این نسخه ی نمایشی یک بانک اطلاعاتی کوچک را به نمایش می گذارد و مقدار این رویکرد را هنگام استفاده در پایگاه داده های بزرگتر نشان می دهد. توصیه می شود اندازه شاخص جستجو را با حافظه نمونه مقایسه کنید.
پرس و جو از طرح ستاره – تحول ستاره
مزیت اصلی این طرح ستاره در جدول واقعیت آن نهفته است ، که حاوی ردیف های بی شماری با اندازه محدود است و فقط کلیدها و اقدامات خارجی را در اختیار دارد. این تعداد ردیف بزرگ با اندازه ردیف کوچکتر جبران می شود. در حالت ایده آل ، یک جدول واقعیت برای به حداقل رساندن پیوستن به بسیاری از ردیف ها وجود دارد.
جداول ابعاد کوچکتر هستند اما می توانند ردیف های بزرگتر را با چندین ویژگی برای فیلتر تعریف شده توسط کاربر و نمایش توضیحات طولانی در خود جای دهند. در SQL ، نمایش داده ها به جدول واقعیت می پیوندند تا ابعاد در بند FROM ، در حالی که پیش بینی ها در بند WHOLE مشخص شده است. بهینه ساز RDBMS ممکن است پرس و جو را برای بهره گیری از طرحواره ستاره به طور مؤثر تغییر دهد ، همانطور که من در مقاله ای قدیمی برای خبرنامه Soug شرح دادم:
پیش بینی های بند جایی برای به دست آوردن لیست کلیدهای ابعاد در ابعاد کوچک اعمال می شود. سپس این لیست برای دسترسی به جدول واقعیت از طریق شاخص های bitmap استفاده می شود و فقط ردیف های لازم را بازیابی می کند. سرانجام ، این نتیجه برای پیش بینی های اضافی با جداول ابعادی به هم پیوسته است. این تحول ، موجود در RDBM های تجاری مانند Oracle Database Enterprise Edition ، فیلتر را بهینه می کند تا پیوندهای غیر ضروری را به حداقل برساند. در Oracle Standard Edition یا PostgreSQL در دسترس نیست.
این که آیا این تحول اجرا شده است یا خیر ، یک پرس و جو SQL از جدول بین جدول و ابعاد استفاده می کند. به عنوان مثال ، پرس و جو زیر معاملات فروش فروش از سال 2001 را که با تبلیغات پر هزینه همراه است ، بازنشسته می کند ، مشتری های کالیفرنیا را درگیر می کند و از طریق کانال فروش مستقیم رخ می دهد ، به طور خاص با تمرکز بر شنبه ها:
SELECT
s.PROMO_ID, s.CUST_ID, s.CHANNEL_ID, s.TIME_ID, s.PROD_ID,
p.PROD_NAME, p.PROD_LIST_PRICE,
s.quantity_sold, s.amount_sold,
FROM sales s
JOIN products p ON s.PROD_ID = p.PROD_ID
JOIN promotions pr ON s.PROMO_ID = pr.PROMO_ID
JOIN customers c ON s.CUST_ID = c.CUST_ID
JOIN channels ch ON s.CHANNEL_ID = ch.CHANNEL_ID
JOIN times t ON s.TIME_ID = t.TIME_ID
WHERE pr.PROMO_COST > 10000
AND c.CUST_STATE_PROVINCE = 'CA'
AND ch.CHANNEL_DESC = 'Direct Sales'
AND t.FISCAL_YEAR = 2001
AND t.DAY_NAME = 'Saturday'
AND s.TIME_ID > date '2001-01-01'
;
SQL مستقل از مدل داده های فیزیکی عمل می کند. برنامه ریز پرس و جو باید ترتیب بهینه برای پیوستن به جداول و انتخاب شاخص ها ، با تکیه بر ترکیبات پیچیده پیش بینی ها برای ارزیابی کاردینال ها تخمین بزند.
سؤالات MongoDB در یک طرح ستاره
MongoDB کنترل بیشتری را به توسعه دهنده در مورد نحوه دسترسی داده ها می دهد و از همان رویکرد بهینه استفاده می شود:
- از هر بعد که فیلترها در آن اعمال می شود ، از منابع مراجعه کنید
- جدول واقعیت را با یک خط لوله جمع آوری با استفاده از شاخص جستجو برای یافتن این منابع پرس و جو کنید
- به ابعادی که از آنها به زمینه های بیشتری نیاز دارید جستجو کنید
مرحله bitmap غیر ضروری است زیرا شاخص های جستجو ، که مبتنی بر آپاچی لوچن هستند ، می توانند چندین فیلتر را با اپراتور ترکیب ترکیب کنند. کلیدهای ابعاد جمع آوری شده به عنوان یک آرایه برای استفاده ساده با اپراتور در آن ساده است.
در اینجا مثالی برای بازیابی معاملات فروش از سال 2001 آورده شده است (TIME_ID: { $gt: "2001-01-01" }
) که با تبلیغات پر هزینه همراه است (PROMO_COST: { $gt: 10000 }
) ، مشتری های کالیفرنیا را درگیر کنید ({ CUST_STATE_PROVINCE: 'CA' }
) ، و از طریق کانال فروش مستقیم رخ می دهد ({ CHANNEL_DESC: 'Direct Sales' }
) ، به طور خاص با تمرکز بر شنبه ها ({ FISCAL_YEAR: 2001 , DAY_NAME: 'Saturday' }
).
برای محدوده زمانی ، همانطور که کلید ابعاد تمام اطلاعات را با فرمت YYYY-MM-DD خود در اختیار دارد ، نیازی به خواندن از بعد ندارم. برای دیگران ، من از مجموعه های ابعاد پرس و جو می کنم تا مجموعه ای از کلیدها را که وضعیت من را تأیید می کند ، بدست آورم:
const promoIds = db.promotions.find(
{PROMO_COST: { $gt: 10000 }}
).toArray().map(doc => doc.PROMO_ID);
const custIds = db.customers.find(
{ CUST_STATE_PROVINCE: 'CA' }
).toArray().map(doc => doc.CUST_ID);
const channelIds = db.channels.find(
{ CHANNEL_DESC: 'Direct Sales' }
).toArray().map(doc => doc.CHANNEL_ID);
const timeIds = db.times.find(
{ FISCAL_YEAR: 2001 , DAY_NAME: 'Saturday' }
).toArray().map(doc => doc.TIME_ID);
در مورد لیست های طولانی نگران نباشید ، شاخص های جستجو می توانند از پس آن برآیند:
مرحله بعدی یک خط لوله جمع آوری است که از آن لیست ها استفاده می کند و محدوده زمانی را در یک فیلتر مرکب اضافه می کند:
db.sales.aggregate([
{
"$search": {
"index": "SalesDimension",
"compound": {
"must": [
{ "in": { "path": "PROMO_ID". , "value": promoIds } },
{ "in": { "path": "CUST_ID". , "value": custIds } },
{ "in": { "path": "CHANNEL_ID", "value": channelIds } },
{ "in": { "path": "TIME_ID". , "value": timeIds } },
{ "range": { "path": "TIME_ID", "gt": "2001-01-01" } }
]
}
}
},
{ "$sort": { "TIME_ID": -1 } },
{ "$limit": 3 },
{
"$lookup": {
"from": "products",
"localField": "PROD_ID",
"foreignField": "PROD_ID",
"as": "product_info"
}
},
{
"$unwind": "$product_info"
},
{
"$project": {
"PROMO_ID": 1,
"CUST_ID": 1,
"CHANNEL_ID": 1,
"TIME_ID": 1,
"PROD_ID": 1,
"quantity_sold": 1,
"amount_sold": 1,
"product_info.PROD_NAME": 1,
"product_info.PROD_LIST_PRICE": 1
}
}
]);
عملیات جستجو اولین مرحله از خط لوله جمع آوری ، برای به دست آوردن کارآیی حداقل مواردی است که توسط پرس و جو مورد استفاده قرار می گیرد و می توان پردازش بیشتری را اضافه کرد.
من یک نوع کار مرتب سازی و محدودیت را در اینجا اضافه کرده ام تا فقط سه فروش آخر را به نمایش بگذارم. من اطلاعات بیشتری را با جستجوی بعد از محصول اضافه کرده ام و فقط نام و قیمت را به پروژه خود باز می کنم.
نتیجه ، مجموعه ای از اسناد آماده برای بازگشت به کاربر است که در 8 میلی ثانیه بازگردانده شده است:
این پست با هدف نشان دادن مؤلفه جستجو پرس و جو تحلیلی با خواندن فقط اسناد لازم از مجموعه واقعیت. تجزیه و تحلیل بیشتر را می توان به خط لوله جمع آوری اضافه کرد. Datamodel را می توان بهبود بخشید (با استفاده از داده های بهتر ، کلیدها به عنوان _id و خوشه بندی شاخص) اما هدف این بود که نشان دهیم چگونه می توانیم بدون تغییر طرح ، نمایش داده های تحلیلی مؤثر را اجرا کنیم.
پایان
بر خلاف طرح های SQL STAR ، که نیاز به فرآیندهای بارگذاری-انتقال (ELT) به پایگاه داده دیگر دارد ، مدل سند MongoDB اجازه می دهد تا معاملات از جمله داده های تعبیه شده یا ارجاع شده در یک مجموعه واحد ذخیره شود ، به طور مؤثر به حقایق چند غغطی و بدون پیوندهای پیچیده بپردازد.
از رویکرد تحول ستاره می توان برای تولید لیستی از کلیدهای موجود در مجموعه های جستجو با فیلترهای قابل اجرا ، مشابه جداول ابعاد استفاده کرد. شاخص های جستجوی اطلس این کلیدها را برای بازیابی اسناد لازم از مجموعه حقایق برای تجزیه و تحلیل بیشتر در خط لوله جمع ترکیب می کنند.
با MongoDB ، اگر داده های خود را به درستی برای موارد استفاده از دامنه الگوبرداری کرده اید و بعداً با نیازهای جدید پرس و جو که نیاز به تجمع اسناد پراکنده دارد ، مواجه شوید ، در نظر بگیرید که آیا یک فهرست جستجو می تواند قبل از تغییر مدل یا پخش به پایگاه داده دیگری ، این نیازها را برطرف کند.