# پایگاه داده — تسک ۰۴: ماژول بلاگ

## ساختار واقعی از DB backup

جدول `blog` در Drupal base fields را دارد + ۳ custom field:

## جدول: blogs
_(entity_type=blog — از DB backup تأیید شده)_

| ستون | نوع | نام Drupal | توضیح |
|------|-----|-----------|-------|
| id | INT UNSIGNED AUTO_INCREMENT PK | id | |
| uuid | CHAR(36) UNIQUE NOT NULL | uuid | |
| user_id | INT FK → users.id NOT NULL | uid | نویسنده |
| title | VARCHAR(255) NULL | label | عنوان (base field Drupal) |
| slug | VARCHAR(300) UNIQUE NOT NULL | — | اضافه‌شده در Symfony (در Drupal نیست!) |
| body | LONGTEXT NULL | description__value | محتوا (HTML) |
| status | TINYINT(1) DEFAULT 0 | status | منتشرشده/پیش‌نویس |
| is_top | TINYINT(1) DEFAULT 0 | field_top | نمایش در صفحه اول |
| image_id | INT FK → files.id NULL | field_image | تصویر شاخص (entity ref → file) |
| created_at | INT NOT NULL | created | Unix timestamp |
| updated_at | INT NOT NULL | changed | Unix timestamp |

## جدول: blog_tags (ManyToMany)
| ستون | نوع | نام Drupal | توضیح |
|------|-----|-----------|-------|
| blog_id | INT FK → blogs.id CASCADE | | |
| category_id | INT FK → categories.id CASCADE | field_tag | تگ/دسته‌بندی (entity ref → category/tag bundle) |

## نمونه داده واقعی از DB backup
```
id=14, label='روش های خانگی محافظت از پوست در تابستان', uid=22, status=1
id=15, 16, ... (22 مطلب)
field_image: target_id=97 (file entity)
```

## ایندکس‌ها
```sql
CREATE INDEX idx_blogs_status ON blogs(status);
CREATE INDEX idx_blogs_user ON blogs(user_id);
CREATE INDEX idx_blogs_created ON blogs(created_at DESC);
CREATE INDEX idx_blogs_top ON blogs(is_top);
CREATE UNIQUE INDEX idx_blogs_slug ON blogs(slug);
```

## نکات مهم
- `slug` در Drupal وجود ندارد — در Symfony باید auto-generate شود از `title`
- `image` در Drupal یک entity reference به file/media است — در Symfony مسیر فایل ذخیره می‌شود
- `body` در Drupal با نام `description__value` ذخیره می‌شود (base field)
- `status=1` = منتشرشده، `status=0` = پیش‌نویس
