چند اشتباه در طراحی پایگاه داده

20 03 2010
Database - سال نو مبارک

چند ساعتی تا تحویل سال مونده، سال نو همه مبارک و امیدوارم که سال خوبی پیش رو داشته باشید.
سال گذشته که شخصا برام سال پر حادثه ای بود. اینطور که بوش میاد در سال جدید هم رویدادهای مختلف در انتظارم هستند، شاید وقت کمی برای نوشتن داشته باشم.

این مطلب رو هم مدتی قبل که یک پروژه نیمه کاره رو تحویل گرفتم تا کار کنم و از دست مشکلات پروژه ناراحت بودم نوشتم. پست با کمی ویرایش الان آماده شد!

سال نو همه مبارک و خوش و خرم باشید!

performance یا بازده، فاکتور خیلی مهمی در همه زمینه ها هست که معمولا توسط تازه کار ها و گاها توسط طراح دیتابیس فراموش میشود. معمولا در مرحله آموزش، بر روی کارهای کوچک و حجم کوچک اطلاعات مانور داده می شود. پروژه های آموزشی کوچک بوده و مثالها کاربردهای کوچک در مقابل داده های کم را در نظر می گیرند.

در دنیای واقعی وضعیت فرق میکنه. برنامه های نوشته شده باید برای مدت زمانی طولانی بدون مشکل پاسخ گو باشند. حجم داده های ورودی خیلی زیاد است. و در یک برنامه تجاری ممکنه این موارد برای چند صد تا چند صد هزار رکورد در روز هم برسد. در چنین شرایطی عدم رعایت چند نکته کوچک اما اساسی ممکن است مشکل ساز شود.

در ادامه می خواهم چند اشتباه در طراحی پایگاه داده رو مطرح کنم، به این امید که دیگر شاهد آنها نباشم. این موارد مطمئنن در طور دوره های آموزی به کرات مطرح می شود ولی شگفتا که هنوز هم عده ای این اشتباه ها را تکرار می کنند.

  • استفاده ازنوع داده های رشته ای به عنوان اندیس یا  کلید اصلی

نوع داده varchar و هر نوع داده کاراکتری یا رشته ای بدترین نوع انتخاب برای اندیس جدول است. این اشتباه زمانی بدتر خواهد شد که این فیلد به عنوان کلید اصلی نیز استفاده کنید؛ و سرانجام اشتباه با استفاده از این کلید به عنوان کلید خارجی تکمیل خواهد شد!

البته توجه داشته باشید که استفاده از فیلد اندیس کاراکتری در کنار کلید اصلی مشکل خاصی نخواهد داشت. فقط این مورد در صروت لزوم و زمانی که از آن فیلد به کرات برای جستجو استفاده میکنید مورد استفاده قرار دهید.

علت اشتباه بودن این انتخاب در ساخت جدول اندیس و تعداد مقایسه های انجام شده بر می گردد. به عنوان یک مثال ساده مقایسه ، دو نوع عددی می توانند به راحتی توسط دستور عمل های CPU با یکدیگر مقایسه شوند، در حالی که درنوع کارکتری باید تک تک کارکاتر ها با استفاده از شبیه سازی نرم افزاری مقایسه شوند. در رشته های یونیکد هم که حجم کاراکتر ها دو برابر می شوند.

راه حل: راه حل بسیار ساده استفاده از انواع داده عددی مانند int یا bigint است. در عین حال می توانید از سایر انواع ساده دیگر نیز استفاده کنید.

  • عدم استفاده از اندیس یا کلید اصلی

این مورد رو از مورد بالایی جدا کردم چونکه هر کس همچنین اشتباهی رو انجام بده باید در مورد دانش وی تردید کرد. جداولی که ارجاعات مکرری به آنها وجود دارد باید از طریق اندیس ها بهینه شوند. وجود اندیس باعث سرعت بخشیدن در ارجاعات و افزایش بازده دیتابیس خواهد شد. کلید اصلی را هم برای استفاده به عنوان کلید خارجی و یا شناسه هر رکورد مورد استفاده قرار دهید.

البته یک استثنا در این مورد هم وجود دارد. این مورد زمانی هست که انواع توصیفی را در جدولی جداگانه قرار می دهیم، که در این صورت چون داده های این جدول کم خواهد بود و حذف اضافه ای در کار نخواهد بود، می توان آن جدول را بدون اندیس یا کلید اصلی در نظر گرفت.

