مرور سریع دیتابیس، ORM و کشینگ
جمعبندی نکات کلیدی SQL Server، T-SQL، Dapper/EF Core و کشینگ با Redis برای مرور شب قبل مصاحبه.
این جزوه مهمترین نکات دیتابیس، ORM و کشینگ را که در مصاحبههای برنامهنویسی بکاند پرتکرارند، در یک صفحه جمع کرده تا در کمترین زمان مرور کنید. نکات ⭐ (طلایی) پرتکرارترین سؤالات مصاحبه هستند — اگر وقت کم دارید، فقط همانها را بخوانید.
فهرست بخشها
کش (Caching) در ASP.NET Core0/5
ذخیرهسازی موقت داده برای کاهش فشار روی دیتابیس و افزایش سرعت پاسخدهی.
builder.Services.AddMemoryCache();
// یا
builder.Services.AddStackExchangeRedisCache(options =>
{
options.Configuration = "localhost:6379";
});
var products = _cache.GetOrCreate("products", entry =>
{
entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(10);
return db.Products.ToList();
});
entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(10);
entry.SlidingExpiration = TimeSpan.FromMinutes(10);
کش کردن دادههای حساس یا لحظهای (مثل موجودی آنی انبار) یا اطلاعاتی که مدام تغییر میکنند، باعث نمایش داده قدیمی و ناهماهنگ به کاربر میشود.
برای مصاحبه: چیزهایی که باید Cache شوند شامل لیست محصولات، دستهبندیها، تنظیمات سایت و دادههای کمتغییر API است؛ چیزهایی که نباید Cache شوند شامل دادههای حساس و اطلاعات لحظهایست.
Dapper (Micro ORM)0/4
کتابخانهٔ سبک StackOverflow برای اجرای SQL خام با نگاشت سریع نتیجه به آبجکتهای C#.
تفاوت Dapper/EF Core/ADO.NET یکی از پرتکرارترین سوالات مصاحبهٔ بکاند داتنت است.
public class UserRepository
{
private readonly string _connectionString;
public UserRepository(string connectionString)
{
_connectionString = connectionString;
}
public IEnumerable<User> GetAll()
{
using var connection = new SqlConnection(_connectionString);
return connection.Query<User>(
"SELECT Id, Name, Email FROM Users");
}
}
قرار دادن مستقیم Dapper در Controller بدون لایهٔ Repository/Service باعث درهمتنیدگی و کاهش تمیزی معماری در پروژههای واقعی میشود.
// خواندن یک رکورد
var user = connection.QueryFirstOrDefault<User>(
"SELECT * FROM Users WHERE Id = @Id",
new { Id = 1 });
// افزودن
connection.Execute(
"INSERT INTO Users(Name, Email) VALUES(@Name, @Email)",
new { Name = "Ali", Email = "ali@test.com" });
// ویرایش
connection.Execute(
"UPDATE Users SET Name = @Name WHERE Id = @Id",
new { Id = 1, Name = "Reza" });
// حذف
connection.Execute(
"DELETE FROM Users WHERE Id = @Id",
new { Id = 1 });
انواع ORM در .NET0/5
مقایسهٔ معروفترین ORMهای داتنت از نظر سرعت، امکانات و کاربرد.
در مصاحبه معمولاً کافیست بتوانی مقایسهٔ EF Core و Dapper را با مثال توضیح دهی؛ آشنایی اسمی با NHibernate و LINQ to SQL هم کافی است.
ORM چیست؟ (مبانی و DbContext)0/4
Object-Relational Mapping یعنی کار با دیتابیس از طریق کلاسهای C# بهجای نوشتن SQL دستی.
// بهجای:
// SELECT * FROM Users
var users = context.Users.ToList();
public class User
{
public int Id { get; set; }
public string Name { get; set; }
}
public class AppDbContext : DbContext
{
public DbSet<User> Users { get; set; }
}
// Create
context.Users.Add(new User { Name = "Ali" });
context.SaveChanges();
// Read
var users = context.Users.ToList();
// Update
var user = context.Users.Find(1);
user.Name = "Reza";
context.SaveChanges();
// Delete
var user = context.Users.Find(1);
context.Users.Remove(user);
context.SaveChanges();
فراموش کردن فراخوانی SaveChanges باعث میشود Add/Remove/تغییر Property هیچ اثری روی دیتابیس نداشته باشد.
Redis - مبانی و دستورات پرکاربرد0/5
دیتابیس In-Memory کلید-مقدار برای کش، صف پیام، Session و Pub/Sub.
SET name "Ali"
GET name
DEL name
EXISTS name
SET token "abc123" EX 60
TTL token
HSET user:1 name Ali age 25
HGETALL user:1
ZADD scores 100 Ali
ZRANGE scores 0 -1 WITHSCORES
SET product:1 "{json}" EX 300
GET product:1
var redis = ConnectionMultiplexer.Connect("localhost:6379");
var db = redis.GetDatabase();
await db.StringSetAsync("name", "Ali");
var name = await db.StringGetAsync("name");
ویژگیهای جدید SQL Server 20220/5
مهمترین قابلیتهای اضافهشده در SQL Server 2022 نسبت به نسخههای قبلی.
CREATE PROCEDURE GetOrders
@CustomerId INT
AS
BEGIN
SELECT *
FROM Orders
WHERE CustomerId = @CustomerId;
END;
ALTER DATABASE SalesDB
SET QUERY_STORE = ON;
CREATE TABLE Transactions
(
Id INT PRIMARY KEY,
Amount DECIMAL(10,2)
)
WITH (LEDGER = ON);
SELECT APPROX_PERCENTILE_CONT(0.5)
WITHIN GROUP (ORDER BY Salary)
FROM Employees;
بهینهنویسی و Performance در SQL0/5
نکات کاربردی برای نوشتن کوئریهای سریعتر و اجتناب از مشکلات رایج Performance.
-- بد: Index غیرفعال میشود
SELECT * FROM Orders
WHERE YEAR(OrderDate) = 2023;
-- خوب: از Index استفاده میشود
SELECT * FROM Orders
WHERE OrderDate >= '2023-01-01'
AND OrderDate < '2024-01-01';
-- کندتر
SELECT * FROM Customers
WHERE Id IN (SELECT CustomerId FROM Orders);
-- سریعتر
SELECT * FROM Customers c
WHERE EXISTS (
SELECT 1 FROM Orders o WHERE o.CustomerId = c.Id
);
SELECT
Name,
RANK() OVER (ORDER BY Salary DESC) AS Rank,
ROW_NUMBER() OVER (ORDER BY Salary DESC) AS RowNumber
FROM Employees;
// بد: N+1 Query
var orders = context.Orders.ToList();
foreach (var order in orders)
{
var customerName = order.Customer.Name; // یک Query جدا برای هرکدام
}
// خوب: یک Query با Include
var orders = context.Orders
.Include(o => o.Customer)
.ToList();
یکی از پرتکرارترین سوالات مصاحبهٔ EF Core؛ راه تشخیصش دیدن تعداد Queryهای اجراشده است (مثلاً با Logging یا SQL Profiler).
T-SQL - دستورات پایه0/5
دستورات اصلی زبان T-SQL در SQL Server برای خواندن، افزودن، ویرایش، حذف و ترکیب دادهها.
SELECT Name, Age FROM Users
WHERE Age > 20
ORDER BY Age DESC;
INSERT INTO Users (Name, Age) VALUES ('Ali', 25);
UPDATE Users SET Age = 30 WHERE Name = 'Ali';
DELETE FROM Users WHERE Id = 1;
اجرای UPDATE یا DELETE بدون شرط WHERE باعث تغییر یا حذف همهٔ رکوردهای جدول میشود؛ همیشه قبل از اجرا شرط WHERE را چک کن.
SELECT * FROM Users
WHERE Age BETWEEN 18 AND 30
AND City = 'Tehran';
SELECT COUNT(*) FROM Users;
SELECT AVG(Age) FROM Users;
SELECT City, COUNT(*) AS UserCount
FROM Users
GROUP BY City
HAVING COUNT(*) > 5;
SELECT Users.Name, Orders.Amount
FROM Users
INNER JOIN Orders ON Users.Id = Orders.UserId;
SELECT u.Name FROM Users AS u WHERE u.Age IS NOT NULL;
SELECT TOP 10 * FROM Users;
CREATE TABLE Users (
Id INT,
Name NVARCHAR(100),
Age INT
);
