بازگشت به کتابخانهکتابخانه3.1SQL در برابر NoSQL
طراحی سیستم نرم‌افزاریSYSTEM DESIGNاز صفر تا تسلط
v1.0.0
01مبانی و تصویر بزرگ
02Scalability و ظرفیت
03لایه داده
04Cache، Queue و جریان
05معماری نرم‌افزار
06قابلیت اطمینان و عملیات
07متد طراحی
08Case Study های واقعی
09سیستم‌های توزیع‌شده عمیق
10مهندسی تولید: داده، امنیت و کارایی
11تمرین پیشرفته و کیس‌استادی‌های مکمل
12زیر کاپوت دیتابیس و معماری داده
13وب بلادرنگ و پروتکل‌های مدرن
14سیستم‌های توزیع‌شده پیشرفته
15SaaS ،SRE ،امنیت و شبکه پیشرفته
16طراحی سیستم در عصر AI
17Case Study های تکمیلی
LESSON 3.1فصل ۳لایه داده

SQL در برابر NoSQL

  • ~۱۱ دقیقه
  • ۴ پرسش
  • متن را انتخاب کن تا هایلایت شود

فرض کن دفتر یک بانک را می‌چینی. پول را نمی‌شود در پوشه شل‌وول گذاشت: هر برداشت باید به یک حساب وصل باشد، و دو نفر همزمان نتوانند همان موجودی را دوبار بردارند. برای این کار یک دفتر ستونی با قاعده می‌سازی. اسم این دفتر در نرم‌افزار RDBMS است — همان خانواده SQL.

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

دفتر بانک در برابر کمدهای جدا
چپ: دفتر ستونی با قاعده — هر ردیف به ردیف دیگر وصل است. راست: کمد قفل‌دار، پوشه آزاد، نقشه رابطه. SQL یک شغل دارد؛ NoSQL چند کمد جدا با شغل جدا.

پیش‌فرض، و وقتی از آن جدا می‌شوی

قاعده ساده است: اول SQL. NoSQL را وقتی می‌آوری که یک دلیل مشخص داشته باشی — مقیاس نوشتن عظیم، مدل داده خاص، یا Schema که مدام عوض می‌شود. محبوبیت ابزار دلیل نیست. اگر قاطی کنی، یا JOIN را جایی می‌خواهی که وجود ندارد، یا تراکنش پول را به جایی می‌سپاری که قولش را نمی‌دهد.

RDBMSPostgreSQL, MySQL
شغلش نگه داشتن داده با رابطه و قاعده است. JOIN بلدی، تراکنش ACID مفت است، کوئری قدرتمند. تا مقیاس‌های بزرگ — با Replica و شاید بعداً Shard — جواب می‌دهد.
ACID
چهار قول همان دفتر. Atomicity یعنی همه یا هیچ. Isolation یعنی دو تراکنش همزمان اثر نیمه‌کاره هم را نبینند. Durability یعنی نوشته با قطع برق گم نشود. قواعد داده را هم همین دفتر نگه می‌دارد.

چهار خانواده NoSQL — هر کدام یک شغل

NoSQL یک ابزار نیست. چهار جور کمد جداست. کمد را از روی کاری که داده انجام می‌دهد انتخاب می‌کنی، نه از روی اسم مد روز.

نوعنمونهشغلش
Key-ValueRedis, DynamoDBجعبه را فقط با شماره قفل برمی‌داری: Cache، session، شمارنده، آخرین وضعیت.
DocumentMongoDBیک پوشه خودکفا با برگه‌های متغیر: پروفایل، کاتالوگ. Schema سفت نمی‌خواهد.
Wide-ColumnCassandra, HBaseنوشتن سیل‌آسا و سری‌زمانی: پیام، لاگ، لوکیشن. Horizontal Scaling بومی است.
GraphNeo4jنقشه رابطه: چه کسی که را می‌شناسد، تقلب، پیشنهادگر. پیمایش عمیق، نه جدول پهن.

چطور انتخاب می‌کنی؟

سؤال این نیست «کدام دیتابیس بهتر است؟» سؤال این است این داده چه قولی می‌خواهد، و با چه کلیدی خوانده می‌شود.

  • سفارش، پرداخت، موجودی → SQL. ACID را مفت می‌گیری؛ این‌جا آزمایشگاه NoSQL نیست.
  • نوشتن بی‌امان، کوئری ساده و ازپیش‌معلوم → Wide-Column.
  • دسترسی فقط-با-کلید و Latency زیر میلی‌ثانیه → Key-Value در RAM.
  • الگوی رایج سیستم بزرگ: Polyglot — هر داده در ابزار خودش: سفارش در PostgreSQL، session در Redis، پیام در Cassandra، جستجو در Elasticsearch.

به زبان ساده

دفتر بانک برای پول SQL است؛ کمدهای دیگر برای کار دیگر. NoSQL را با دلیل می‌آوری، نه با مد.

مثال واقعی

سفارش و پرداخت در SQL می‌روند چون تراکنش مهم است؛ آخرین جای پیک در Redis می‌رود چون فقط با شماره پیک خوانده می‌شود.

دانش‌سنجی

آزمون درس

۴ Q
01
برای سیستم پرداخت با تراکنش مالی، پیش‌فرض عاقلانه کدام است؟
02
ذخیره «آخرین لوکیشن ۲۰۰ هزار راننده» با خواندن و نوشتن دائم و دسترسی با ID راننده — بهترین ابزار؟
03
Denormalize کردن داده در NoSQL یعنی چه و چرا؟
04
Isolation در ACID چه چیزی را تضمین می‌کند؟