این نکته را هم در نظر داشته باشید که بدون کلید اصلی و یا یک کلید یکتا نمی توانید ارتباطی مابین جداول بر قرار کنید.

  • استفاده از فیلد های NULL بی مورد

همیشه در استفاده از فیلدهای NULL دقت کنید. سعی کنید که فیلدهای رشته ای را NULL قرار ندهید چونکه یک معنای زاید به آن فیلد داده اید، مگر اینکه واقعا به null نیاز داشته باشید. یک کاربرد مفید null بودن فیلد برای کلید های خارجی هست که نشان می دهد، هیچ ارتباطی در رکورد جاری تعریف نشده است. نمونه ای این کاربرد را در تصویر زیر مشاهده می کنید.

Database

در کنار استفاده از فیلدهای null می توانید از مقادیر پیش فرض هم استفاده کنید تا هیچ فیلدی ندانسته خالی رد نشود. این کار کدهای sql شما را هم کوتاه تر خواهد کرد.

در همین زمینه مطالعه کنید:

10 Common Design Mistakes

Ten Common Database Design Mistakes

Database Performance Philosophy





پایگاه داده ها و مشکل بسته های نرم افزاری در ایران

25 10 2008

فکری که باعث شد من این نوشته رو بنویسم، مشکلی بود که در تهیه بسته های نرم افزاری داشتیم. نرم افزارهای ما که با SQL Server نوشته شده بودند باید به صورت بسته نرم افزاری دربیایند تا قابل فروش باشند.
این مشکل از آنجا ناشی می شد که پایگاه داده SQL Server در هنگام نصب تنظیمات کافی رو در اختیار نمی گذاره و نمی توان به راحتی امکان نصب و عزال نرم افزار و ابزارهای اون رو به درستی انجام داد. همچنین زمانی که برای نصب این پایگاه داده صرف می شود برای یک بسته نرم افزاری کوچک بسیار زیاد هست.

این تنها مشکل ما نیست و در میان همه نرم افزارهایی که از SQL Server استفاده می کردند، این مشئله کاملا مشخص هست. تنها تفاوتی که در میان نرم افزارهای ایرانی و خارجی دیدم، قابلیت تنظیم نحوه نصب پایگاه داده در نرم افزارهای خارجی هست، در حالی که این امکان به طور کلی در نرم افزارهای ایرانی وجود ندارد و در چند مورد، حتی خود فرد باید پایگاه داده را نصب کند.

این که ما نرم افزار نوشته شده رو به صورت بسته ارائه کنیم نیز یک طرف قضیه هست. این مدل ارائه نشان از قدرت کاری شرکت هست که می تونه تمامی قسمت های کار رو تا اماده سازی و نهایی کردن محصول به درستی انجام بده. زیاد وارد این بحث نمی شم ولی این رو هم بدونید که چنین چیزی در ایران رسم نیست. بسته های نرم افزاری که مشکل دارند و نرم افزارهای سفارشی به صورت حضوری نصب و تنظیم می شوند.

مشکلات نرم افزاری ها
مشکلات مربوط پایگاه داده ها در بسته ای نرم افزاری قبلا مظرح بوده و راه حل های قابل توجهی هم برای انها وجود دارد ولی به چند دلیل بزرگ انجام انها در شرایط فعلی شرکت های ایرانی محقق نشده است.

* اولین و مهمترین و شاید بزرگترین دلیل را، راحتی در هنگام تولید بدون صرف هزینه اضافه دانست. راحتی به این معنی که پایگاه داده SQL Server با داشتن مجموعه ابزارهای برنامه نویسی قدرتمند بسیاری از کارها را راحت کرده است. غافل از اینکه در مرحله فروش دچار مشکل خواهد شد.

* دلیل مهم و بزرگ دیگر رایگان بودن استفاده از آنها در ایران است. اگه در شرایط فعلی هزینه چند صد هزار تومانی را فقط به یک پروژه متوسط اضافه کنید، سود دهی پروژه زیر سوال خواهد رفت. در حالی که این هزینه فعلا صفر است.

* دلیل مهم بعدی، آموزش فقط چند پایگاه داده های معدود است. مسلما زمانی که استفاده از ابزاری راحت و در عین حال رایگان هست، کسی به گزینه های بعدی فکر نخواهد کرد. پس راحت ترین ها آموزش داده می شوند.

