ADR-002 - Adatbázis-absztrakció
ADR-002: Adatbázis-absztrakció
Szekció neve “ADR-002: Adatbázis-absztrakció”Architektúra döntési rekordja a XOOPS objektumorientált adatbázis-hozzáférési mintájához.
Állapot
Szekció neve “Állapot”Elfogadva – Magminta a XOOPS 2.0 óta
Kontextus
Szekció neve “Kontextus”A XOOPS-nak olyan adatbázis-interakciós stratégiára volt szüksége, amely:
- Absztrakt adatbázis-specifikus SQL szintaxis
- Konzisztens CRUD műveleteket biztosítson az összes modulon
- Engedélyezze az adatok automatikus fertőtlenítését és menekülését
- Támogassa a jövőbeni adatbázis-motor módosításokat
- Egyszerűsítse a közös műveleteket a fejlesztők számára
Az alternatívák a következők voltak:
- Nyers SQL a kódbázisban
- Teljes ORM (Doktrína, ékesszóló)
- Egyedi könnyű absztrakció
Döntési diagram
Szekció neve “Döntési diagram”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 --> IDöntés
Szekció neve “Döntés”Kezelői mintát valósítunk meg a következőkkel:
1. XOOPSObject – Adattároló
Szekció neve “1. XOOPSObject – Adattároló”Minden adatentitás kiterjeszti az XOOPSObject-et:
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. Kezelő – Operations Manager
Szekció neve “2. Kezelő – Operations Manager”Minden objektumhoz tartozik egy megfelelő kezelő:
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. Feltételek – Lekérdezéskészítő
Szekció neve “3. Feltételek – Lekérdezéskészítő”Objektumorientált lekérdezési feltételek:
$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);Adattípus állandók
Szekció neve “Adattípus állandók”// 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 pointKezelői öröklés
Szekció neve “Kezelői öröklés”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 <|-- ItemHandlerKövetkezmények
Szekció neve “Következmények”Pozitív
Szekció neve “Pozitív”- Konzisztencia: Minden modul ugyanazt a mintát használja
- Biztonság: Az automatikus kilépés megakadályozza a SQL befecskendezést
- Egyszerűség: A gyakori műveletek minimális kódot igényelnek
- Karbantarthatóság: Az adatbázisréteg módosításai nem érintik a modulokat
- Tesztelhetőség: A kezelőket ki lehet gúnyolni tesztelés céljából
Negatív
Szekció neve “Negatív”- Teljesítmény: Extra absztrakciós költség
- Bonyolultság: Tanulási görbe új fejlesztők számára
- Korlátozások: Az összetett lekérdezésekhez nyers SQL
- N+1 Probléma: Nincs beépített lelkes töltés
Enyhítések
Szekció neve “Enyhítések”- Teljesítmény: A gyakran használt objektumok gyorsítótárazása
- ** Összetett lekérdezések**: Ha szükséges, engedélyezze a nyers SQL
- N+1: Használja a getAll() függvényt megfelelő feltételekkel
Evolution to XOOPS 4.0
Szekció neve “Evolution to XOOPS 4.0”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 --> GXOOPS 4.0 tervek:
- DBAL doktrína az adatbázis-absztrakcióhoz
- A kezelőket helyettesítő adattár minta
- Lekérdezéskészítő összetett lekérdezésekhez
- Teljes PSR-11 konténerintegráció
Kódpéldák
Szekció neve “Kódpéldák”Alapvető CRUD
Szekció neve “Alapvető 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);Összetett lekérdezés
Szekció neve “Összetett lekérdezés”$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);Kapcsolódó határozatok
Szekció neve “Kapcsolódó határozatok”- ADR-001: moduláris felépítés
- ADR-003: Smarty sablonmotor
Referenciák
Szekció neve “Referenciák”- Martin Fowler - Vállalati alkalmazásarchitektúra mintái
- Domain-vezérelt tervezési koncepciók
- Active Record vs Data Mapper minták
#xoops #architecture #adr #adatbázis #kezelő #design-döntés