Quando si tratta di dati, si scopre che, in sostanza, lo stesso codice viene ripetuto in varie incarnazioni:
-- MySQL:
CREATE TABLE users (
id int NOT NULL auto_increment PRIMARY KEY,
name varchar(255) NOT NULL,
email varchar(255) NOT NULL,
UNIQUE KEY akUser (email)
)
// PHP
class User extends DBModel {
protected $id;
protected $name;
protected $email;
function __construct() {
$this->queries = array(
'getById' => 'SELECT id, name, email FROM users WHERE id = :id',
'addUser' => 'INSERT INTO users (name, email) VALUES (:name, :email)',
'updateUser' => 'UPDATE users SET name = :name, email = :email WHERE id = :id',
);
}
public function loadById($id) {
$stmt = $this->getPreparedStatement('getById');
$stmt->bindValue(':id', $id);
$stmt->execute();
$stmt->setFetchMode(PDO::FETCH_INTO, $this);
return $stmt->fetch();
}
public function save() {
if ($this->id === NULL) {
$this->add();
}
else {
$this->update();
}
}
public function add() {
$stmt = $this->getPreparedStatement('addUser');
$stmt->bindValue(':name', $this->name);
$stmt->bindValue(':email', $this->email);
$stmt->execute();
}
public function update() {
$stmt = $this->getPreparedStatement('updateUser');
$stmt->bindValue(':name', $this->name);
$stmt->bindValue(':email', $this->email);
$stmt->bindValue(':id', $this-id);
$stmt->execute();
}
}
Se si nota, i campi "nome" e "e-mail" si verificano ciascuno 7 volte in PHP e MySQL. Anche se questo non è un grosso problema con questo piccolo esempio, con tabelle grandi e un numero elevato di tabelle, questo è fuori controllo abbastanza rapidamente.
Come una breve nota a margine: con PHP in esecuzione come servizio Web, la durata della domanda è molto breve. Molte delle query che vengono eseguite, ad esempio l'aggiunta di un utente, vengono eseguite una sola volta durante la durata dell'applicazione, pertanto le istruzioni preparate non offrono un gran vantaggio. Anche con la condivisione delle connessioni, le singole istanze non hanno accesso all'istruzione precedentemente preparata (a meno che manchi qualcosa), quindi preparerebbe comunque l'istruzione.
Con alcune riflessioni a livello di database di base (i cui risultati sono memorizzati nella cache o generati automaticamente prima della distribuzione), è possibile creare istruzioni SQL automaticamente, eliminando la necessità di codificare le istruzioni di base SELECT / INSERT / UPDATE / DELETE singolarmente - riducendo notevolmente il codice.
-- (table create statement, of course, stays the same)
class User {
protected $id;
protected $name;
protected $email;
public function getById($id) {
return MyDb::getById('Users', $id, $this);
}
public function save() {
return MyDb::save('Users', $this);
}
}
La mia domanda : è la duplicazione di codice che vale i pochi cicli della CPU e codice e ampli complessi; esigenze di manutenzione?