# پایگاه‌های داده > NoSQL >  انتخاب دیتابیس یک برنامه

## aloneman2005

سلام. ممنون از تمام مطالب مفیدتون.
برای انتخاب نوع دیتابیس یک مثالی میزنم .بیمارستان های کل کشور که با هم در ارتباط باشند .تمامی اطلاعات یک فرد بیمار از ابتدای تولد تا ... ذخیره بشه که در تمامی بیمارستان ها اطلاعات آن نمایش داده بشه .
برای همچین برنامه ای شما NOSQL رو انتخاب می کنید؟لازم به ذکر است که تمامی بیمارستان ها به سرورها وصل هستند . و تمامی عملیات های یک بیمار از جمله ثبت دارو ،آزمایش و غیره رو ثبت می کنند.

----------


## cups_of_java

- انتخاب درستی می تونه باشه. شما حدود ۵۰ ملیون نفر رو که هر کدوم تو طول عمرش ۵ دفعه بیمارستان بره در نظر بگیری حداقل ۲۵۰ ملیون پرونده بیماری داری. حالا جزییات هر کدومش کلیه... بماند اونش.
- ضمنن هر بیمارستانی یه سری اطلاعات رو نگه میداره. درست خیلیاشون یکی مشن اما هست اطلاعاتی که مختص باشه (این گزینه خیلی مهمه تو انتخاب یک NoSQL بدون شما)
- امکان دادن اطلاعات و سرویس های مختلف RESTFUL دور این دیتا سنتر اقتضا ممکنه بکنه که از یک NoSQL‌استفاده بشه چون SQLها به تنهایی این امکانات رو نمی دن.
- از همه مهمتر امکان پشتیبانی از معماری های مقیاس شونده مثل Clustering های مختلف چه Master/Master چه با Replication  به سادگی باشه وجود داشته باشه. Clustering توی SQLها یه دغدغه بزرگ هست.

خلاصه میشه این مثال رو حتی یک Big Data فرض کرد.

----------


## aloneman2005

ممنون از پاسختون." خلاصه میشه این مثال رو حتی یک Big Data فرض کرد." 2 - مگر مبحث Big Data از NoSql جداست
تمامی این Engin ها مثل RavenDB یا CoachDB چطور تعداد تراکنش های همز مان رو مدیریت می کنند?
به چه دلیل وقتی حرف از اطلاعات پایین یا تراکنش های پایین با حجم اطلاعات کم می شود می گن از همون رابطه ای استفاده بشه بهتره درصورتی که مثلا همون برنامه بالا که مثال زدم در حجم کم مثلا در یک بیمارستان که کل دیتابیس ممکنه در طول 5 سال به 10 گیگ نرسه ؟

----------


## cups_of_java

> مگر مبحث Big Data از NoSql جداست


NoSQL یه فرهنگ یا حتی یه مجموعه از تکنولوژی و ابزاره، Big Data یک دسته ای از موضوعات با شرایط خاص داده ای! شما اون ابزار رو می تونی برای BigData استفاده کنی می تونی نکنی. البته این لغات باهم شکل گرفتن تو این سال ها و خیلی با هم عجین شدن. برای همین یکی به نظر میرسن گاهی
ضمنن اینم بگم ممکنه این مثال بزرگی باشه اما Big Data بیشتر به مثالهایی میگن که با ترلیون رکود سر و کار داره و اطلاعات با حجم زمان در واحد زمان همین طور میاد و میره! این مثال کمی اینطوریه نه خیلی! ;)




> چطور تعداد تراکنش های همز مان رو مدیریت می کنند?


چطور یعنی چی؟  سرعت؟ پیاده سازی؟ روش حل همزمانی؟
کلن مسله همزمانی تو هر کدوم به یه روش حل شده. مثلن CouchDB از طریق چند نسخه سازی همروندی رو کنترل میکنه و برای همین خیلی سریعه. کلن noSQLها کمتر از روش Locking مسله همروندی رو حل میکنن بر عکس RDBMSها جون می دونن که RDBMSها توی Locking چه ضجرهایی کشیدن.





> به چه دلیل وقتی حرف از اطلاعات پایین یا تراکنش های پایین با حجم اطلاعات کم می شود می گن از همون رابطه ای استفاده بشه بهتره