معرفی تعدادی پایگاه داده جایگزین
در ادامه می خواهم شما را با چند گزینه دیگر از پایگاه داده ها اشنا کنم و مواردی را که می توان با این پایگاه دادها انجام داد. همچنین چه نوع نرم افزارهایی را می توان با انها توسعه داد. این پایگاه دادها با توجه به معیارهای ایرانی انتخاب کرده ام.

SQL Server  و Oracle و MySQL
من اینگونه در نظر می گیرم شما خواننده محترم با این پایگاه داده آشنا هستید و موارد استفاده را هم می دانید.

Firebird
این پایگاه داده با داشتن موتوری قدرتمند از اکثر استانداردهای SQL پشتیبانی می کند.
مزیت های مهم: امکان استفاده از این پایگاه به عنوان یک پایگاه داده توکار و یا به عنوان یک سرور موجود هست. همچنین امکان استفاده از این پایگاه داده در چند سیستم عامل وجود دارد.
عیب مهم: تنها مورد ذکر شده عدم پشتبانی از fulltext search هست. ابزارهای مدیریتی گرافیکی توسط خود تولید کننده ارائه نمی شود و باید از ابزارهای سایر شرکتها استفاده شود.

PostgreSQL
پایگاه داده PostgreSQL هم دارای موتور قدرمتندی است و همه استاندارند ها sql را پشتیبانی می کند.
عیب نه چندان مهم: با توجه به اطلاعاتی که در سایت موجود بود به نظر می رسه که امکان استفاده مستقل از این پایگاه داده موجود نیست و حتما باید سرویس این پایگاه داده نصب باشد. همچنین امکان استفاده از این پایگاه داده در چند سیستم عامل وجود دارد.
مزیت مهم: ابزارهای مدیرتی موجود در بسته این پایگاه داده کامل بوده و از تمامی امکانات پشتیبانی می کند.

BlackFish
پایگاه داده BlackFish که در این میان خیلی به طبع من خوش اومد، همانند بقیه استاندارند است.
مزیت های مهم: امکان استفاده از این پایگاه به عنوان یک پایگاه داده توکار و یا به عنوان یک سرور موجود هست. حجم فایل های پایگاه داده کم بوده و سربار کمی بر روی سیستم دارد. همچنین عدم وابستگی به سیستم عامل که امتیاز مثبتی محصوب میشود.
مزیت فوق العاده: نکته جالب این پایگاه برای استفاده در حالت سرور این است که برنامه پایگاه داده را که یک فایل اجرایی مستقل و بدون نیاز به نصب است را با استفاده از یک خط فرمان به کار انداخت.
عیب مهم: عدم وجود محیط مدیرتی گرافیکی قوی. این پایگاه داده رایگان نمی باشد.

SQLite
پایگاه داده SQLite بسیار جالب و کار امد است.
مزیت: پایگاه داده ای تک فایلی با حجم کم و عدم وابستگی به سیستم عامل. دارای محیط مدیریتی خوب که تمامی امکانات آن را پوشش می دهند.
عیب مهم: تنها مشکل بزرگ عدم پشتیبانی از تمامی امکانات استاندارد sql هست که ضعف بزرگ اون محسوب می شود.
توضیحات بیشتر در مورد این پایگاه داده را در این پست بخوانید.

دسته بندی نرم افزارها و پایگاه داده های قایل استفاده
در ادامه به بررسی که نرم افزارهای تولیدی در ایران می پردازم و پایگاه داده ای مناسب برای آنها

دسته اول: نرم افزارهای سازمانی و بین سازمانی
این گونه نرم افزارها چون با حجم داده ها و تراکنش های زیادی مواجه هستند، باید به دنبال پایگاه داده های بسیار قدرمتند باشند. در این زمینه به چز چند انتخاب شامل Oracle، SQL Server و شاید MySQL انتخاب دیگری وجود ندارد.
در این دسته کار ها در اختیار تعدادی شرکت معدود قرار دارد و انها با توجه به نیروری کاری خود یکی از موارد فوق رو انتخاب می کنند.
بحث نصب و نگهداری هم مستقیما توسط مجری انجام میشه و به همین علت به این دسته کاری نداریم.

