ADR-002 - Αφαίρεση βάσης δεδομένων
ADR-002: Αφαίρεση βάσης δεδομένων
Ενότητα με τίτλο «ADR-002: Αφαίρεση βάσης δεδομένων»Αρχιτεκτονική Απόφαση Εγγραφή για το αντικειμενοστραφή μοτίβο πρόσβασης στη βάση δεδομένων του XOOPS.
Κατάσταση
Ενότητα με τίτλο «Κατάσταση»Αποδεκτό - Βασικό μοτίβο από XOOPS 2.0
Περιεχόμενο
Ενότητα με τίτλο «Περιεχόμενο»Το XOOPS χρειαζόταν μια στρατηγική αλληλεπίδρασης με βάση δεδομένων που θα:
- Αφηρημένη σύνταξη SQL για συγκεκριμένη βάση δεδομένων
- Παρέχετε συνεπείς λειτουργίες CRUD σε όλες τις μονάδες
- Ενεργοποιήστε την αυτόματη εξυγίανση δεδομένων και διαφυγή
- Υποστήριξη μελλοντικών αλλαγών του μηχανισμού βάσης δεδομένων
- Απλοποιήστε τις κοινές λειτουργίες για προγραμματιστές
Οι εναλλακτικές ήταν:
- Ακατέργαστο 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Απόφαση
Ενότητα με τίτλο «Απόφαση»Θα εφαρμόσουμε ένα μοτίβο χειριστή με:
# 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. Handler - Operations Manager
Ενότητα με τίτλο «# 2. Handler - Operations Manager»Κάθε αντικείμενο έχει έναν αντίστοιχο χειριστή:
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Κληρονομικότητα χειριστή
Ενότητα με τίτλο «Κληρονομικότητα χειριστή»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Συνέπειες
Ενότητα με τίτλο «Συνέπειες»# Θετικό
Ενότητα με τίτλο «# Θετικό»- Συνέπεια: Όλες οι μονάδες χρησιμοποιούν τα ίδια μοτίβα
- Ασφάλεια: Η αυτόματη διαφυγή αποτρέπει την έγχυση SQL
- Απλότητα: Οι συνήθεις λειτουργίες απαιτούν ελάχιστο κωδικό
- Δυνατότητα συντήρησης: Οι αλλαγές στο επίπεδο βάσης δεδομένων δεν επηρεάζουν τις λειτουργικές μονάδες
- Δυνατότητα δοκιμής: Οι χειριστές μπορούν να κοροϊδεύονται για δοκιμές
# Αρνητικό
Ενότητα με τίτλο «# Αρνητικό»- Απόδοση: Επιπλέον έξοδα αφαίρεσης
- Πολυπλοκότητα: Καμπύλη εκμάθησης για νέους προγραμματιστές
- Περιορισμοί: σύνθετα ερωτήματα μπορεί να χρειάζονται ακατέργαστο SQL
- N+1 Πρόβλημα: Δεν υπάρχει ενσωματωμένη ανυπόμονη φόρτωση
# Μετριασμούς
Ενότητα με τίτλο «# Μετριασμούς»- Απόδοση: Αποθήκευση αντικειμένων με συχνή πρόσβαση
- Σύνθετα ερωτήματα: Να επιτρέπεται το ακατέργαστο SQL όταν χρειάζεται
- N+1: Χρησιμοποιήστε το getAll() με τα κατάλληλα κριτήρια
Εξέλιξη σε XOOPS 4.0
Ενότητα με τίτλο «Εξέλιξη σε 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 σχέδια:
- Δόγμα 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: Modular Architecture
- ADR-003: Smarty Template Engine
Αναφορές
Ενότητα με τίτλο «Αναφορές»- Martin Fowler - Patterns of Enterprise Application Architecture
- Έννοιες σχεδίασης που βασίζονται στον τομέα
- Μοτίβα Active Record έναντι Data Mapper