نه! این جمله به تنهایی درست نیست! شما توی اطلاعات پایین هم ممکنه شرایطی داشته باشی که بهتر باشه NoSQL‌ استفاده کنی. اتفاقن یکی از دلایلی که تو پست قبلیم گفتم گویای همین مورد بود.
شاید معنی حرفی که شما میگی "میگن" این باشه که تو جایی که شرایطی ندارد داده هات و سیستمت که بهتر باشه noSQL استفاده کنی، بهتره که SQLی استفاده کنی! چرا؟ چون خیلی از امکانات حاضر آماده رو DBMSت ساده در اختیارت میزاره و کلن کار کردن با SQL تو مثال های ساده راحت تره...

----------


## مبین رنجبر

> سلام. ممنون از تمام مطالب مفیدتون.
> برای انتخاب نوع دیتابیس یک مثالی میزنم .بیمارستان های کل کشور که با هم در ارتباط باشند .تمامی اطلاعات یک فرد بیمار از ابتدای تولد تا ... ذخیره بشه که در تمامی بیمارستان ها اطلاعات آن نمایش داده بشه .
> برای همچین برنامه ای شما NOSQL رو انتخاب می کنید؟لازم به ذکر است که تمامی بیمارستان ها به سرورها وصل هستند . و تمامی عملیات های یک بیمار از جمله ثبت دارو ،آزمایش و غیره رو ثبت می کنند.


این توضیحاتی که فرمودید فقط بحث مقیاس داده ای رو شامل میشه که الزاما استفاده از NoSQL تنها راه شما ممکن است نباشد.شما حتی مسائلی رو مشاهده می کنید که مقیاس داده ای خیلی خیلی کوچکی دارند ولی به دلیل ساختار داده ای که دارند نیاز به استفاده بی چون و چرا از NoSQL دارند.

اما در مورد مقیاس داده ای باید بگم به گفته دوستمون اگر 250 میلیون سند داده ای رو حتی ضرب در 4 هم کنید باز هم به آن BigData گفته نمی شود.من در جایی توضیح دادم که کارایی NoSQL در مقابل BigData را باید در مقیاس داده یوتابایت حتی بررسی کرد ( حتی در حد پتابایت هم نه )

(یوتابایت برابر با 1024 به توان 8 هشت است)

----------


## aloneman2005

وقتی می خواییم دو دیتابیس رو با هم مقایسه کنیم مثلا  sql server و oracle  مثلا سرعت وارد کردن 1000 رکورد یا پیدا کردن 1 رکورد در بین چند میلیون یا حذق 200 رکورد در یک زمان رو با اعداد و ارقام نشون می دن . حالا دارم دنبال یه همچین چیزی بین خود دیتابیس های NOSQL و دیتابیس های SQL می گردم لفا اگر همچین نموداری رو سراغ دارید بزارید ممنون .

----------


## cups_of_java

http://www.networkworld.com/cgi-bin/...oftware&nsdr=n

www.datastax.com/wp.../WP-Benchmarking-Top-NoSQL-Databases.pdf‎

دیتابیس های NoSQL بعضیاشون از یه جنس نیستن و کلن برای منظور ها و اهداف مختلفی طراحی شدن (برعکس SQLها) به خاطر همین گاهی مقایسه هاشون با هم منطقی و درست نیست

----------


## gholami146

بهتر قبل از انتخاب یک نگاهی هم به امکانات فایر بیرد بزنید یک تالار در مورد همین موضوع وجود داره و تا اونجایی که من میدونم بسیار قدرتمنده حتی می تونم بگم بهتر از اسکیول

----------


## gholami146

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

از خودم شروع میکنم :
سایت رسمی فایربرد : http://firebirdsql.org/
اخبار مرتبط با فایربرد : http://www.firebirdnews.org/
طرح سوالات مرتبط با فایربرد : http://www.firebirdfaq.org/
فایربرد چیست؟ : http://en.wikipedia.org/wiki/Firebir...base_server%29
فایربرد برای مبتدیان : http://www.ibprovider.com/eng/docume.../firebird.html

---
یک ویدئوی آموزشی بسیار مفید از جناب Object Pascal (شاهین عشایری) که برای آشنایی با فایربرد واقعا گزینه ی خوبیه :
http://www.irstu.com/?p=7261
---
کتاب آموزشی The Firebird Book A Refrence

این پست در حال تکمیله

----------


## cups_of_java

با کمی جستجو به نظر میرسه که با اینکه firebird یک DBMS خوب و جمع جوره اما گزینه ی قابل رقابتی حتی در مقابل MySQl یا PostgresSQL هم نیست چه برسه به Oracle و یا مقیاس هایی که NoSQLها باهاش کار دارن.

