TGViewer
C# Geeks (.NET) C# Geeks (.NET) @csharpgeeks · 550 subscribers
Post #399 140
🧱 مدل داده (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();
});
}
}
More from @csharpgeeks
  1. Sep 22, 2026یه مدتی قراره از دنیای NET. فاصله بگیرم، چون وقتشه برم سربازی. راستش نمیدونم این مدت رو چج…
  2. Sep 20, 2026🔥 حالا مشکل اصلی: Alert Storm فرض کن Database از دسترس خارج شده. ۱۰۰ Pod داری. هر Pod می‌…
  3. Sep 20, 2026🚨 طراحی سیستم Monitoring و Alerting در یک سیستم بزرگ فرض کن ساعت ۳ صبح است. سیستم شما با…
  4. Sep 19, 2026#Engineering_Leadership تصمیم نگرفتن هم یک تصمیم است یه چیز عجیب توی تیم‌های مهندسی: گاهی…
  5. Sep 19, 2026☑ چک‌لیست آماده‌سازی تیم، فرایندها و زیرساخت برای توسعه با AI توجه: هیچ چک‌لیستی جهان‌شمول…
  6. Sep 19, 2026📌پایان یک انتظار طولانی: اعتبارسنجی ناهمگام (Async Validation) در NET 11.
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →