۱۳۸۹/۰۲/۲۷

مروري بر چند تجربه‌ي كاري با SQLite





SQLite بانك اطلاعاتي سريع، كم حجم و سورس بازي است كه استفاده از آن در دات نت فريم ورك بسيار ساده است. فقط كافي است پروايدر مربوط به آن را دريافت كنيد و در كدهاي قديمي خود هر جايي مثلا sqlconnection داشتيد آن‌را تبديل به sqliteconnection كنيد و امثال آن (به بيان ديگر، پروايدر تهيه شده از معماري ADO.NET پيروي مي‌كند و عملا دانش قبلي شما به سادگي قابل استفاده و ارتقاء است). علاوه بر آن پروايدر ADO.NET‌ تهيه شده براي آن، پشتيباني از Entity framework را هم ارائه مي‌دهد.
اين ديتابيس تحت سيستم عامل‌هاي مختلف مهيا است و مهم‌ترين مزيت آن عدم نياز به نصب آن مي‌باشد.

مزايا:
- سورس باز و رايگان
- مهيا بودن آن در ساير پلتفرم‌ها (ويندوز، لينوكس و ...)
- نيازي به نصب ندارد و فقط يك DLL بومي است. اين مورد براي كاربراني كه در مديريت بانك‌هاي اطلاعاتي پيچيده مشكل دارند، يك مزيت مهم است.
- امكان تشيكل ديتابيس در حافظه. اين نكته و توانايي، در آزمون‌هاي واحد بسيار جالب توجه است. مي‌توانيد با سرعت بالا ديتابيسي واقعي را در حافظه تشكيل داده، كليه آزمون‌هاي واحد خود را اجرا كرده و پس از پايان كار، اثري از ديتابيس و تغيير داده‌ها و مشكلات بازگرداني اطلاعات به حالت اول وجود نخواهد داشت.


ملاحظات:
الف) مرتب سازي SQLite حساس به حروف كوچك و بزرگ است.
براي برگشت به عادت متداولي كه وجود دارد مي‌شود به صورت زير عمل كرد:
select f1 from tbl1 order by f1 COLLATE NOCASE
يك COLLATE NOCASE اضافه شده است.

ب) رعايت نكات مرتبط با سيستم‌هاي 64 بيتي
در مورد سيستم‌هاي 64 بيتي و دات نت قبلا مطلبي را نوشته بودم : {+}. اين مطلب دقيقا اينجا كاربرد پيدا مي‌كند، از اين لحاظ كه SQLite يك بانك اطلاعاتي Native است. اگر برنامه‌ي دات نت شما براي حالت Any CPU تهيه شده است، در سيستم‌هاي 32 بيتي نياز است تا DLL مرتبط SQLite را توزيع كنيد و در سيستم‌هاي 64 بيتي DLL مرتبط 64 بيتي آن نياز خواهد بود. در غيراينصورت برنامه‌ي شما در بدو امر كرش كرده و اجرا نخواهد شد.

مشكلات:
الف) كليد خارجي بي خاصيت!
SQLite از كليد خارجي پشتيباني مي‌كند اما آن‌را اعمال نمي‌كند! براي اينكه كليد خارجي را اعمال كنيد بايد خودتان تريگر بنويسيد تا اين‌كار را انجام دهد.

ب) پشتيباني در حد صفر از مباحث همزماني و تردينگ.
اگر برنامه شما مالتي ترد است، در بد مخمصه‌اي گرفتار شده‌ايد. مدام با پيغام database is locked مواجه خواهيد شد. (چه انتظاري داشتيد؟ يك dll كمتر از 2 مگابايت كه قرار نيست كار غول‌هاي ديتابيسي را انجام دهد)
بنابراين اصلا تصورش را هم نكنيد كه از اين ديتابيس به عنوان بانك اطلاعاتي يك سايت (و محيط‌هاي چند كاربره) بتوان استفاده كرد و كاربران دچار مشكل نشوند.

ج)حجم بالاي ديتابيس و عدم كش
از مباحث caching كه در ديتابيس‌هاي معظم ديگر به صورت توكار وجود دارد خبري نيست. براي مثال اگر يك كوئري قرار است تعدادي را شمارش نمايد، حاصلي كش نشده و اگر صدبار هم به صورت متوالي آن‌را فراخواني كنيد باز هم از نو محاسبات آن انجام خواهد شد.
اين مورد در حجم بالاي ديتابيس واقعا مهم است و نمودش را با ديتابيسي با حجم بالاي يك گيگ به وضوح مشاهده خواهيد. افت كارآيي و همچنين قرچ و قرچ مداوم هارد ديسك سيستم! (چون به كش رجوع نمي‌شود)

د) امنيت
روي بانك‌هاي اطلاعاتي اكسس حداقل مي‌توان يك كلمه‌ي عبور را قرار داد (كه در كسري از ثانيه قابل شكستن است!). در SQLite استاندارد هيچ خبري از اين مباحث نبوده و امنيت را بايد خودتان تامين كنيد. (البته يك نسخه‌ي تجاري هم از اين بانك اطلاعاتي با پشتيباني از رمزنگاري اطلاعات موجود است : +)

ه) مرتب سازي فارسي
هر چند SQLite هيچ مشكلي در ثبت اطلاعات يونيكد و خصوصا متون فارسي ندارد، اما با مرتب سازي كلمات يونيكد مشكل داشته و بر اساس كد اسكي آن‌ها عمل مي‌كند. هر چند امكان تعريف Collation سفارشي در آن ممكن است : + (البته ممكن بودن با موجود بودن متفاوت است)


نتيجه گيري:
- SQLite براي ديتابيسي تا حدود يك گيگ كه فقط يك نفر قرار باشد از آن استفاده كند انتخاب بسيار مناسبي است (براي مثال فايرفاكس از آن براي ذخيره سازي تنظيمات خودش استفاده مي‌كند).