آپاچی کاساندرا ۳ – افزوده شدن امکان Materialized Views
چند روزی از انتشار نسخه جدید بانک اطلاعاتی معروف و قدرتمند کاساندرا می گذرد. این بانک اطلاعاتی که به دلیل سرعت بالای بازیابی اطلاعات و معماری کاملا توزیع شده اش توانست جزء ده بانک اطلاعاتی محبوب دنیا قرارگیرد، در نسخه جدید علاوه بر بهبود کارآیی و کاهش از حجم ذخیره سازی مورد نیاز، امکان Materialized Views را به عنوان یک امکان جدید به فهرست قابلیت های خود افزوده است .
همانطور که می دانید View یا نما در یک بانک اطلاعاتی، یک دستور اس کیو ال ذخیره شده است که با هر بار فراخوانی، آن دستور اجرا شده و نتیجه اش به کاربر نمایش داده میشود و Materialized View یا نمای محاسبه شده ، نتایج ذخیره شده یک کوئری است که باعث می شود سرعت بازیابی از آن کوئری بسیار بالا رود چون نیاز به محاسبه مجدد کوئری و انجام اتصالات و شرطها نیست .
یکی از مشکلات کاساندرا برای کاربران تازه کار، این بود که کاساندرا یک بانک اطلاعاتی کوئری محور است یعنی بر اساس پرس و جوهایی که در آینده خواهیم داشت، داده ها را ذخیره می کنیم. از طرفی نحوه بازیابی داده های جدول، کاملا بسته به کلید آن دارد و روی عناصر غیر کلید، نمی توان پرس و جوی خاصی انجام داد. این امر باعث میشود که برای یک موجودیت خاص با کوئری های مربوطه متفاوت ، مجبور می شویم گاهی چندین جدول درست کنیم که داده های یکسانی را ذخیره می کنند منتها هر کدام در یک کوئری بهینه شده اند و با سریعترین زمان ممکن به ما پاسخ می دهند .
امکان ایجاد شاخص در یک جدول، در نسخه های قبلی کاساندرا به آن اضافه شد و تاحدود زیادی مشکل فوق را حل می کرد اما به ازای هر نیاز جدید ، باید ایندکس جدید زده میشد یا جدولی جدید ساخته میشد و ساختار برنامه ها هم به تبع آن، گاهی نیازمند تغییر می شد .
اما در نسخه ۳ کاساندرا ،با معرفی نماهای محاسبه شده، به ما این اجازه را می دهد که برای یک موجودیت خاص، کوئری های مختلف را در قالب نماهای محاسبه شده ذخیره کنیم و با آنها مانند یک جدول اصلی رفتار کنیم. یعنی دیگر نیاز به تعریف جدول های مختلف با ساختار یکسان برای یک موجودیت نخواهد بود .
نکته جالبی که در رابطه با نماهای محاسبه شده کاساندرا وجود دارد این است که با هر درج اطلاعات در جدول اصلی، این نماها هم به طور خودکار آپدیت شوند و ما نگران قدیمی بودن این نماها نخواهیم بود.
به عنوان مثال فرض کنید یک جدول امتیاز داریم که امتیازات چند بازی مختلف را به همراه امتیاز هر بازیکن در هر بازی ذخیره می کند. این جدول را با دستور زیر در کاساندرا ایجاد می کنیم :
CREATE TABLE scores ( user TEXT, game TEXT, year INT, month INT, day INT, score INT, PRIMARY KEY (user, game, year, month, day) )
حال اگر بخواهیم برترین بازیکنها را در همه دوران بازیها به دست بیاوریم، می توانیم از نمای محاسبه شده زیر استفاده کنیم :
CREATE MATERIALIZED VIEW alltimehigh AS SELECT user FROM scores WHERE game IS NOT NULL AND score IS NOT NULL AND user IS NOT NULL AND year IS NOT NULL AND month IS NOT NULL AND day IS NOT NULL PRIMARY KEY (game, score, user, year, month, day) WITH CLUSTERING ORDER BY (score desc)
یا برای یافتن برترین بازیکن ماه خواهیم داشت :
CREATE MATERIALIZED VIEW monthlyhigh AS SELECT user FROM scores WHERE game IS NOT NULL AND year IS NOT NULL AND month IS NOT NULL AND score IS NOT NULL AND user IS NOT NULL AND day IS NOT NULL PRIMARY KEY ((game, year, month), score, user, day) WITH CLUSTERING ORDER BY (score DESC)
و برای یافتن برترین بازیکن یک روز نمای محاسبه شده زیر را می توانیم استفاده کنیم :
CREATE MATERIALIZED VIEW dailyhigh AS SELECT user FROM scores WHERE game IS NOT NULL AND year IS NOT NULL AND month IS NOT NULL AND day IS NOT NULL AND score IS NOT NULL AND user IS NOT NULL PRIMARY KEY ((game, year, month, day), score, user) WITH CLUSTERING ORDER BY (score DESC)
اطلاعات کامل مثال فوق را در وبلاگ شرکت دیتا استکس می توانید مطالعه کنید .
امکانی که قبلاً برای پیاده سازی آن در کاساندرا، به مشکلات زیادی بر می خوردیم البته محدودیت های این امکان جدید را هم هنگام طراحی باید مدنظر قرار داد.