مروری بر چند تجربه‌ی کاری با 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 برای دیتابیسی تا حدود یک گیگ که فقط یک نفر قرار باشد از آن استفاده کند انتخاب بسیار مناسبی است (برای مثال فایرفاکس از آن برای ذخیره سازی تنظیمات خودش استفاده می‌کند).

  • #
    ‫۱۴ سال و ۶ ماه قبل، دوشنبه ۲۷ اردیبهشت ۱۳۸۹، ساعت ۱۹:۵۵
    سلام جناب نصیری عزیز
    مطلب بسیار خوبی بود و تلنگر خوبی بود برای من. از مطلب بسیار خوبتون و نکات و ملاحظاتتون در مورد استفاده از این ابزار سپاسگزارم و براتون بهترین آرزوها رو دارم.
  • #
    ‫۱۴ سال و ۶ ماه قبل، سه‌شنبه ۲۸ اردیبهشت ۱۳۸۹، ساعت ۱۳:۴۴
    با سلام خدمت جناب نصیری
    جای تقدیر و تشکر است ازین وبلاگ و حرکت بزرگ. ازین همه تجربه ای که با دیگران به اشتراگ می گذارید کمال تشکر رو دارم. امیدوارم در این مسیر همواره موفق بوده باشین. با بهترین آرزوها
  • #
    ‫۱۴ سال و ۶ ماه قبل، سه‌شنبه ۲۸ اردیبهشت ۱۳۸۹، ساعت ۱۷:۵۹
    سلام، ممنون. لطف دارید.
  • #
    ‫۱۴ سال و ۶ ماه قبل، چهارشنبه ۲۹ اردیبهشت ۱۳۸۹، ساعت ۲۳:۰۸
    با سلام و تشکر ا مطالب خوبتون.
    در مورد کلمه عبور وقتی که شما از Provider دات نت استفاده میکنید به شما اجازه استفاده از یک کلمه عبور برای Encryption را میدهد که کل اطلاعات را کد گذاری میکند که تجربه من نشان میدهد بهتر است این کار قبل از ورود اطلاعات صورت گیرد .مخصوصا وقتی که فیلد از نوع باینری دارید. درباره Access هم میدونم که درباره Access 2003 و به پایین منظورتون بوده که کلمه عبور را میتوان برداشت چون تا اونجا که من میدونم در Access 2007 امنیت به مراتب بالاتر هستش.
    در کل SQLite برای کارهای کوچک مناسب هستش ولی ون خودم VistaDB را بیشتر ترجیح میدهم.
  • #
    ‫۱۴ سال و ۶ ماه قبل، چهارشنبه ۲۹ اردیبهشت ۱۳۸۹، ساعت ۲۳:۵۶
    - خیر. تمام نگارش‌های Access مد نظر بودند. برای نمونه به برنامه معروف زیر مراجعه کنید :
    http://www.elcomsoft.com/aopr.html
    - در مورد رمزنگاری هم بله. یک ماژول تجاری همانطور که عرض کردم توسط نویسنده‌ی اصلی آن فروخته می‌شود یا پروایدری که شما عنوان کردید هم با استفاده از windows crypto api ، رمزنگاری را اعمال می‌کند که در این حالت دیتابیس شما فقط منحصر به ویندوز خواهد شد و برای استفاده از آن در MONO مشکل خواهید داشت.
  • #
    ‫۱۴ سال و ۶ ماه قبل، پنجشنبه ۳۰ اردیبهشت ۱۳۸۹، ساعت ۲۱:۰۵
    آقا وحید سلام.
    من برنلمه شرکت elcom نسخه Pro با سریال را تهیه کردم و حسابی تستش کردم.
    حق با من بود برنامه‌ای نیست که بتونه کلمه عبور Access 2007 را بلافاصله پیدا کنه.این برنامه هم که مدعی این کار بود از تکنیک جستجو،حدس،و کتابخانه برای پیدا کردن کلمه عبور استفاده میکنه که البته سرعت باورنکردنی داره ولی اگر شما کلمه عبور بالای 6 حرف در نظر بگیرید یا برای اطمینان 100% از پیدا نشدن کلمه عبور آن را فارسی در نظر بگیرید این برنامه هم کاری نمیتونه انجام بده و یا حداقل از حوصله شما خارج خواهد شد.
  • #
    ‫۱۴ سال و ۶ ماه قبل، پنجشنبه ۳۰ اردیبهشت ۱۳۸۹، ساعت ۲۲:۴۳
    بله. به نظر در 2007 این کسری از ثانیه کمی بیشتر شده:)
    چون از یک الگوریتم رمزنگاری به نام RC4 استفاده می‌کنه و پسورد هم همانند نگارش‌های قبلی در این فایل ذخیره نمی‌شه. البته این شرکت مدعی شده که تا 48 ساعت هر طولی رو می‌تونه بشکنه:
    lastbit.com/access
  • #
    ‫۱۴ سال و ۶ ماه قبل، جمعه ۳۱ اردیبهشت ۱۳۸۹، ساعت ۰۰:۳۳
    من امتحان کردم ولی نتونست یک رمز 5 کارکتری را که البته فارسی هم بود پیدا کنه.تو تنظیماتش هم اجازه دادم تمامی کارکترها را استفاده کنه.راستی نظرتون در مورد Firebird چی هستش به نظر گزینه خوبی میاد.
  • #
    ‫۱۴ سال و ۲ ماه قبل، یکشنبه ۱۴ شهریور ۱۳۸۹، ساعت ۰۲:۳۸
    سلام آقای نصیری
    من در حال نوشتن نرم افزاری هستم که در بالاترین حد حجم اطلاعاتی اون از 500 مگابایت افزایش پیدا نیمکنه ولی تو اون اطلاعاتش کوئری های سنگینی داره
    چون من تجربه کار با SQLLiteرو ندارم آیا شما استفاده از اون رو در این برنامه توصیه می کنید ؟
  • #
    ‫۱۴ سال و ۲ ماه قبل، یکشنبه ۱۴ شهریور ۱۳۸۹، ساعت ۰۲:۴۵
    سلام،
    بله. تا این حد رو خوب جواب میده. البته مکانیزم‌های کش کردن اطلاعات رو باید خودتون در نظر داشته باشید و پیاده سازی کنید.
    ضمنا استفاده از SQL Server Compact Edition را هم مدنظر داشته باشید (اگر کار شما فقط ویندوزی است)؛ نسخه‌ی جدید آن قرار است از Entity framework پشتیبانی کند و مشکلات استفاده چند کاربری را هم نخواهد داشت و برای ASP.NET بهینه سازی شده؛ هر چند برای SQLite هم اکنون پروایدر EF موجود است.
  • #
    ‫۱۴ سال و ۲ ماه قبل، یکشنبه ۱۴ شهریور ۱۳۸۹، ساعت ۲۳:۲۸
    بله نرم افزار فعلا فقط ویندوزی است ولی در آینده انشالله با Qt دوباره می نویسمش 8)
    فکر کنم از پروایدر DevArt استفاده کنم جواب بده.
    ممنون از توجهتون
  • #
    ‫۱۲ سال و ۲ ماه قبل، جمعه ۲۷ مرداد ۱۳۹۱، ساعت ۰۷:۱۰
    با سلام خدمت استاد عزیز.
    من یه برنامه نوشتم که از بانک sqlite استفاده میکنه.
    وقتی برناه رو توزیع میکنم روی بعضی از سیستم‌ها پیغامی مبنی بر عدم پیدا کردن dll مذکور رو میده، به نظر شما مشکل از کجاست ؟
    • #
      ‫۱۲ سال و ۲ ماه قبل، جمعه ۲۷ مرداد ۱۳۹۱، ساعت ۱۲:۵۱
      پیشنیاز : «آیا برنامه نویس‌های دات نت باید نگران دنیای 64 بیتی باشند؟»
      SQLite یک بانک اطلاعاتی native است. بنابراین نیاز است دو نسخه 64 بیتی و 32 بیتی آن به همراه برنامه شما توزیع شود.
      یا اینکه می‌تونید در تنظیمات پروژه، target platform رو روی X86 قرار بدید. به این صورت روی تمام سیستم‌ها X86 اجرا می‌شود و نیازی به توزیع X64 آن نیست.
  • #
    ‫۶ سال و ۴ ماه قبل، پنجشنبه ۱۷ خرداد ۱۳۹۷، ساعت ۱۷:۲۵
    به روز رسانی
    - SQLite 3.6.19 به بعد از کلیدهای خارجی پشتیبانی می‌کنند.
    - در مورد مباحث همزمانی، Microsoft.Data.Sqlite پشتیبانی خوبی را از این مساله دارد (default mode: serialized به صورت توکار توسط مایکروسافت کامپایل شده و ارائه می‌شود).
    - رمزنگاری نیز توسط Microsoft.Data.Sqlite پشتیبانی می‌شود: EncryptionSample 
    - در مورد مرتب سازی نیز امکان تعریف custom collation در Microsoft.Data.Sqlite پیش بینی شده‌است.
  • #
    ‫۵ روز قبل، دوشنبه ۹ مهر ۱۴۰۳، ساعت ۱۲:۰۷
    چند سال بعد ...!

    2- اگر از EF-Core استفاده می‌کنید، رشته‌ی اتصالی نهایی آن (که در پشت صحنه تنظیم می‌شود) به همراه تنظیم فعالسازی کلیدهای خارجی نیز هست و نیازی نیست تا تنظیم foreign keys=true به آن اضافه شود.
    3- در بانک‌های اطلاعاتی جدید SQLite، حالت WAL فعال است و این مورد دسترسی همزمان به آن‌را بدون بروز مشکل قفل بودن بانک اطلاعاتی میسر می‌کند.