ماهان فرزانه
ماهان فرزانه
خواندن ۶ دقیقه·۳ سال پیش

بازنویسی یک سیستم مدیریت پایگاه داده(dbms) مشابه mongodb در Rust - قسمت اول

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


در این مطالب منظور از عبارت "دیتابیس"، سیستم مدیریت دیتابیس می باشد.

اختراع دوباره چرخ

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

نسخه مدرن تر C

بسیاری از نرم افزار های سیستمی با استفاده از زبان برنامه نویسی C نوشته شده اند. این زبان قدرت بسیار بالایی دارد و به دلیل نزدیک بودن به سخت افزار انتخابی مناسب برای نوشتن سیستم های پایه و نرم افزار های بنیادی می باشد اما مشکلاتی نیز دارد. زبان برنامه نویسی Rust برخی از این مشکلات را رفع می کند. Rust امکان memory leak را به شدت کاهش می دهد و پکیج منیجر Cargo که به صورت پیشفرض با این زبان می آید نصب کتابخانه های مختلف را بسیار ساده می کند. در تصویر زیر مقایسه این زبان با زبان C را مشاهده می کنید.

https://prataprc.github.io/rust-over-c.html
https://prataprc.github.io/rust-over-c.html

برای اطلاعات بیشتر در مورد این زبان و امکانات آن به لینک زیر مراجعه کنید.

https://www.rust-lang.org/

همه این امکانات Rust را به انتخابی مناسب برای این پروژه تبدیل می کند. هر چند برای یادگیری و آزمایش برخی از بخش های برنامه می توانیم از زبان های دیگر حتی python نیز استفاده کنیم.

دیتابیس های ذخیره اسناد

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

  • Relational Database
  • NoSQL databases
  • Cloud databases
  • Columnar databases
  • Wide column databases
  • Object-oriented databases
  • Key-value databases
  • Hierarchical databases
  • Document databases
  • Graph databases
  • Time series databases

امروزه پرکاربرد ترین انواع دیتابیس ها، دیتابیس های رابطه ای مانند mySQL و PostgreSQL، دیتابیس های کلید و مقدار مانند Redis و دیتابیس های مبتنی بر اسناد مانند mongodb می باشند. مدت زیادی است که از دیتابیس های رابطه ای برای ذخیره داده های برنامه های کاربردی استفاده می شود این دیتابیس ها از ساختار مشخصی پیروی می کنند به همین دلیل باید قبل از وارد کردن داده به آن ها، این ساختار مشخص شود تا فقط داده هایی که پیرو این ساختار هستند بتوانند در آن ذخیره شوند. این نوع از دیتابیس که معمولا به صورت جدولی می باشد، برای ذخیره داده هایی که وابستگی زیادی به هم دارند مناسب است. اما مشکل اصلی در زمان توسعه آن ها به وجود می آید؛ به علت وابستگی که هر جدول از داده ها به هم دارند نگه داری این جداول در سیستم های دیگر دریافت و سپس ترکیب داده ها را بسیار کند، می کند. پس در صورت نیاز برای توسعه فضا و قدرت پردازشی دیتابیس های رابطه ای باید به تعداد هاردیسک های سیستم (ssd or hdd) و یا مقدار رم سیستم اضافه کنیم. البته که راهکار هایی برای رفع این مشکل وجود دارد.

دیتابیس های مبتنی بر اسناد مشکلات توسعه را در دیتابیس های رابطه ای، رفع می کنند زیرا در این نوع از دیتابیس ها می توان داده ها را در سیستم های مختلف ذخیره کرد و سپس با استفاده یک سیستم مدیریت مرکزی داده های مورد نیاز را دریافت نمود. داده های ذخیره شده در این دیتابیس ساختار خاصی ندارند و مانند شئ های json ذخیره می شوند. این داده ها می توانند کلید های مختلفی داشته باشند و حتی از انواع مختلف باشند. یکی از بزرگترین سیستم های مدیریت دیتابیس که با این روش داده ها را ذخیره می کند mongodb می باشد. در این پروژه قصد داریم یک نسخه بسیار ساده از این دیتابیس را پیاده سازی کنیم.

مطالبی که برای شروع باید بدانیم

داده ها در mongodb به صورت اسناد ذخیره می شوند در اینجا منظور از سند object هایی از نوع JSON می باشد. شکل کلی این داده ها به شکل زیر است :

{ &quotname&quot: &quotMadame Uppercut&quot, &quotage&quot: 39, &quotsecretIdentity&quot: &quotJane Wilson&quot, &quotpowers&quot: [ &quotMillion tonne punch&quot, &quotDamage resistance&quot, &quotSuperhuman reflexes&quot ] }

سند ها در دیتابیس های مبتنی بر اسناد حکم سطر های دیتابیس را دارند. مقادیر موجود در این اسناد می توانند شش نوع داشته باشند؛ که نوشته (String)، عدد (Number) ، مقادر باینری (boolean)، لیست، object و null می باشد. هر داده در این سند از یک کلید و یک مقدار تشکیل شده است. کلید ها از نوع String بوده و نشانگر اصلی برای دریافت و جستجو داده ها می باشد. مقدار هر کلید می تواند هر متنی را شامل شود. نامگذاری کلید ها محدودت هایی دارد که بعدا به آن ها اشاره می کنیم.

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

یک یا چند collection، یک database را تشکیل می دهد. mongodb می تواند به صورت همزمان چندین دیتابیس را مدیریت کند. در این پروژه ما اطلاعات مربوط به هر database را درون یک فایل ذخیره می کنیم.


از کجا شروع کنیم؟

در ابتدا سعی داریم که سیستم مدیریت دیتابیس ما امکان ساخت دیتابیس و کالکشن را داشته باشد و بتوان با استفاده از متد insert ، find ، delete ، updata داده های درون آن را مدیریت کرد.



در بخش بعدی در مورد ساختار فایل ها و نحوی ذخیره سازی داده ها مطالبی را بیان می کنیم و در مورد mmap و سیستم های مدیریت ذخیره سازی بحث می کنیم.

اگر به مشارکت در این پروژه علاقه دارید و یا می خواهید کد را مشاهده کنید به ریپازیتوری زیر مراجعه کنید

https://github.com/mahanfarzaneh2000/paradome


دیتابیسrustmongodbdbmsپایگاه داده
شاید از این پست‌ها خوشتان بیاید