🧱 مدل داده (Data Model) در ساخت URL Shortener با NET.
برای شروع، باید مشخص کنیم چه دادههایی را در پایگاه داده ذخیره خواهیم کرد.
مدل دادهای که نیاز داریم بسیار ساده است. ما یک کلاس ShortenedUrl داریم که نمایانگر لینکهایی است که در سیستم ذخیره میشوند:
public class ShortenedUrl
{
public Guid Id { get; set; }
public string LongUrl { get; set; } = string.Empty;
public string ShortUrl { get; set; } = string.Empty;
public string Code { get; set; } = string.Empty;
public DateTime CreatedOnUtc { get; set; }
}
🔍 این کلاس شامل ویژگیهای زیر است:
• LongUrl: آدرس اصلی (بلند)
• ShortUrl: آدرس کوتاهشده
• Code: کد منحصربهفردی که نمایانگر لینک کوتاهشده است
• Id و CreatedOnUtc نیز برای اهداف دیتابیس و ردیابی (tracking) استفاده میشوند.
کاربران با ارسال مقدار Code به سیستم ما، باعث میشوند برنامه بهدنبال LongUrl متناظر بگردد و آنها را به آدرس اصلی هدایت کند. 🚀
🧩 پیکربندی دیتابیس با Entity Framework Core
برای مدیریت ارتباط با دیتابیس، ما یک کلاس ApplicationDbContext ایجاد میکنیم.
این کلاس وظیفهٔ تنظیم موجودیتها (Entities) و پیکربندی context پایگاه داده را برعهده دارد.
در این مرحله دو کار برای بهبود عملکرد انجام میدهیم:
1️⃣ تعیین حداکثر طول فیلد Code با استفاده از HasMaxLength
2️⃣ تعریف یک ایندکس یکتا (Unique Index) روی ستون Code
این ایندکس یکتا مانع از بروز تکرار در مقدار Code میشود،
بنابراین هیچ دو لینک کوتاهی در دیتابیس مقدار مشابهی نخواهند داشت.
همچنین محدود کردن طول رشته باعث صرفهجویی در فضای ذخیرهسازی میشود و برای ایندکسگذاری ستونهای متنی در برخی دیتابیسها ضروری است.
⚠️ نکته: برخی از دیتابیسها رشتهها را بهصورت غیر حساس به حروف کوچک و بزرگ (case-insensitive) در نظر میگیرند.
این موضوع میتواند تعداد لینکهای قابل تولید را بهشدت کاهش دهد.
بنابراین باید دیتابیس را طوری پیکربندی کنید که Code بهصورت case-sensitive ذخیره و بررسی شود.
🧠 پیادهسازی ApplicationDbContext
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions options)
: base(options)
{
}
public DbSet<ShortenedUrl> ShortenedUrls { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<ShortenedUrl>(builder =>
{
builder
.Property(shortenedUrl => shortenedUrl.Code)
.HasMaxLength(ShortLinkSettings.Length);
builder
.HasIndex(shortenedUrl => shortenedUrl.Code)
.IsUnique();
});
}
}