وقتی اپلیکیشنی که با هوش مصنوعی ساختهاید واقعاً به یک دیتابیس واقعی نیاز دارد (و وقتی ندارد)
دیتابیس زمانی ضروری میشود که دو نفر همزمان اپلیکیشن شما را ویرایش کنند، وقتی با رشد دادهها سرعت اپلیکیشن پایین بیاید، یا وقتی نیاز داشته باشید رکوردها را با بیش از یک شرط فیلتر کنید — فایلها نمیتوانند این کار را با امنیت انجام دهند.
دیتابیس واقعاً چه کاری انجام میدهد؟
تمام وظیفهی یک دیتابیس این است که مطمئن شود دو نفر هنگام استفاده از یک اپلیکیشن بهطور تصادفی کار یکدیگر را رونویسی یا نابود نمیکنند — سرعت، ساختار و جستوجوی پیچیده فقط عوارض جانبیِ حل همین یک مسئله هستند.
شما اپلیکیشنتان را با هوش مصنوعی ساختهاید. کار میکند. دادهها را در فایل یا یک صفحهگسترده ذخیره میکند. همهچیز خوب به نظر میرسد.
بعد یکی از این دو اتفاق میافتد:
- هر بار که کسی از اپلیکیشن استفاده میکند، سرعت آن کمتر میشود.
- دو کاربر همزمان میخواهند از آن استفاده کنند و چیزی خراب میشود.
هیچکدام از این خرابیها تا وقتی خیلی دیر نشده، آشکار نیستند. هر دو در واقع مشکلات دیتابیس هستند که لباس مبدل پوشیدهاند.
اگر هنوز از فایل یا صفحهگسترده استفاده میکنید، احتمالاً هنوز دیتابیسی ندارید. و این اشکالی ندارد. اما باید نشانههای هشداردهندهای را بشناسید که میگویند بهزودی به یکی نیاز خواهید داشت.
چه زمانی استفاده از فایل بهجای دیتابیس اشکالی ندارد؟
تا زمانی که شما تنها کاربر اپلیکیشن هستید و تغییرات بهندرت اتفاق میافتند، فایلها بهخوبی کار میکنند — کل معیار سنجش همین است.
سایت نمونهکار یک فریلنسر؟ فایلها عالیاند. یک ابزار شخصی برای پیگیری هزینهها؟ فایلها کافیاند. یک پروژهی سرگرمی با یک کاربر؟ کار را پیچیده نکنید.
نشانههای واقعی اینکه فایلها هنوز جواب میدهند:
- فقط یک نفر در هر لحظه از اپلیکیشن استفاده میکند (یا وقتی یکی کار میکند، بقیه آفلاین هستند).
- دادهها را بهندرت بهروزرسانی میکنید (روزی یکبار، هفتهای یکبار، ماهی یکبار).
- از دست رفتن کار ۳۰ ثانیهی آخر قابلقبول است (سازندهی شما میتواند دوباره امتحان کند).
- فایل داده بهقدری کوچک است که بتوان آن را ایمیل کرد (کمتر از ۱۰ مگابایت).
اگر هر چهار مورد صادق است، همان فایلها را نگه دارید. جدی میگویم. سادگی یک مزیت است، نه یک محدودیت.
چرا اپلیکیشنی که با هوش مصنوعی ساختهام کند شده است؟
اپلیکیشن شما به این دلیل کند میشود که فایلی که در آن ذخیره میکند دائماً بزرگتر میشود، و سازندهی شما هر بار که لازم است چیزی را تغییر دهد، کل فایل را در حافظه بارگذاری میکند — هزینهای که در ابتدا تقریباً محسوس نیست اما با بزرگتر شدن فایل، دردسرساز میشود.
این را بهصورت یک حس متوجه میشوید. اپلیکیشنتان حس میکنید کندتر از قبل شده. کلیک روی یک دکمه یک ثانیهی اضافه طول میکشد. جستوجو بهطور محسوسی کندتر است. کدی را تغییر ندادهاید — پس چرا کند شده؟ الگو این است:
- اپلیکیشن کل فایل داده را بارگذاری میکند (۱۰۰ خط، سریع).
- کاربر یک رکورد اضافه میکند (حالا ۱۰۱ خط).
- اپلیکیشن برای اطمینان، کل فایل را دوباره میخواند (هنوز سریع است).
- بعد از ۲٬۰۰۰ رکورد، خواندن فایل ۲ ثانیه طول میکشد.
- بعد از ۱۰٬۰۰۰ رکورد، این کار ۲۰ ثانیه طول میکشد.
این روند نمایی نیست، اما حدود ۵٬۰۰۰ رکورد محسوس میشود و حدود ۲۰٬۰۰۰ رکورد دردسرساز میگردد.
اولین راهحل (قبل از اضافه کردن دیتابیس): از سازندهتان بخواهید دادهها را بر اساس نیاز بارگذاری کند. فقط رکوردهایی را بارگذاری کند که نمایش میدهید، یا فقط ستونهایی را که نشان میدهید. بسیاری از اپلیکیشنها میتوانند با هوشمندتر شدن در آنچه بارگذاری میکنند، همچنان روی فایل باقی بمانند.
چه زمانی به دیتابیس مهاجرت کنیم: وقتی بیش از ۵۰٬۰۰۰ رکورد داده دارید، یا حتی بعد از بهینهسازی بارگذاریها هم کندی باقی میماند.
چرا وقتی دو نفر همزمان از اپلیکیشنم استفاده کردند، داده از دست رفت؟
این اتفاق میافتد چون دو نفر میتوانند همزمان یک فایل را ویرایش کنند و اپلیکیشن هیچ راهی برای فهمیدن این موضوع ندارد — هر کس دومین نفری باشد که ذخیره میکند برنده میشود، و تغییرات نفر اول بیسروصدا ناپدید میشوند. به این میگویند «نوشتن متعارض» (conflicting write)، و یک باگ کلاسیک از دست رفتن داده است.
هر دو نفر تغییرات خودشان را روی صفحهشان میبینند. هر دو روی «ذخیره» کلیک میکنند. اگر موارد زیر را ببینید، یعنی این اتفاق در حال رخ دادن است:
- کاربران هر از گاهی گزارش میدهند دادهای گم شده (بهخصوص اگر چند نفر همزمان در اپلیکیشن باشند).
- کاربران گزارش میدهند که تغییرات دیگران بدون هیچ توضیحی «برگردانده» شده است.
- دو کاربر یک رکورد را ویرایش میکنند و ویرایشهای یکی از آنها ناپدید میشود.
- پیامهایی مثل «قسم میخورم دیروز این را اضافه کردم و حالا نیست» دریافت میکنید.
این تقصیر اپلیکیشن نیست. این محدودیتِ نحوهی کار کردن فایلهاست. بدون دیتابیس، هیچ راه خوبی برای مدیریت این مشکل وجود ندارد.
چه زمانی به دیتابیس مهاجرت کنیم: بهمحض اینکه دو نفر همزمان از اپلیکیشن استفاده میکنند، حتی اگر هنوز خرابی رخ نداده باشد.
چرا اپلیکیشنم نمیتواند با فایلها جستوجوهای پیچیده انجام دهد؟
چون با فایلها، سازندهی شما باید هر مجموعهدادهی مرتبط را دستی و مرحلهبهمرحله بارگذاری و فیلتر کند، بهجای اینکه فقط یک سؤال بپرسد و یک جواب بگیرد — یک دیتابیس همین کار را با یک کوئری و در چند میلیثانیه انجام میدهد.
فرض کنید میخواهید «تمام فاکتورهای پرداختنشدهی مشتریانِ کالیفرنیا را که در هفتهی گذشته با آنها تماس گرفته نشده» پیدا کنید. با فایلها، سازندهی شما باید:
- همهی فاکتورها را بارگذاری کند.
- آنها را بر اساس unpaid = true فیلتر کند.
- همهی مشتریان را بارگذاری کند و بر اساس ID تطبیق دهد.
- آنها را بر اساس state = “CA” فیلتر کند.
- همهی رکوردهای تماس را بارگذاری کند و بر اساس ID مشتری تطبیق دهد.
- آنها را بر اساس date > یک هفتهی پیش فیلتر کند.
با یک دیتابیس، شما فقط یک کوئری مینویسید و همهی این کار در چند میلیثانیه انجام میشود.
چه زمانی به دیتابیس مهاجرت کنیم: وقتی سازندهی شما میگوید «برای پاسخ به این سؤال باید کد اختصاصی بنویسم.» یا وقتی متوجه میشوید اپلیکیشن فقط برای نشان دادن دادههای فیلترشده، کار زیادی انجام میدهد.
وقتی به دیتابیس نیاز دارم، به سازندهام چه بگویم؟
بهسادگی بگویید مشکل چیست و یک برنامه بخواهید — چیزی شبیه این: «اپلیکیشن دارد [کندتر میشود / داده گم کرده / به جستوجوهای پیچیدهتری نیاز دارد]. فکر میکنم باید دیتابیس اضافه کنیم. این چقدر تغییر بزرگی است؟»
بیشتر سازندهها میتوانند یک اپلیکیشن کوچک را در ۱ تا ۲ روز از فایل به دیتابیس منتقل کنند، و برای اپلیکیشنهای بزرگتر چند روز طول میکشد. فرایند به این شکل است:
- اپلیکیشن را عمدتاً همانطور که هست نگه دارید (کاربران تغییر بزرگی نمیبینند).
- یک بکاند دیتابیسی وصل کنید (از دید بقیهی کد هنوز شبیه فایل است، اما زیرش یک دیتابیس است).
- آن را کاملاً تست کنید (چون جابهجایی داده کاری حساس است).
- برای یک هفته هر دو را موازی اجرا کنید تا مطمئن شوید.
ممکن است سازنده از شما این سؤالها را بپرسد:
- «باید از PostgreSQL، MySQL یا چیز دیگری استفاده کنیم؟»
- پاسخ شما: «هرچه با آن راحتتری. من فرقشان را نمیدانم، اما به تو اعتماد دارم.»
- «این کار ۳ روز طول میکشد. ارزشش را دارد؟»
- پاسخ شما: «اگر به هر حال باید این کار را انجام دهیم، هرچه زودتر بهتر است تا وقتی دادهی بیشتری داریم.»
- «دادههای قدیمی را هم منتقل کنیم؟»
- پاسخ شما: «بله، مگر اینکه کمتر از ۱۰۰ رکورد باشد، که در آن صورت شروع از صفر هم اشکالی ندارد.»
آیا لازم است خودم دیتابیسها را بفهمم؟
نه — لازم نیست بدانید دیتابیس چیست، SQL یاد بگیرید، یا PostgreSQL را با MySQL مقایسه کنید. تنها چیزی که باید به سازندهتان بگویید این است: «دو نفر باید بتوانند همزمان از اپلیکیشن استفاده کنند بدون اینکه کار یکدیگر را از دست بدهند.»
همین. سازندهی شما میتواند دیتابیس را انتخاب کند. یک گزینهی ساده مثل SQLite (برای یک اپلیکیشن شخصی یا تیمی با کمتر از ۱۰ کاربر همزمان) یا PostgreSQL (برای هر چیز بزرگتر) — هر دو این کار را انجام میدهند.
چطور بفهمم اپلیکیشنم به دیتابیس نیاز دارد؟
ببینید کدامیک از این چهار مورد در مورد شما صدق میکند — اگر دو مورد یا بیشتر را علامت زدید، یعنی وقتش رسیده که همین حالا دیتابیس اضافه کنید.
- کندی: اپلیکیشن ۳ ماه پیش سریعتر بود، حالا کندتر حس میشود. فایل داده بیش از ۲۰ مگابایت است یا بیش از ۱۰٬۰۰۰ رکورد دارد.
- از دست رفتن داده: تغییرات کسی ناپدید شده، یا چند کاربر گزارش دادهاند ویرایشهایشان گم شده است.
- پیچیدگی: میخواهید سؤالاتی مثل «X را بر اساس Y فیلترشده نشانم بده» بپرسید و سازنده میگوید «این کار با فایل سخت است.»
- کاربران: بیش از یک نفر همزمان از اپلیکیشن استفاده میکنند (حتی گاهبهگاه).
اگر دو مورد یا بیشتر را علامت زدید، اپلیکیشن شما برای دیتابیس آماده است.
اگر هیچ موردی را علامت نزدید، فایلهای شما خوب کار میکنند. آنها را نگه دارید. سادگی ارزشمند است.
اگر یک مورد را علامت زدید، از سازندهتان بپرسید: «آیا این وضعیت بهقدری کافی است که بتوانیم ۶ ماه دیگر هم با آن سر کنیم؟» اگر بله، صبر کنید. اگر نه، همین حالا مهاجرت کنید.