This project implements a normalized and scalable SQL database for managing multimedia content such as movies, series, anime, and documentaries. It also tracks user interactions including comments, views, and subscription types. The system serves as the backend for a media streaming platform, content analytics dashboard, or recommendation engine.
The database supports:
- Categorization of media by genre and type
- Contributor management (directors, actors, writers, etc.)
- User profiles and subscription tracking
- User-generated content (comments)
- View tracking for analytics
- Queries for business insights (e.g., most watched media, popular genres)
| Table Name | Description |
|---|---|
Genre |
Stores media genres |
MediaType |
Stores media types (e.g., Series, Anime) |
Media |
Core media content |
Person |
People involved in media |
Profession |
Roles of people (e.g., Director, Actor) |
MediaPerson |
Links people to media with specific roles |
SubscriptionType |
Subscription types |
User |
Platform users |
Comment |
User comments on media |
WatchedMedia |
Tracks which media users have watched |
- Each media has one genre and one type
- Each person can be linked to multiple media with a profession
- Each user can have one subscription type
- Users can comment on and view multiple media
- Deletion rules maintain referential integrity (e.g., cascade on comments)
- Normalization: All tables are normalized to reduce redundancy
- Sparse Columns: Used for optional fields to optimize storage
- Foreign Keys with ON DELETE: Ensures data consistency
- Identity Columns: Used for auto-incrementing primary keys
- Uniqueidentifier in Users: Adds uniqueness for external integrations
- Check Constraints: Ensure data validity (e.g., score between 1–10)
- Indexes: Created on foreign keys and frequently searched columns
- Sparse Columns: Reduce storage for nullable fields
- Modular Schema: Easy to extend with new media types or features
- Analytical Queries: Designed for reporting and insights
The database supports analytical queries including:
- Media not watched by any user
- Media watched more than once
- Top 3 most watched media
- Most popular genre
- Activate inactive subscriptions
- Delete media by genre
- Retrieve comments by user
- Count media by genre
- Find media by specific director
- List users with premium subscriptions
These queries demonstrate the database's analytical power and real-world usability.
erDiagram
Genre ||--o{ Media : "has"
MediaType ||--o{ Media : "has"
Media ||--o{ MediaPerson : "involves"
Person ||--o{ MediaPerson : "participates"
Profession ||--o{ MediaPerson : "with role"
SubscriptionType ||--o{ User : "subscribes"
User ||--o{ Comment : "writes"
Media ||--o{ Comment : "receives"
User ||--o{ WatchedMedia : "views"
Media ||--o{ WatchedMedia : "viewed in"
Genre {
TINYINT GenreId PK
NVARCHAR Name_Genre
}
MediaType {
TINYINT TypeId PK
NVARCHAR Type_Name
}
Media {
BIGINT MediaId PK
NVARCHAR Title
NVARCHAR Description
NVARCHAR Awards
DATE ReleaseDate
TINYINT Score
TINYINT GenreId FK
TINYINT TypeId FK
SMALLINT Duration
NVARCHAR Language
}
Person {
INT PersonId PK
NVARCHAR FullName
}
Profession {
INT ProfessionId PK
NVARCHAR ProfessionName
}
MediaPerson {
BIGINT MediaPersonId PK
BIGINT MediaId FK
INT PersonId FK
INT ProfessionId FK
}
SubscriptionType {
TINYINT SubscriptionTypeId PK
NVARCHAR SubscriptionName
}
User {
INT UserId PK
NVARCHAR FirstName
NVARCHAR LastName
NVARCHAR Username
NVARCHAR Phone
VARCHAR PasswordHash
NVARCHAR Email
UNIQUEIDENTIFIER Uniqueidentifier
NVARCHAR Bio
TINYINT SubscriptionTypeId FK
DATETIME CreatedDate
}
Comment {
BIGINT CommentId PK
NVARCHAR CommentText
INT UserId FK
BIGINT MediaId FK
DATETIME CreatedDate
}
WatchedMedia {
INT WatchedMediaId PK
INT UserId FK
BIGINT MediaId FK
DATETIME WatchedDate
}
A short video has been recorded and uploaded to YouTube, showcasing:
- Project overview and schema
- ERD walkthrough
- Sample queries and results
- Author and project metadata
The database schema has been optimized for:
- Performance: Indexes on foreign keys and frequently queried columns
- Scalability: Normalized structure with minimal redundancy
- Flexibility: Sparse columns for optional fields
- Data Integrity: Foreign key constraints with appropriate delete actions
- Analytics: Support for complex queries on user behavior and content popularity
- SQL Server (e.g., Microsoft SQL Server or Azure SQL)
- SQL Server Management Studio (SSMS) or any SQL client
- Basic familiarity with running SQL scripts
-
Clone the repository
git clone https://github.com/sorna-fast/media-database-cs50sql.git cd media-database-cs50sql -
Open SQL Server Management Studio (SSMS)
Or use any SQL client connected to your local or cloud SQL Server. -
Run the schema
- Open
schema.sql - Execute the script to create the database and all tables
- Open
-
Insert sample data
- Open
queries.sql - Run the
INSERTstatements to populate the database with sample genres, media, users, and relationships
- Open
-
Test queries
- Run the
SELECT,UPDATE, andDELETEqueries to explore the database functionality
- Run the
- Name: Masoud Ghasemi
- GitHub: sorna-fast
- email: masudpythongit@gmail.com
- Telegram: https://t.me/Masoud_Ghasemi_sorna_fast
این پروژه یک پایگاه داده SQL نرمالسازیشده و مقیاسپذیر برای مدیریت محتوای چندرسانهای مانند فیلمها، سریالها، انیمهها و مستندهاست. همچنین تعاملات کاربران مانند نظرات، بازدیدها و نوع اشتراک آنها را ثبت میکند. این سیستم میتواند بهعنوان بکاند یک پلتفرم پخش رسانه، داشبورد تحلیلی یا موتور پیشنهاددهنده عمل کند.
پایگاه داده از موارد زیر پشتیبانی میکند:
- دستهبندی رسانهها بر اساس ژانر و نوع
- مدیریت عوامل تولید (کارگردان، بازیگر، نویسنده و ...)
- پروفایل کاربران و نوع اشتراک آنها
- ثبت نظرات کاربران
- ردیابی بازدیدهای کاربران
- اجرای کوئریهای تحلیلی برای گزارشگیری و بینشهای آماری
| نام جدول | توضیحات |
|---|---|
Genre |
ذخیره ژانرهای رسانه |
MediaType |
ذخیره انواع رسانه (مثلاً سریال، انیمه) |
Media |
اطلاعات اصلی رسانه |
Person |
افراد دخیل در تولید رسانه |
Profession |
نقشهای افراد (مثلاً کارگردان، بازیگر) |
MediaPerson |
ارتباط افراد با رسانه و نقش آنها |
SubscriptionType |
انواع اشتراک کاربران |
User |
اطلاعات کاربران |
Comment |
نظرات کاربران روی رسانه |
WatchedMedia |
رسانههایی که توسط کاربران مشاهده شدهاند |
- هر رسانه دارای یک ژانر و یک نوع است
- هر فرد میتواند در چند رسانه با نقش خاصی حضور داشته باشد
- هر کاربر دارای یک نوع اشتراک است
- کاربران میتوانند روی چند رسانه نظر بدهند و آنها را مشاهده کنند
- قوانین حذف برای حفظ یکپارچگی دادهها تنظیم شدهاند
- نرمالسازی: تمام جداول نرمالسازی شدهاند تا از تکرار داده جلوگیری شود
- ستونهای پراکنده: برای فیلدهای اختیاری جهت بهینهسازی فضای ذخیرهسازی
- کلیدهای خارجی با ON DELETE: برای حفظ انسجام دادهها
- کلیدهای اصلی خودافزاینده: برای سادهسازی درج دادهها
- شناسه یکتا در کاربران: برای یکپارچگی بیشتر و امکان اتصال به سیستمهای خارجی
- محدودیتهای بررسی: برای اعتبارسنجی دادهها (مثلاً امتیاز بین ۱ تا ۱۰)
- ایندکسها: روی کلیدهای خارجی و ستونهای پرتکرار ایجاد شدهاند
- ستونهای پراکنده: فضای ذخیرهسازی را برای فیلدهای اختیاری کاهش میدهند
- ساختار ماژولار: امکان توسعه آسان با افزودن نوع رسانه یا ویژگیهای جدید
- کوئریهای تحلیلی: برای گزارشگیری و بینشهای آماری طراحی شدهاند
پایگاه داده از کوئریهای تحلیلی زیر پشتیبانی میکند:
- رسانههایی که هیچ کاربری مشاهده نکرده
- رسانههایی که بیش از یکبار مشاهده شدهاند
- سه رسانه پربازدید
- محبوبترین ژانر
- فعالسازی اشتراکهای غیرفعال
- حذف رسانههای ژانر کمدی
- دریافت نظرات یک کاربر خاص
- شمارش رسانهها بر اساس ژانر
- یافتن رسانههای ساختهشده توسط یک کارگردان خاص
- کاربران دارای اشتراک پریمیوم
این کوئریها قدرت تحلیلی و کاربرد واقعی پایگاه داده را نشان میدهند.
erDiagram
Genre ||--o{ Media : "has"
MediaType ||--o{ Media : "has"
Media ||--o{ MediaPerson : "involves"
Person ||--o{ MediaPerson : "participates"
Profession ||--o{ MediaPerson : "with role"
SubscriptionType ||--o{ User : "subscribes"
User ||--o{ Comment : "writes"
Media ||--o{ Comment : "receives"
User ||--o{ WatchedMedia : "views"
Media ||--o{ WatchedMedia : "viewed in"
Genre {
TINYINT GenreId PK
NVARCHAR Name_Genre
}
MediaType {
TINYINT TypeId PK
NVARCHAR Type_Name
}
Media {
BIGINT MediaId PK
NVARCHAR Title
NVARCHAR Description
NVARCHAR Awards
DATE ReleaseDate
TINYINT Score
TINYINT GenreId FK
TINYINT TypeId FK
SMALLINT Duration
NVARCHAR Language
}
Person {
INT PersonId PK
NVARCHAR FullName
}
Profession {
INT ProfessionId PK
NVARCHAR ProfessionName
}
MediaPerson {
BIGINT MediaPersonId PK
BIGINT MediaId FK
INT PersonId FK
INT ProfessionId FK
}
SubscriptionType {
TINYINT SubscriptionTypeId PK
NVARCHAR SubscriptionName
}
User {
INT UserId PK
NVARCHAR FirstName
NVARCHAR LastName
NVARCHAR Username
NVARCHAR Phone
VARCHAR PasswordHash
NVARCHAR Email
UNIQUEIDENTIFIER Uniqueidentifier
NVARCHAR Bio
TINYINT SubscriptionTypeId FK
DATETIME CreatedDate
}
Comment {
BIGINT CommentId PK
NVARCHAR CommentText
INT UserId FK
BIGINT MediaId FK
DATETIME CreatedDate
}
WatchedMedia {
INT WatchedMediaId PK
INT UserId FK
BIGINT MediaId FK
DATETIME WatchedDate
}
یک ویدیوی کوتاه ضبط شده و در YouTube آپلود شده که شامل موارد زیر است:
- معرفی کلی پروژه و ساختار پایگاه داده
- بررسی نمودار ERD
- اجرای نمونه کوئریها و نمایش نتایج
- اطلاعات نویسنده و متادیتای پروژه
ساختار پایگاه داده برای موارد زیر بهینهسازی شده است:
- عملکرد: ایندکس روی کلیدهای خارجی و ستونهای پرتکرار
- مقیاسپذیری: ساختار نرمالسازیشده با حداقل افزونگی
- انعطافپذیری: ستونهای پراکنده برای فیلدهای اختیاری
- یکپارچگی داده: کلیدهای خارجی با رفتارهای حذف مناسب
- تحلیلپذیری: پشتیبانی از کوئریهای پیچیده برای رفتار کاربران و محبوبیت محتوا
- SQL Server (مثلاً Microsoft SQL Server یا Azure SQL)
- نرمافزار SQL Server Management Studio (SSMS) یا هر کلاینت SQL دیگر
- آشنایی اولیه با اجرای اسکریپتهای SQL
-
کلون کردن ریپازیتوری
git clone https://github.com/sorna-fast/media-database-cs50sql.git cd media-database-cs50sql -
باز کردن SSMS یا کلاینت SQL
به دیتابیس محلی یا ابری خود متصل شوید. -
اجرای فایل schema.sql
- فایل
schema.sqlرا باز کنید - اسکریپت را اجرا کنید تا دیتابیس و جدولها ساخته شوند
- فایل
-
درج دادههای نمونه
- فایل
queries.sqlرا باز کنید - دستورات
INSERTرا اجرا کنید تا دادههای نمونه وارد شوند
- فایل
-
اجرای کوئریها
- دستورات
SELECT,UPDATE, وDELETEرا اجرا کنید تا عملکرد پایگاه داده را بررسی کنید
- دستورات
- نام: مسعود قاسمی
- گیتهاب: sorna-fast
- ایمیل: masudpythongit@gmail.com