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