دسته دوم: نرم افزار های اداری/دفتری
داده های دریافتی این گونه نرم افزارهای با توجه به نوع کار در حد متوسطی قرار دارد.
نرم افزار باید بتواند به صورت شبکه در چند سیستم نصب شده و کار کند.
در چنین مواردی انتخاب های فایل طرح Firebird و PostgreSQL و Blackfish و SQL Server و MySQL هستند.
همانطور که مشخص هست در این دسته گزینه بیشتری برای انتخاب وجود دارد.
بهترین گزینه برای نرم افزارهایی که دارای کاربران شبکه محدود هستند BlackFish و برای تعداد کاربران بیشتر  SQL Server است.

دسته سوم: نرم افزارهای تک نفره
داده های دریافتی این نرم افزارها در حد محدودی قرار دارد. نیازی نیست که نرم افزار به صورت تحت شبکه نیز کار کند.
همانند دسته دوم پایگاه داده های قابل انتخاب زیاد هستند که باید به انها موارد SQLite و Access رو هم اضافه کرد.
اگر وجود امکانات کامل برای پایگاه داده ضروری باشد BlackFish گزینه مناسبی هست در غیر اینصورت SQLlite می تواند گزینه خوبی باشد.

دسته چهار: نرم افزارهای utility یا کاربردی
داده های دریافتی بسیار محدود بوده و ممکن است نیازی به دریافت و دخیره اطلاعات موجود نباشد.
تنها گزینه های قابل استفاده SQLite و Access هستند.

لطفا پایگاه داده مورد استفاده خودتون رو به من در بخش نظر ها اعلام کنید.
پایگاه داده خوبی داشته باشد!

* مطالب مرتبط:
SQLite پایگاه داده ای سبک و چابک





SQLite پایگاه داده ای سبک و چابک

8 09 2008
SQLite Logo

SQLite Logo

SQLite یک پایگاه داده کوچک (حجمی در حدود 500 KB) که به زبان C در قالب یک کتابخانه (Library) نوشته شده است و از پایگاه داده های RDBMS به حساب می آید. این پایگاه داده بدون لیسانس (Public Domain) ، آزاد و open source منتشر می شود.

  • بررسی ویژگیها

برخلاف پایگاه داده های client-server پایگاه داده ی SQLite به عنوان یک پروسه مجزا عمل نمی کند. بلکه به عنوان کتابخانه ای عمل می کند که همراه برنامه انتشار یافته و امکان دسترسی به دیتا را به برنامه می دهد و همانند بخشی از آن عمل می کند.
برنامه می بایست از طریق توابع فراهم شده اقدام به فراخوانی و دسترسی به دیتا نمایند که این نحوه فراخوانی باعث بهینه تر و سریعتر در دسترس قرار گرفتن نتایج خواهد شد. این روش از درخواست به سرویس های دیگر جهت دریافت اطلاعات که سایر پایگاه داده های از آن استفاده می کنند برای داده های کم حجم و پایگاه داده کوچک، بهینه تر است.

تمامی اطلاعات این بانک اطلاعاتی (شامل جداول، تعریفات، دیتا و غیره) در یک فایل که برای تمامی سیستم عامل ها یکسان است ذخیره می شود. این روش یکی از دلایل موفقیت این پایگاه داده به شمار می آید.
SQLite با توجه به نوع ساختاری که دارد تعدادی از ویژگی های استاندارد که در SQL-92 به تصویب رسیده را پشتیبانی نمی کند. شاید بزرگترین این موارد عدم پشتیبانی از توابع و stored procedure ها باشد. سایر موارد استاندارد SQL پیاده سازی شده و در دسترس هستند.
موارد قابل استفاده در این پایگاه داده را می توان trigger ها، View ها و Query های پیچیده نام برد.

یکی از موارد جالب در پیاده سازی SQLite نحوه اعمال نوع داده ها به فیلدها (Columns) است. در این پایگاه داده به جای اختصاص دادن نوع به فیلد مورد نظر که در اکثر پایگاه داده های معتبر از این روش استفاده می شود، فقط نوع به مقدار (value) داده شده اختصاص داده می شود. برای مثال اگر نوع فیلدی Integer تعریف شده باشد و کاربر قصد وارد کردن داده ای از نوع رشته را داشته باشد، موتور پایگاه داده ابتدا سعی خواهد کرد که داده را به نوع Integer تبدیل کند. این باعث افزایش انعطاف پذیری نوع داده های فیلدها می شود. مخصوصا وقتی که نیاز به عمل bind در سایر زبانها به صورت دینامیک مورد نیاز باشد.

  • شیوه مدیریت دسترسی ها