----------


## مبین رنجبر

> سلام و درود
> به عنوان اولین تاپیک و اولین پست این بخش این تاپیک رو ایجاد کردم تا دوستان مقالات و لینک های مرتبط با فایربرد رو اینجا به اشتراک بزارن
> تاپیک هم برای دسترسی آسان مهم میشه...
> لطفا از طرح هرگونه سوال و اسپم خودداری کنید.
> 
> از خودم شروع میکنم :
> سایت رسمی فایربرد : http://firebirdsql.org/
> اخبار مرتبط با فایربرد : http://www.firebirdnews.org/
> طرح سوالات مرتبط با فایربرد : http://www.firebirdfaq.org/
> ...


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

----------


## aloneman2005

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


 Stopwatch s = new Stopwatch();
             s.Start();
             var f = collection.Find(Query.EQ("Name", "javad")).ToList();
             long count = f.Count();
            s.Stop();
            MessageBox.Show(s.ElapsedMilliseconds.ToString());
         


 
کد بالا هزینه ای حدود 900 میلی ثانیه داره که فکر میکنم یکم زیاده.اگر اشکالی وجود داره لطفا درست کنید ممنون.

----------


## مبین رنجبر

> ممنون از تمام پاسخ هاتون. من دیتابیس Mongo رو دانلود کردم و نصب کردم استفاده هم کردن . دو میلیون رکورد هم در اون گذاشتم اما برای جستجو  کردن یکم سرعتش پایینه .
> مثلا  کد زیر 
> 
> 
>  Stopwatch s = new Stopwatch();
>              s.Start();
>              var f = collection.Find(Query.EQ("Name", "javad")).ToList();
>              long count = f.Count();
>             s.Stop();
> ...


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

----------


## aloneman2005

> شما تنها با اضافه کردن 2 میلیون سند و بعد جستجو نمی توانید بهترین سرعت را داشته باشید


در چه مواردی می تونم بهترین سرعت رو داشته باشم مگر دیتبایس ها ی غیر رابطه ای با هزینه جستجو یا هر هزینه دیگر اضافه کردن یا هرچیز دیگه و دیتابیس های رابطه ای همینطور سنجیده نمی شوند .



> و همینطور در بعضی از مسائل کوچک ، دیتابیس های مدل غیر رابطه ای انتخاب خوبی نسبت به دیگر انتخاب ها نیست و به طور مثال شما رو با هزینه بالا روبرو میکند چون برای این کار ساخته نشده اند


مگر هزینه بالا در دیتابیس غیر رابطه ای به چه چیزی بستگی داره . اصلا من چطور میتونم یک دیتابیس غیر رابطه ای رو بسنجم جدا از تعداد رکورد ها هزینه رم از این حرف ها . من می خوام سرعت دیتابیس غیر رابطه ای رو بسنجم چطور می تونم اینکار رو بکنم .

----------


## مبین رنجبر

> در چه مواردی می تونم بهترین سرعت رو داشته باشم مگر دیتبایس ها ی غیر رابطه ای با هزینه جستجو یا هر هزینه دیگر اضافه کردن یا هرچیز دیگه و دیتابیس های رابطه ای همینطور سنجیده نمی شوند


با این معیار سنجیده می شوند ولی نه در تقابل با هر پیکربندی ، ساختار یا سناریو ای.ببیند سرعت در دیتابیس ها به طور کل یک دکمه یا یک تابع نیست که آنرا اجرا کنید و از این به بعد سرعت بیشتر و کارایی بیشتر را در اختیار داشته باشید.برای داشتن سرعت بالا و مناسب شما قبلا باید ساختار داده ای خودتون رو درست انتخاب کرده باشید و ببینید آیا با آن مقیاس داده ای و ساختار ، در دیتابیس های رابطه ای کمبود و ضعفی احساس میکنید که شما را مجبور میکند به سمت دیتابیس های غیر رابطه ای بروید یا خیر.بعد از انجام این مرحله داده هایی که ثبت شد خود به خود با سرعت بالا پرس و جو نمی شود.شما به طور مثال نیاز به شاخص گذاری دارید، یا باید از مکانیزم Map/Reduce و Aggregate استفاده کنید.همه این ها بعد از یادگیری کامل قابل انجام هست.

