Administrateur PHPfrance |
3131 Messages
23 avr. 2008, 13:11
Une solution simple et qui a l'avantage de respecter le concept d'héritage, c'est bien l'utilisation d'une clé étrangère vers ta table mère.
Prenons un exemple assez simple avec une table des "users" et une table des "clients", un client étant un user particulier (et donc naturellement client hérite de user).
Tables :
t_user (id, username, password, email)
t_client (id, user_id --> user.id, contract_number, address)
Classes :
interface Persistant {
public function load($id); // load from database
public function save(); // save to database
public function delete(); // delete from database
public function isNew(); // is a loaded object or a freshly created one ?
}
class User implements Persistant {
public function load($id) { /* interroge t_user */ }
public function save() { /* insère (ou update, selon isNew()) dans t_user */ }
public function delete() { /* supprime dans t_user */ }
public function getUsername() { ... }
public function setUsername() { ... }
public function getPassword() { ... }
public function setPassword() { ... }
public function getEmail() { ... }
public function setEmail() { ... }
}
class Client extends User {
public function load($id) { /* interroge t_client en jointure avec t_user */ }
public function save() { /* insère (ou update, selon isNew()) dans t_user, puis dans t_client */ }
public function delete() { /* supprime dans t_client, puis dans t_user, sauf si on a du ONDELETE=Cascade géré directement par la bdd */ }
public function getContractNumber() { ... }
public function setContractNumber() { ... }
}
Les avantages sont multiples, l'inconvénient est de "couper" les données en deux. Cet inconvénient n'en est un que lorsqu'on utilise PhpMyAdmin en guise de back-office au lieu d'en faire un vrai
Note : quand on fait ce genre de modélisation, au niveau de l'implémentation il vaudra mieux choisir InnoDB qui permet d'imposer le respect des contraintes de clés étrangères et d'utiliser du "OnDelete = Cascade" très utile pour éviter de se soucier de ce genre de détails au niveau applicatif (ça économise moultes requêtes, et savoir que la cohérence des données est assurée au niveau le plus bas c'est drôlement rassurant).