در اکثر پروژه های کامپیوتری انجام شده در دهههای اخیر از تکنولوژیهای تمام شئگرایی مانند Java و C# استفاده شده در حالی که برای ذخیره سازی دادهها از پایگاهدادههای رابطهای که در آنها اثری از شئگرایی موجود نیست استفاده شده. این بدین معنا نیست که انتخابهای دیگری موجود نیست بلکه بسیاری زبانهای برنامهنویسی Procedural شبیه COBOL موجود است همچنین بسیاری از پایگاهدادههای موجود از تکنولوژی شئگرا بهره میبرند از جمله میتوان از پایگاهدادههای XML نام برد.
بین تکنولوژیهای شئ گرایی و رابطهای که اکثر تیمهای نرمافزاری در سیستمهای خود بهکار میبرند یک ناهمخوانی ذاتی موجود است. برای رفع این ناهمخوانی یک راه ساده وجود دارد که از دو بخش تشکیل شده: ابتدا باید پروسهی نگاشت اشیاء به رابطههای پایگاهداده را آموخت و سپس روشی برای پیادهسازی آن فرا گرفت.
نقش DBA
شکل 1 نشان دهنده نقش یک DBA است زمانی که نگاشت بین مدل رابطه ای و شئگرا را انجام میدهد. سه عمل اولیه برای اینکار عبارتند از:
1- نگاشت [1]: هدف اصلی یافتن یک استراتژی مناسب و کارا برای نگاهداری دادههای اشیاء است. این کار شامل ذخیره کردن صفات و رابطههای بین اشیاء از جمله رابطهی ارث بری میان اشیاء است.
2- پیادهسازی نگاشت [2]
3- یکسان ساختن کارایی [3]
(تصاویر در فایل اصلی موجود است)
نکتهی قابل توجه در شکل1 این است که هم DBA ها و هم تولیدکنندگان نرمافزارها در هر سه فعالیت بالا با هم کار میکنند. ]1[
ایده اصلی
اولین چیزی که در نگاشت اشیاء به پایگاهدادههای رابطهای به نظر میرسد نگاشت بین صفات اشیاء و ستونهای جداول است. هر صفت از یک شئ به صفر یا چند ستون در پایگاهداده رابطهای تبدیل میشود. به خاطر داشته باشید که کلیه صفات یک شئ پایدار (Persistent) نیستند. به عنوان مثال صفت میانگین نمرات در یک شئ Student ممکن است فقط در برنامه استفاده شود در حالی که نیازی به ذخیرهسازی مقدار آن در پایگاهداده نیست چراکه از روی مقادیر باقی صفات قابل محاسبه میباشد. و یا بعضی صفات در اشیاء خود یک شئ مستقل میتواند باشد به همین دلیل ممکن است در پایگاهداده رابطهای مجموعهای از چند ستون به عنوان جایگزینی برای یک صفت در یک شئ در نظر گرفته شود. سادهترین حالت در نگاشت یک شئ زمانی است که هر صفت از یک شئ به یک ستون از یک جدول در پایگاهداده نگاشت شود مخصوصاً زمانی که نوع دادهای در مدل شئگرا با نوع دادهای در مدل رابطهای یکسان باشند. ]4[
برای سادگی میتوان فرض کرد که کلاسها به صورت یک به یک به جداول در پایگاهدادهها نگاشت میشوند. اما به غیر از موارد بسیار ساده و ابتدایی همانطور که در ادامه خواهیم دید این فرض اشتباه بوده و نیاز به عملیات بیشتری برای نگاشت میان کلاسها و جداول در این دو مدل است. اما در این نوشته معمولاً ابتدا هر کلاس را به یک جدول نگاشت کرده و سپس سایر بهینهسازیها را انجام میدهد.
(تصاویر در فایل اصلی موجود است)
شکل ۲ نشان دهنده یک نمودار کلاس ساده به همراه مدل ذخیره سازی فیزیکی معادل آن در پایگاهداده رابطهای میباشد. شما در این شکل میتوانید ارتباط بین عناصر یک کلاس با ستونهای پایگاهداده را مشاهده کنید.
(تصاویر در فایل اصلی موجود است)
با وجودی که شماها در شکل نشان داده شده بسیار شبیه هستند این تفاوتها بدان معنا است که انطباق کامل نخواهد بود. تفاوتها بین شماها شامل :
چندین خصیصه برای tax در نمودار کلاس وجود دارد در صورتی که تنها یک معادل در شمای داده برای آن موجود است. این بدان معنا است که سه خصیصه tax در کلاس tax در یک ستون از جدول Order اضافه و نگهداری شوند در زمان ذخیره سازی و وقتی شیئ خوانده میشود در حافظه 3 خصیصه باید محاسبه شوند .
شمای داده شامل کلید است در حالی که شمای شیئ این خصیصه را ندارد باید برای شناسایی و ارتباط بین کلید در کلاس سیاست و روندی اتخاذ گردد. به این اطلاعات اضافی "اطلاعات سایه"[4] میگوییم.
نوع های مختلفی در هر شما موجود است باید بدون از بین رفتن اطلاعات بتوان آنها را به هم تبدیل کرد. ]2[
اطلاعات سایه
اطلاعات سایه شامل هر داده ای است که اشیائ برای ساختن نیاز دارند. از قبیل کلید، کنترل همروند و ... .
شکل۳ مدل ریزتری از کلاسهای Order و Order Item را مشخص میکند.
شامل خصوصیات سایهای که کلاس برای نمایش مطبوع خودش نیاز دارد میباشد. در جلو اسم این خصوصیات به جای خط فاصله فاصله قرارگرفته و جلو آنها واژه کلیشهای <> قرار گرفتهاست.
چهارچوب اطلاعات مورد نیاز برای ایفا روابط بین خصوصیات دو کلاس .چهارچوب خصوصیات، از قبیل بردار OrderItem در Order.
تابع GetTotalTax() به کلاس Order برای محاسبه مقدار tax در جدول Order اضافه شدهاست. ]2[
(تصاویر در فایل اصلی موجود است)
اطلاعات سایه به طور ضروری نیازمند ایفا شدن بوسیله business object ها میباشند. و باید به چگونگی انها توجه شود.
(تصاویر در فایل اصلی موجود است)
شکل۴ به قسمت عمده تکنیک مقاومت غیر انطباقی[1] بین تکنولوژی شیئ و تکنولوژی رابطهای است. کلاسها رفتار وداده های و روابط جداول پایگاه داده را مشخص میکنند. نتیجه نهایی وقتی بدست میآید که شما یک کلاس رو به روابط پایگاه داده انطباق میدهید. شما باید Operation های getter و setter را هم برای هر ستون جدول به کلاس اضافه کنید.
3نگاشت ساختارهای وراثتی
پایگاهدادههای رابطهای به طور ذاتی وراثت را پشتیبانی نمیکنند، بنابر این شما مجبورید ساختارهای وراثتی را در شماهای شیئ برای شما داده ترسیم کنید.
مفهوم وراثت در چندین پیجیدگی جالب در زمان ثبت اشیا در پایگاهدادههای رابطهای گذاشتهشده.ما چندین راه حل مقدماتی برای نگاشت وراثت به پایگاهداده رابطهای ارائهکردهایم. که این تکنیکها شامل:
نگاشت کلاس وراثت به یک جدول تنها
نگاشت هر کلاس واقعی با جدول خودش.
نگاشت هر کلاس با جدول خودش.
نگاشت کلاس ها به ساختار کلی جداول. ]2[
برای توصیف هر تکنیک ما چگونگی نگاشت دو نسخه از وراثت نمایش داده شده در شکل۵ را توضیح می دهیم نسخه اول شامل ۳ کلاس است – person، کلاس انتزاعی، و دو کلاس employee , costomer – نسخه دوم وراثت کلاس دیگری را اضافهمیکند بنام executive
(تصاویر در فایل اصلی موجود است)