ADR-002 - ฐานข้อมูลที่เป็นนามธรรม
ADR-002: นามธรรมของฐานข้อมูล
หัวข้อที่มีชื่อว่า “ADR-002: นามธรรมของฐานข้อมูล”บันทึกการตัดสินใจทางสถาปัตยกรรมสำหรับรูปแบบการเข้าถึงฐานข้อมูลเชิงวัตถุของ XOOPS
ยอมรับ - รูปแบบหลักตั้งแต่ XOOPS 2.0
XOOPS ต้องการกลยุทธ์การโต้ตอบกับฐานข้อมูลที่จะ:
- ไวยากรณ์ SQL เฉพาะฐานข้อมูลที่เป็นนามธรรม
- ให้การดำเนินการ CRUD ที่สอดคล้องกันในทุกโมดูล
- เปิดใช้งานการฆ่าเชื้อข้อมูลอัตโนมัติและการหลบหนี
- รองรับการเปลี่ยนแปลงกลไกฐานข้อมูลในอนาคต
- ลดความซับซ้อนของการดำเนินการทั่วไปสำหรับนักพัฒนา
ทางเลือกอื่นคือ:
- Raw SQL ตลอดทั้งโค้ดเบส
- เต็ม ORM (หลักคำสอน ฝีปาก)
- นามธรรมน้ำหนักเบาที่กำหนดเอง
แผนภาพการตัดสินใจ
หัวข้อที่มีชื่อว่า “แผนภาพการตัดสินใจ”mermaidgraph 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 กับ:
1. XoopsObject - ที่เก็บข้อมูล
หัวข้อที่มีชื่อว่า “1. XoopsObject - ที่เก็บข้อมูล”แต่ละเอนทิตีข้อมูลขยาย 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); }}2. ตัวจัดการ - ผู้จัดการฝ่ายปฏิบัติการ
หัวข้อที่มีชื่อว่า “2. ตัวจัดการ - ผู้จัดการฝ่ายปฏิบัติการ”แต่ละวัตถุมีตัวจัดการที่สอดคล้องกัน:
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()}3. เกณฑ์ - ตัวสร้างแบบสอบถาม
หัวข้อที่มีชื่อว่า “3. เกณฑ์ - ตัวสร้างแบบสอบถาม”เงื่อนไขการสืบค้นเชิงวัตถุ:
$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 sanitizationXOBJ_DTYPE_INT // IntegerXOBJ_DTYPE_TXTBOX // Single-line text (escaped)XOBJ_DTYPE_TXTAREA // Multi-line text (escaped)XOBJ_DTYPE_EMAIL // Email validationXOBJ_DTYPE_URL // URL validationXOBJ_DTYPE_ARRAY // Serialized arrayXOBJ_DTYPE_OTHER // No processingXOBJ_DTYPE_FLOAT // Floating pointมรดกตัวจัดการ
หัวข้อที่มีชื่อว่า “มรดกตัวจัดการ”mermaidclassDiagram 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ผลที่ตามมา
หัวข้อที่มีชื่อว่า “ผลที่ตามมา”- ความสม่ำเสมอ: โมดูลทั้งหมดใช้รูปแบบเดียวกัน
- ความปลอดภัย: การหลบหนีอัตโนมัติป้องกันการฉีด SQL
- ความเรียบง่าย: การดำเนินการทั่วไปต้องใช้โค้ดน้อยที่สุด
- การบำรุงรักษา: การเปลี่ยนแปลงเลเยอร์ฐานข้อมูลไม่มีผลกับโมดูล
- ความสามารถในการทดสอบ: สามารถจำลองตัวจัดการเพื่อทำการทดสอบได้
- ประสิทธิภาพ: โอเวอร์เฮดที่เป็นนามธรรมเพิ่มเติม
- ความซับซ้อน: เส้นโค้งการเรียนรู้สำหรับนักพัฒนาใหม่
- ข้อจำกัด: การสืบค้นที่ซับซ้อนอาจต้องใช้ข้อมูลดิบ SQL
- ปัญหา N+1: ไม่มีการโหลดแบบกระตือรือร้นในตัว
การบรรเทาผลกระทบ
หัวข้อที่มีชื่อว่า “การบรรเทาผลกระทบ”- ประสิทธิภาพ: แคชวัตถุที่เข้าถึงบ่อย
- ข้อความค้นหาที่ซับซ้อน: อนุญาตข้อมูลดิบ SQL เมื่อจำเป็น
- N+1: ใช้ getAll() ด้วยเกณฑ์ที่เหมาะสม
วิวัฒนาการเป็น XOOPS 4.0
หัวข้อที่มีชื่อว่า “วิวัฒนาการเป็น XOOPS 4.0”mermaidflowchart 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 --> GXOOPS แผน 4.0:
- หลักคำสอน DBAL สำหรับนามธรรมฐานข้อมูล
- รูปแบบพื้นที่เก็บข้อมูลแทนที่ตัวจัดการ
- ตัวสร้างแบบสอบถามสำหรับการสืบค้นที่ซับซ้อน
- การรวมคอนเทนเนอร์ PSR-11 เต็มรูปแบบ
ตัวอย่างโค้ด
หัวข้อที่มีชื่อว่า “ตัวอย่างโค้ด”พื้นฐาน CRUD
หัวข้อที่มีชื่อว่า “พื้นฐาน CRUD”$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
อ้างอิง
หัวข้อที่มีชื่อว่า “อ้างอิง”- Martin Fowler - รูปแบบของสถาปัตยกรรมแอปพลิเคชันระดับองค์กร
- แนวคิดการออกแบบที่ขับเคลื่อนด้วยโดเมน
- รูปแบบ Active Record และ Data Mapper
#xoops #architecture #adr #database #handler #การออกแบบ-การตัดสินใจ