MongoDB
مونگودیبی یک پایگاه داده NoSQL توزیعشده، متنباز (با لایسنس SSPL) و Document-oriented است که دادهها را در قالب BSON (Binary JSON) ذخیره میکند. فلسفه اصلی MongoDB ارائه انعطافپذیری بالای Schema، پرسوجوهای پیچیده (Aggregation Pipeline) و قابلیت نصب در هر محیطی (On-Premises، Multi-Cloud یا Cloud Managed via MongoDB Atlas) است.
Azure Cosmos DB
کازموسدیبی پایگاه داده NoSQL ابری، کاملاً مدیریتشده (Fully Managed SaaS/PaaS) و بسیار توزیعشده مایکروسافت است. Cosmos DB بر پایه معماری چندالگویی (Multi-Model) بنا شده و APIهای مختلفی از جمله Core (SQL) API، MongoDB API، Cassandra، Gremlin و Table API را ارائه میدهد. تمام دادهها در درون موتور زیرین آن به صورت ARST (Atom-Record-Sequence-Table) ذخیره میشوند.
کیفیت SDK و تجربهی توسعهدهنده (Developer Experience) در داتنت، یکی از معیارهای اصلی انتخاب است.
+-----------------------------------------------------------------------+
| .NET Application |
+-----------------------------------------------------------------------+
│ │
▼ (MongoDB.Driver) ▼ (Microsoft.Azure.Cosmos)
+------------------------------------+ +------------------------------------+
| MongoDB | | Azure Cosmos DB |
| - BSON Mapping Attributes | | - System.Text.Json Native |
| - Aggregation Pipeline Fluent API | | - LINQ Provider & SQL Syntax |
| - LINQ 3 Provider | | - Change Feed Processor |
+------------------------------------+ +------------------------------------+
MongoDB در .NET
Azure Cosmos DB در .NET
مدلهای همگرایی (Consistency Levels)
یکی از تفاوتهای بنیادی این دو پایگاه داده در نحوه مدیریت تئوری CAP و همگرایی دادهها است:
| ویژگی | MongoDB | Azure Cosmos DB |
| سطوح همگرایی | ۲ سطح اصلی: Read Concern / Write Concern (Eventual یا Strong با Majority) | ۵ سطح دقیق: Strong, Bounded Staleness, Session, Consistent Prefix, Eventual |
| انعطافپذیری | تنظیم در سطح کلاینت یا کوئری | تنظیم در سطح اکانت با قابلیت اورراید در سطح درخواست |
| SLA همگرایی | بستگی به کانفیگ زیرساخت دارد | ۱۰۰٪ تضمینشده با SLA مالتیریجن مایکروسافت |
در Cosmos DB، سطح Session Consistency (حالت پیشفرض) گزینهای عالی برای برنامههای داتنت است که ضمانت میکند کاربری که کدی را اجرا کرده، تغییرات خود را بلافاصله میبیند (Read-your-own-writes)، در حالی که برای کل سیستم هزینه Strong Consistency پرداخت نمیشود.
پارتیشنبندی و شاردینگ (Sharding)
شاخصگذاری (Indexing)
نمونه کد MongoDB
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
using MongoDB.Driver;
public class Order
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; } = default!;
[BsonElement("customerId")]
public string CustomerId { get; set; } = default!;
[BsonElement("totalAmount")]
public decimal TotalAmount { get; set; }
[BsonElement("createdAt")]
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
}
public class OrderRepository
{
private readonly IMongoCollection<Order> _orders;
public OrderRepository(IMongoDatabase database)
{
_orders = database.GetCollection<Order>("Orders");
}
public async Task CreateAsync(Order order) =>
await _orders.InsertOneAsync(order);
public async Task<List<Order>> GetHighValueOrdersAsync(decimal threshold)
{
return await _orders.Find(o => o.TotalAmount > threshold)
.SortByDescending(o => o.CreatedAt)
.ToListAsync();
}
}
نمونه کد Azure Cosmos DB (با استفاده از SDK رسمی)
using Microsoft.Azure.Cosmos;
public class Order
{
[JsonPropertyName("id")]
public string Id { get; set; } = Guid.NewGuid().ToString();
[JsonPropertyName("customerId")]
public string CustomerId { get; set; } = default!; // Partition Key
[JsonPropertyName("totalAmount")]
public decimal TotalAmount { me; set; }
[JsonPropertyName("createdAt")]
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
}
public class CosmosOrderRepository
{
private readonly Container _container;
public CosmosOrderRepository(CosmosClient client, string dbName, string containerName)
{
_container = client.GetContainer(dbName, containerName);
}
public async Task CreateAsync(Order order)
{
// نیاز به ارسال Partition Key در هنگام نوشتن
await _container.CreateItemAsync(order, new PartitionKey(order.CustomerId));
}
public async Task<List<Order>> GetCustomerOrdersAsync(string customerId)
{
var query = new QueryDefinition("SELECT * FROM c WHERE c.customerId = @customerId")
.WithParameter("@customerId", customerId);
var requestOptions = new QueryRequestOptions
{
PartitionKey = new PartitionKey(customerId) // جلوگیری از Cross-Partition Query
};
var results = new List<Order>();
using var feed = _container.GetItemQueryIterator<Order>(query, requestOptions: requestOptions);
while (feed.HasMoreResults)
{
var response = await feed.ReadNextAsync();
results.AddRange(response);
}
return results;
}
}
۵. مقایسه مدل هزینهای و عملیاتی (Pricing & Operations)
یک تفاوت بحرانی برای تصمیمگیری معماری، نحوه محاسبه قیمت و گزینههای میزبانی است.
مدل هزینه MongoDB
مدل هزینه Azure Cosmos DB
هشدار معماری: اگر کوئریهای داتنت شما Partition Key را در Cosmos DB رعایت نکنند، کوئری به صورت Cross-Partition اجرا شده و میتواند مصرف RU و هزینه ماهانه شما را به شدت و به صورت غیرمنتظرهای افزایش دهد!
|
محور مقایسه |
MongoDB |
Azure Cosmos DB |
|
نوع میزبانی |
On-Premises, Any Cloud, Atlas |
اختصاصی Microsoft Azure |
|
قفلشدگی به فروشنده (Vendor Lock-in) |
پایین (قابلیت جابهجایی راحت) |
بالا (کاملاً وابسته به اکوسیستم Azure) |
|
پشتیبانی از EF Core |
محدود / در حال توسعه |
بومی و توسط مایکروسافت پشتیبانی میشود |
|
توزیع جهانی (Global Distribution) |
نیاز به پیکربندی Multi-Region Replica Sets دارد |
با یک کلیک (Turnkey Global Distribution) |
|
تضمین latency و SLA |
بستگی به کانفیگ زیرساخت دارد |
تضمین Latency زیر ۱۰ میلیثانیه برای Read/Write در سطح 99.999% |
|
محدودیت حجم سند |
۱۶ مگابایت |
۲ مگابایت |
|
APIهای چندگانه |
فقط API بومی MongoDB |
SQL (Core)، MongoDB API، Cassandra، Gremlin، Table |
MongoDB را انتخاب کنید اگر:
Azure Cosmos DB را انتخاب کنید اگر:
هر دو پایگاه داده MongoDB و Azure Cosmos DB گزینههایی فوقالعاده برای برنامههای مدرن داتنت هستند. MongoDB انعطافپذیری استقرار و قدرت بالای کوئری را بدون وابستگی به یک پلتفرم ابری خاص فراهم میکند. در مقابل، Cosmos DB با ادغام عمیق در اکوسیستم Azure، پشتیبانی بومی از EF Core، پایداری فوقالعاده و مقایسپذیری جهانی بیدردسر، انتخاب ایدهآل پروژههای بزرگ سازمانیافته در Azure است.
0 نظر
هنوز نظری برای این مقاله ثبت نشده است.