SQL Server schema design and query optimization
Efficient schema design and query optimization.
| Element | Convention | Example |
|---|---|---|
| Table | PascalCase, plural | Users, Orders |
| Column | PascalCase | FirstName |
| PK | Id | Id |
| FK | {Table}Id | UserId |
| Index | IX_{Table}_{Column} | IX_Users_Email |
CREATE TABLE Users (
Id INT IDENTITY(1,1) PRIMARY KEY,
-- Business columns
Email NVARCHAR(255) NOT NULL,
Name NVARCHAR(100) NOT NULL,
-- Audit columns
CreatedAt DATETIME2 DEFAULT GETUTCDATE(),
UpdatedAt DATETIME2 NULL,
IsDeleted BIT DEFAULT 0
);
-- One-to-Many
ALTER TABLE Orders
ADD CONSTRAINT FK_Orders_Users
FOREIGN KEY (UserId) REFERENCES Users(Id);
-- Many-to-Many
CREATE TABLE UserRoles (
UserId INT,
RoleId INT,
PRIMARY KEY (UserId, RoleId)
);
| Scenario | Index Type |
|---|---|
| Primary key | Clustered (auto) |
| Foreign key | Non-clustered |
| Search column | Non-clustered |
| Composite search | Composite |
CREATE INDEX IX_Users_Email ON Users(Email);
CREATE INDEX IX_Orders_UserId ON Orders(UserId);
-- Parameterized (safe)
SELECT * FROM Users WHERE Email = @Email
-- Pagination
SELECT * FROM Users
ORDER BY CreatedAt DESC
OFFSET @Skip ROWS
FETCH NEXT @Take ROWS ONLY
| ✅ Do | ❌ Don't |
|---|---|
| Parameterized queries | String concatenation |
| Index foreign keys | Skip FK indexes |
| UTC timestamps | Local time |
| Soft delete | Hard delete (usually) |