مشخص نیست اصلا انتخابی که داشتید با توجه به داده های شما انتخاب خوبی بوده است یا خیر.




> مگر هزینه بالا در دیتابیس غیر رابطه ای به چه چیزی بستگی داره . اصلا من چطور میتونم یک دیتابیس غیر رابطه ای رو بسنجم جدا از تعداد رکورد ها هزینه رم از این حرف ها . من می خوام سرعت دیتابیس غیر رابطه ای رو بسنجم چطور می تونم اینکار رو بکنم .


فکر کنم این رو چندین بار عرض کردم که جنبش NoSQL برای حل مشکل مقیاس داده ای بالا یا BigData طراحی شده است.

----------


## cups_of_java

مقایسه و سنجش کارایی این ها خیلی آسون نیست. قبل از اینکه خودت دست به کد بشی، بگرد راجع ب هر کدوم و کارایی که انجام شده رو ببین.

اما اگه جستجوی نزدیک realtime میخوای رو هر اندازه دیتا، باید از Map/Reduce استفاده کنی. جالبه برام، من تا حالا Mongo رو تست نکردم و راجع به سرعت جستجوش با Map/Reduce هم سرچ نکردم اما طبیعیه که بدون اون جستجوی شما حول حوش یک ثانیه طول بکشه.
توی CouchDB که سریعترین زمان پاسخ رو توی جستجو داره روی هر اندازه ای از دیتا، این زمان حول چند ده میلی ثانیه هستش (0.03 ثانیه مثلن) و این مقدار ثابت هست نسبت به رشد اطلاعات. اما در عوض یک سری چیزای دیگه رو از دست میدی.

در مورد مصرف حافظه هم Mongo رو نمیدونم اما Couch هر اندازه مموری بزاری به خوبی خودش رو روی اون مموری کش میده!!! یعنی اگه کم باشه مشکل نداره اگه زیادم باشه از همش استفاده میکنه. این فلسفه Couch بوده که بتونه روی ماشین های معمولی و کوچیک (حتی موبایل ها) هم اجرا بشه، روی سرور های بزرگ هم اجرا بشه.
کلن مصرف حافظه دیسک و مموری کمی می تونه بهینه نباشه توی شرایطی که شما Write زیادی توی DB دارین اما در عوض سرعت خیلی خیلی بالا دارین.

----------


## aloneman2005

من چرا دارم NOSQL رو یاد می گیرم جون می خوام یک سری کمبود هایی رو  که مثلا به قول شما مقیاس داده  از نظر دیتابیس رابطه ای  با مشکل برمی خورم رو حل بکنه.
ولی الان من 2 میلیون سند رو وارد mongo کردم تقریبا 1 ثانیه طول کشید تا جستجویی رو انجام دادم ولی با افزایش داده که اون رو به 12 میلیون سند کردم تقریبا 4 ثانیه طول کشید حالا این 12 میلیون سند  3.95 GB جا گرفت . با اینکه چیز خیلی ساده ای گذاشتم.یک سندی که فقط درون اون نام داره . حالا در نظر بگیرید این دیتابیس بشه 10 ترابایت خوب این دیگه غیر منطقیه که بگیم سرعتش بالاست و خوبه ازش توی مقیاس بالا استفاده کنیم.
در ضمن مقیاس داده ای من اونقدر هست که جنبش NoSql باید اون رو حل بکنه جنش NoSql چکار ساختار داده ای من داره .مقیاس داده ای من الان بیش از حده که مثلا Sql server نمی تونه حلش بکنه . و باید NoSql اون رو حل بکنه .
CoachDB رو حتما تست می کنم ممنون .

----------


## cups_of_java

من نفهمیدم noSQL باید اون رو حل بکنه یعنی چی!؟ مشکلتو نفهمیدم یعنی!
راجع به مقایسه و Ranking دیتانیس ها اینو دیدم، تقریبن از معتبرترین لیست هاست بر اساس استفاده و فعالیت جامعه آنلاین در مورد هر کدوم

----------


## aloneman2005

> من نفهمیدم noSQL باید اون رو حل بکنه یعنی چی!؟ مشکلتو نفهمیدم یعنی!
> راجع به مقایسه و Ranking دیتانیس ها اینو دیدم، تقریبن از معتبرترین لیست هاست بر اساس استفاده و فعالیت جامعه آنلاین در مورد هر کدوم


 اگر می خوام به بیشترین سرعت جستجوی mongo دست پیدا بکنم توی مثلا 12 میلیون سند باید map/reduce بزارم یا کارهای دیگه ای هم می شه ؟

