رفتن به محتوا

ADR-002 - چکیده پایگاه داده

ADR-002: انتزاع پایگاه داده

Section titled “ADR-002: انتزاع پایگاه داده”

ثبت تصمیم معماری برای الگوی دسترسی به پایگاه داده شی گرا XOOPS.


پذیرفته شده - الگوی اصلی از XOOPS 2.0


XOOPS به یک استراتژی تعامل با پایگاه داده نیاز داشت که:

  1. سینتکس SQL مخصوص پایگاه داده را انتزاع کنید
  2. عملیات CRUD منسجم را در همه ماژول ها ارائه دهید
  3. پاکسازی و فرار خودکار داده ها را فعال کنید
  4. پشتیبانی از تغییرات موتور پایگاه داده آینده
  5. عملیات مشترک را برای توسعه دهندگان ساده کنید

جایگزین ها عبارت بودند از:

  • SQL خام در سراسر پایگاه کد
  • ORM کامل (دکترین، فصیح)
  • انتزاع سبک وزن سفارشی

graph TB
subgraph "Application Layer"
A[Module Code]
B[Handler Methods]
end
subgraph "Abstraction Layer"
C[XoopsObjectHandler]
D[XoopsPersistableObjectHandler]
E[Criteria System]
end
subgraph "Database Layer"
F[XoopsDatabase]
G[MySQLDatabase]
H[PDO Wrapper]
end
subgraph "Storage"
I[(MySQL/MariaDB)]
end
A --> B
B --> C
B --> D
C --> E
D --> E
E --> F
F --> G
F --> H
G --> I
H --> I

ما یک Handler Pattern را با موارد زیر پیاده سازی خواهیم کرد:

هر موجودیت داده XoopsObject را گسترش می دهد:

class Item extends XoopsObject
{
public function __construct()
{
$this->initVar('id', XOBJ_DTYPE_INT, null, false);
$this->initVar('title', XOBJ_DTYPE_TXTBOX, '', true, 255);
$this->initVar('content', XOBJ_DTYPE_TXTAREA, '', false);
$this->initVar('status', XOBJ_DTYPE_INT, 0, false);
}
}

هر شی دارای یک کنترل کننده مربوطه است:

class ItemHandler extends XoopsPersistableObjectHandler
{
public function __construct($db)
{
parent::__construct($db, 'mymodule_items', Item::class, 'id', 'title');
}
// CRUD methods inherited:
// - create(), get(), insert(), delete()
// - getObjects(), getCount(), getAll()
}

شرایط پرس و جو شی گرا:

$criteria = new CriteriaCompo();
$criteria->add(new Criteria('status', 1));
$criteria->add(new Criteria('created', time() - 86400, '>='));
$criteria->setSort('created');
$criteria->setOrder('DESC');
$criteria->setLimit(10);
$items = $handler->getObjects($criteria);

// Variable types with automatic sanitization
XOBJ_DTYPE_INT // Integer
XOBJ_DTYPE_TXTBOX // Single-line text (escaped)
XOBJ_DTYPE_TXTAREA // Multi-line text (escaped)
XOBJ_DTYPE_EMAIL // Email validation
XOBJ_DTYPE_URL // URL validation
XOBJ_DTYPE_ARRAY // Serialized array
XOBJ_DTYPE_OTHER // No processing
XOBJ_DTYPE_FLOAT // Floating point

classDiagram
class XoopsObjectHandler {
<<abstract>>
#db: XoopsDatabase
+create(): XoopsObject
+get(id): XoopsObject
+insert(object): bool
+delete(object): bool
}
class XoopsPersistableObjectHandler {
+getObjects(criteria): array
+getCount(criteria): int
+getAll(criteria): array
+deleteAll(criteria): bool
+updateAll(field, value, criteria): bool
}
class ItemHandler {
+getPublishedItems(): array
+getByCategory(catId): array
}
XoopsObjectHandler <|-- XoopsPersistableObjectHandler
XoopsPersistableObjectHandler <|-- ItemHandler

  1. **ثبات **: همه ماژول ها از الگوهای یکسانی استفاده می کنند
  2. امنیت: فرار خودکار از تزریق SQL جلوگیری می کند
  3. سادگی: عملیات رایج به حداقل کد نیاز دارد
  4. قابلیت نگهداری: تغییرات در لایه پایگاه داده بر ماژول ها تأثیر نمی گذارد
  5. آزمایش پذیری: کنترل کننده ها را می توان برای آزمایش مورد تمسخر قرار داد
  1. ** عملکرد **: سربار انتزاع اضافی
  2. پیچیدگی: منحنی یادگیری برای توسعه دهندگان جدید
  3. محدودیت ها: پرس و جوهای پیچیده ممکن است به SQL خام نیاز داشته باشند
  4. ** مشکل N+1 **: بدون بارگیری مشتاق داخلی
  • ** عملکرد **: اشیایی که اغلب به آنها دسترسی دارند را در حافظه پنهان ذخیره کنید
  • پرس و جوهای پیچیده: در صورت نیاز به SQL خام اجازه دهید
  • N+1: از getAll() با معیارهای مناسب استفاده کنید

flowchart LR
subgraph "Current (2.5.x)"
A[XoopsDatabase]
B[Handlers]
C[Criteria]
end
subgraph "Future (4.0.x)"
D[PDO/DBAL]
E[Repository Pattern]
F[Query Builder]
G[DI Container]
end
A --> D
B --> E
C --> F
D --> G
E --> G

برنامه های XOOPS 4.0:

  • دکترین DBAL برای انتزاع پایگاه داده
  • الگوی مخزن جایگزین کنترلرها
  • سازنده پرس و جو برای پرس و جوهای پیچیده
  • یکپارچه سازی کامل کانتینر PSR-11

$helper = Helper::getInstance();
$handler = $helper->getHandler('Item');
// Create
$item = $handler->create();
$item->setVar('title', 'New Item');
$handler->insert($item);
// Read
$item = $handler->get($id);
$title = $item->getVar('title');
// Update
$item->setVar('title', 'Updated Title');
$handler->insert($item);
// Delete
$handler->delete($item);
$criteria = new CriteriaCompo();
$criteria->add(new Criteria('status', 'published'));
$criteria->add(new Criteria('category_id', '(1,2,3)', 'IN'));
$criteria->add(new Criteria('created', strtotime('-30 days'), '>='));
$criteria->setSort('views');
$criteria->setOrder('DESC');
$criteria->setLimit(10);
$criteria->setStart(0);
$items = $handler->getObjects($criteria);
$total = $handler->getCount($criteria);

  • ADR-001: معماری مدولار
  • ADR-003: Smarty Template Engine

  • مارتین فاولر - الگوهای معماری کاربردی سازمانی
  • مفاهیم طراحی دامنه محور
  • الگوهای Active Record در مقابل Data Mapper

#xoops #معماری #adr #پایگاه داده #هندلر #طراحی-تصمیم