چندین پروسه یا thread می تواند به صورت همزمان به یک پایگاه داده بدون مشکل دسترسی داشته باشد و از آن اطلاعات دریافت نمایند. ولی برای نوشتن اطلاعات فقط یک پروسه امکان دسترسی خواهد داشت. سایر پروسه ها باید منتظر بمانند و یا اینکه با خطا مواجه خواهند شد.

  • ابزارهای توسعه

یکی از مهمترین مزیت های این پایگاه داده امکان استفاده آن در اکثر زبانهای برنامه نویسی است. برنامه های دسترسی به این پایگاه داده در اکثر زبانها نوشته شده است و در دسترس است. برای مشاهده ابزارهای دسترسی به این ادرس مراجعه کنید: http://www.sqlite.org/cvstrac/wiki?p=SqliteWrappers
مهمترین کتابخانه های رابط برای استفاده از SQLite

dotNET Framework: http://sqlite.phxsoftware.com/
dotNET Framework: http://www.mono-project.com/SQLite
Delphi: http://www.aducom.com/
Delpi: http://wikitaxi.org/delphi/doku.php/products/sqlite3/index
C++: http://www.sqliteplus.com/
Java: http://www.ch-werner.de/javasqlite
PHP: SQLite is bundled with PHP 5. http://www.php.net/
Python: http://pysqlite.org/

برای طراحی و ایجاد پایگاه داده SQLite می توانید از ابزارهای زیر استفاده کنید:
SQLite Manager: یک extension برای مرورگر فایرفاکس که با به سادگی امکان دسترسی به تمامی امکانات SQLite رو فراهم می کند. لینک: https://addons.mozilla.org/en-US/firefox/addon/5817

SQLite مورد مقبولیت فراوانی برای استفاده به عنوان یک دیتابیس Embeded قرار گرفته و در پروژه های زیر مورد استفاده قرار گرفته است:

  • FireFox – این مرورگر برای ذخیره اطلاعات خود از SQLite استفاده می کند.
  • Mac OS X – سیستم عامل شرکت Apple به صورت داخلی از SQLite به عنوان یک پایگاه داده استاندارد استفاده می کند.
  • Skype – این نرم افزار چت و گفت و گوی آنلاین که با مقبولیت خوبی روبروست از SQLite استفاده می کند.
  • Symbian – سیستم عامل گوشی های موبایل در نسخه های جدید خود از این پایگاه داده به صورت توکار استفاده می کند.
  • Android – سیستم عامل جدید گوگل برای موبایل
  • iPhone و iPod touch : در این دو دستگاه محصول Apple از این پایگاه داده استفاده شده است.
  • Google Gears – ابزار گوگل برای نوشتن برنامه های تحت وب با استفاده از تکنولوژی های مختلف روز.
  • معایب

در طی آزمایشات گوناگونی که انجام گرفته سرعت این پایگاه داده در مقابله با حجم اطلاعات زیاد مقداری بیش از حد معمول پایین می آید.
عدم امنیت. در این پایگاه داده هیچ روش خاصی برای حفظ امنیت داده های در نظر گرفته نشده است و این مورد می تواند برای ذخیره داده های حساس مشکل ساز شود.

  • سخن آخر

پایگاه داده SQLite یک ابزار کوچک سریع و مطمئن است که برای مقاصد خاص نوشته شده است. از این پایگاه داده می توانید برای سیستم های Embeded استفاده کنید. یا برای نزم افزار های کوچک و تک کاربره خود تا خود را از شر مشکلات انتشار پایگاه داده های بزرگ همراه نرم افزار خود دور بمانید.
همچنین این یک گزینه فوق العاده برای کسانی است که از access صرفا برای پایگاه داده خود استفاده می کنند.

  • منابع مفید

سایت اصلی: http://www.sqlite.org
دانلود نسخه اصلی: http://www.sqlite.org/download.html
ویژگی های حذف شده از SQL استاندارد: http://www.sqlite.org/omitted.html
ویژگی های پیاده سازی شده: http://www.sqlite.org/lang.html