رفتن به محتوا

طراحی طرحواره پایگاه داده

طراحی طرحواره پایگاه داده مناسب برای عملکرد و نگهداری ماژول XOOPS بسیار مهم است. این راهنما بهترین روش‌ها را برای طراحی جدول، روابط، نمایه‌سازی و مهاجرت پوشش می‌دهد.

قراردادهای نامگذاری جدول

Section titled “قراردادهای نامگذاری جدول”
{prefix}_{modulename}_{tablename}

مثال ها:

  • xoops_mymodule_articles
  • xoops_mymodule_categories
  • xoops_mymodule_article_category (میز اتصال)

از جای‌بان {PREFIX} استفاده کنید:

CREATE TABLE `{PREFIX}_mymodule_articles` (
...
);
داده هانوع MySQLنوع PHPتوضیحات
شناسه (ULID)VARCHAR(26)stringشناسه های ULID
شناسه (خودکار)INT UNSIGNED AUTO_INCREMENTintشناسه های متوالی
متن کوتاهVARCHAR(n)stringتا 255 کاراکتر
متن طولانیTEXTstringمتن نامحدود
متن غنیMEDIUMTEXTstringمحتوای HTML
بولیTINYINT(1)boolTrue/false
شمارشENUM(...)stringگزینه های ثابت
تاریخDATEDateTimeImmutableفقط تاریخ
تاریخ زمانDATETIMEDateTimeImmutableتاریخ و زمان
مهر زمانINT UNSIGNEDintمهر زمانی یونیکس
قیمتDECIMAL(10,2)floatارزش ارز
JSONJSONarrayداده های ساخت یافته
CREATE TABLE `{PREFIX}_mymodule_articles` (
`id` VARCHAR(26) NOT NULL COMMENT 'ULID identifier',
`title` VARCHAR(255) NOT NULL,
`slug` VARCHAR(255) NOT NULL,
`content` MEDIUMTEXT,
`summary` TEXT,
`status` ENUM('draft', 'pending', 'published', 'archived') DEFAULT 'draft',
`author_id` INT UNSIGNED NOT NULL,
`category_id` INT UNSIGNED,
`views` INT UNSIGNED DEFAULT 0,
`is_featured` TINYINT(1) DEFAULT 0,
`published_at` DATETIME DEFAULT NULL,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_slug` (`slug`),
KEY `idx_status` (`status`),
KEY `idx_author` (`author_id`),
KEY `idx_category` (`category_id`),
KEY `idx_published` (`published_at`),
KEY `idx_featured` (`is_featured`, `published_at`),
CONSTRAINT `fk_article_author`
FOREIGN KEY (`author_id`) REFERENCES `{PREFIX}_users` (`uid`)
ON DELETE RESTRICT ON UPDATE CASCADE,
CONSTRAINT `fk_article_category`
FOREIGN KEY (`category_id`) REFERENCES `{PREFIX}_mymodule_categories` (`id`)
ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Categories (one)
CREATE TABLE `{PREFIX}_mymodule_categories` (
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(255) NOT NULL
);
-- Articles (many)
CREATE TABLE `{PREFIX}_mymodule_articles` (
`id` VARCHAR(26) PRIMARY KEY,
`category_id` INT UNSIGNED,
FOREIGN KEY (`category_id`) REFERENCES `{PREFIX}_mymodule_categories` (`id`)
);
-- Articles
CREATE TABLE `{PREFIX}_mymodule_articles` (
`id` VARCHAR(26) PRIMARY KEY,
`title` VARCHAR(255) NOT NULL
);
-- Tags
CREATE TABLE `{PREFIX}_mymodule_tags` (
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(100) NOT NULL,
UNIQUE KEY (`name`)
);
-- Junction table
CREATE TABLE `{PREFIX}_mymodule_article_tags` (
`article_id` VARCHAR(26) NOT NULL,
`tag_id` INT UNSIGNED NOT NULL,
PRIMARY KEY (`article_id`, `tag_id`),
FOREIGN KEY (`article_id`) REFERENCES `{PREFIX}_mymodule_articles` (`id`) ON DELETE CASCADE,
FOREIGN KEY (`tag_id`) REFERENCES `{PREFIX}_mymodule_tags` (`id`) ON DELETE CASCADE
);

ارجاع به خود (سلسله مراتب)

Section titled “ارجاع به خود (سلسله مراتب)”
CREATE TABLE `{PREFIX}_mymodule_categories` (
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`parent_id` INT UNSIGNED DEFAULT NULL,
`name` VARCHAR(255) NOT NULL,
`path` VARCHAR(1000) COMMENT 'Materialized path: /1/5/12/',
`depth` TINYINT UNSIGNED DEFAULT 0,
KEY `idx_parent` (`parent_id`),
KEY `idx_path` (`path`(255)),
FOREIGN KEY (`parent_id`) REFERENCES `{PREFIX}_mymodule_categories` (`id`)
ON DELETE SET NULL
);

چه زمانی باید نمایه شود

Section titled “چه زمانی باید نمایه شود”
سناریونوع شاخص
کلید اصلیاولیه
محدودیت منحصر به فردمنحصر به فرد
کلید خارجیکلید معمولی
ستون بند WHEREکلید معمولی
ترتیب بر اساس ستونکلید معمولی
جستجوی متن کاملمتن کامل

سفارش مهم است - انتخابی ترین ستون ابتدا:

-- Good: matches WHERE status = 'published' ORDER BY created_at
KEY `idx_status_created` (`status`, `created_at`)
-- Query optimization
SELECT * FROM articles
WHERE status = 'published'
ORDER BY created_at DESC

برای جلوگیری از جستجوی جدول، تمام ستون های پرس و جو را اضافه کنید:

-- Covers: SELECT title, status FROM articles WHERE author_id = ?
KEY `idx_author_covering` (`author_id`, `title`, `status`)
migrations/001_create_articles.php
<?php
return new class {
public function up(\XoopsDatabase $db): void
{
$prefix = $db->prefix('mymodule_articles');
$sql = "CREATE TABLE IF NOT EXISTS `{$prefix}` (
`id` VARCHAR(26) NOT NULL,
`title` VARCHAR(255) NOT NULL,
`created_at` DATETIME NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4";
$db->queryF($sql);
}
public function down(\XoopsDatabase $db): void
{
$prefix = $db->prefix('mymodule_articles');
$db->queryF("DROP TABLE IF EXISTS `{$prefix}`");
}
};
migrations/002_add_status_column.php
public function up(\XoopsDatabase $db): void
{
$table = $db->prefix('mymodule_articles');
$db->queryF("ALTER TABLE `{$table}` ADD COLUMN `status` ENUM('draft','published') DEFAULT 'draft' AFTER `title`");
$db->queryF("CREATE INDEX `idx_status` ON `{$table}` (`status`)");
}
  1. از InnoDB استفاده کنید - از تراکنش ها و کلیدهای خارجی پشتیبانی می کند
  2. UTF8MB4 - پشتیبانی کامل از یونیکد از جمله ایموجی ها
  3. NOT NULL - در صورت امکان به جای ستون های nullable از پیش فرض ها استفاده کنید
  4. **انواع مناسب ** - از TEXT برای رشته های کوتاه استفاده نکنید
  5. **شاخص اندک ** - هر شاخص سرعت نوشتن را کاهش می دهد
  6. ** طرحواره سند ** - COMMENT را به ستون ها اضافه کنید
  7. از کلمات رزرو شده اجتناب کنید - از order، group، key به عنوان نام ستون استفاده نکنید
  • ../Database-Operations - اجرای پرس و جو
  • ../../04-API-Reference/Database/Criteria - ساختمان پرس و جو
  • مهاجرت - نسخه بندی طرحواره
  • ../../01-Getting-Started/Configuration/Performance-Optimization - بهینه سازی پرس و جو