----------


## cups_of_java

map reduce باید تعریف کنی.
من از جزییات indexگذاری توی Mongo خبر ندارم نگاه کن ببین اون هم می تونه کمکت کنه یا نه

----------


## aloneman2005

1 - من توی Couch بعد از 5 الی 6 ساعت 4 میلیون سند اضاف کردم شده 21 GB چرا اینقدر  زیاد شده.
از couch زیاد خوشم نیومد حال آدم رو می گیره با این get post از این کارا . نمی دونید توی mongo برای یه فیلتر ساده چطور باید map/reduce اضاف کنم ؟

----------


## cups_of_java

> 1 - من توی Couch بعد از 5 الی 6 ساعت 4 میلیون سند اضاف کردم شده 21 GB چرا اینقدر زیاد شده.


حجم دیتابیس توی Couch اصولن کمی زیاد تره، چون هدفش فشردگی نگهداری اطلاعات و بهینگی فضا نبوده. البته دیتابیس رو Compact کنید حجمش می تونه کمترم بشه. ضمنن اگر از Bulk Insert استفاده میکردید زمانش به چند دقیق کاهش پیدا میکرد.




> از couch زیاد خوشم نیومد حال آدم رو می گیره با این get post از این کارا .


اتفاقن REST بودن دسترسی به Couch یکی از امکانات منحصر به فرد اون هست و این یه امتیاز کاملن برتره به خیلی از دلایل:
1) برای هر کلاینت و هر زبان و هر شرایطی کلاینت می تونی براش درس کنی
2) Couch در عین حال که یه دیتابیسه یه وب سرور هم هست (تنها دیتابیس/وب سرور) موجوده! این به شما این امکان رو میده که برنامه اجراییت رو هم مثل دیتا توش ذخیره کنی!!!
3) امکان استفاده موبایل رو فراهم میکنه
4) به سادگی می تونی از Couch توی Integrate کردن سیستم های موجود و سرویس هاشون با هم استفاده کنی 
5) یک مدل معماری منحصر به فرد مقیاس پذیر 2 لایه ای برات فراهم میکنه! (بدون سرور ساید)  که این خیلی جذابه و مورد علاقه واقع شده.

----------


## aloneman2005

اگر امکان داره یکم در مورد طراحی مدل NoSql به عنوان مثال بیمارستان یکم شرح دهید .مثلا استفاده یک شخصی ار امکانات بیمارستان مثل آزمایشگاه .
لازم به ذکر است که امکان داره گزارشات متنوعی از آزمایشات هم گرفته بشه .
حالا  اطلاعات فرد و تمامی متعلقات اون رو به عنوان یک سند در نظر بگیریم یا طوری دیگه ای استفاده کنیم . در ضمن در اینجا سرعت جستجو و عملیات های محاسباتی خیلی برام مهمه ممنون.

----------


## cups_of_java

اصولن اینکه چطور سند بندی کنی تاثیری روی سرعتت نمیزاری اما روی نحوه ساخت پرس و جو های جستجو و نگهداری و مدیریت دیتابیست تاثیر میزاره. شما باید سعی کنی اطلاعات مربوط و نزدیک به هم رو توی یه سند قرار بدی، نه اینکه هر اطلاعاتی که به هم ربط دارن یه سند کنید. مثلن برای هر فرد میشه یه سند گرفت. برای هر استفاده یا مراجعه میشه سند دیگه ای گرفت، ...حتی گاهی دیتابیس های اینا می تونن جدا از هم باشن!
نکته های مهم اینه که:
1) توی NoSQLها چیزی به نام JOIN نداریم یعنی شما نمی تونی سند ها رو با هم join کنی توی جستجو و بعضن باید چندین View رو صدا بزنی تا بتونی اطلاعاتی که میخوای رو در بیاری.
2) نبود JOIN دلیل نمیشه شما همه اطلاعات رو توی یک سند قرار بدی و سندت رو بی خودی بزرگ کنی.
3) اگه اطلاعات سند زیاد باشه به مرور زمان دایمن برای هر تغییری باید ویرایشش کنی اون سند رو و نسخه هاش زیاد میشه و این حجم دیتابیست رو بالا میبره و گاهی ساخت Viewها رو سخت می کنه. (همه اینا راه حل داره)
...

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

----------

