Tablespace در Django: مدیریت محل ذخیره‌سازی جداول و ایندکس‌ها در دیتابیس

این مقاله مفهوم Tablespace در Django را توضیح می‌دهد؛ اینکه چگونه می‌توان محل ذخیره‌سازی جداول و ایندکس‌ها را کنترل کرد، چگونه از db_tablespace در مدل‌ها و فیلدها استفاده می‌شود، نقش DEFAULT_TABLESPACE و DEFAULT_INDEX_TABLESPACE چیست، و کدام دیتابیس‌ها از tablespace پشتیبانی می‌کنند. همچنین یک مثال کامل برای درک بهتر ارائه شده است.

tablespace, db_tablespaceDEFAULT_TABLESPACE, DEFAULT_INDEX_TABLESPACEindex tablespace, Django ORM, PostgreSQL, Oracle

~2 دقیقه مطالعه • بروزرسانی ۱۹ اسفند ۱۴۰۴

۱. مقدمه: Tablespace چیست؟

Tablespace یک تکنیک رایج در دیتابیس‌ها برای بهینه‌سازی عملکرد و مدیریت بهتر فضای ذخیره‌سازی است. با tablespace می‌توانید تعیین کنید هر جدول یا ایندکس روی کدام بخش از دیسک ذخیره شود.

نکته مهم: Django خودش tablespace ایجاد نمی‌کند. باید tablespace را مستقیماً در دیتابیس بسازید.

۲. تعیین Tablespace برای جداول

برای تعیین tablespace یک مدل، از گزینهٔ db_tablespace در class Meta استفاده می‌شود:


class MyModel(models.Model):
    ...
    class Meta:
        db_tablespace = "my_tablespace"

این گزینه روی جداول ManyToMany نیز اعمال می‌شود.

استفاده از DEFAULT_TABLESPACE

اگر می‌خواهید tablespace پیش‌فرض برای همهٔ مدل‌ها (یا اپ‌هایی که کنترلشان را ندارید) تعیین کنید:


DEFAULT_TABLESPACE = "default_ts"

۳. تعیین Tablespace برای ایندکس‌ها

برای ایندکس‌ها دو روش وجود دارد:

۳.۱ تعیین tablespace در Index()


models.Index(fields=["shortcut"], db_tablespace="other_indexes")

۳.۲ تعیین tablespace در فیلد (برای ایندکس تک‌ستونی)


name = models.CharField(max_length=30, db_index=True, db_tablespace="indexes")

اگر فیلد ایندکس نداشته باشد، این گزینه نادیده گرفته می‌شود.

DEFAULT_INDEX_TABLESPACE

برای تعیین tablespace پیش‌فرض ایندکس‌ها:


DEFAULT_INDEX_TABLESPACE = "default_index_ts"

اگر هیچ tablespace مشخص نشود، ایندکس در همان tablespace جدول ساخته می‌شود.

۴. مثال کامل


class TablespaceExample(models.Model):
    name = models.CharField(max_length=30, db_index=True, db_tablespace="indexes")
    data = models.CharField(max_length=255, db_index=True)
    shortcut = models.CharField(max_length=7)
    edges = models.ManyToManyField(to="self", db_tablespace="indexes")

    class Meta:
        db_tablespace = "tables"
        indexes = [
            models.Index(fields=["shortcut"], db_tablespace="other_indexes")
        ]

توضیح رفتار:

  • جدول مدل و جدول ManyToMany → در tablespace با نام tables
  • ایندکس فیلد name → در indexes
  • ایندکس فیلد data → tablespace مشخص نشده → در tables
  • ایندکس فیلد shortcut → در other_indexes
  • ایندکس‌های جدول ManyToMany → در indexes

۵. پشتیبانی دیتابیس‌ها از Tablespace

دیتابیسپشتیبانی از Tablespace
PostgreSQL✔ بله
Oracle✔ بله
SQLite✘ خیر
MariaDB✘ خیر
MySQL✘ خیر

اگر دیتابیس از tablespace پشتیبانی نکند، Django تمام گزینه‌های مربوط به tablespace را نادیده می‌گیرد.

جمع‌بندی

Tablespace ابزاری قدرتمند برای کنترل محل ذخیره‌سازی جداول و ایندکس‌هاست. Django امکان تعیین tablespace را در سطح مدل، فیلد و ایندکس فراهم می‌کند، اما ایجاد و مدیریت tablespace بر عهدهٔ خود دیتابیس است. شناخت پشتیبانی دیتابیس‌ها از tablespace برای استفادهٔ صحیح از این قابلیت ضروری است.

نوشته و پژوهش شده توسط دکتر شاهین صیامی