8768 sujets

Développement web côté serveur, CMS

Bonjour à tous
Dans ma petite base de données il y a une table Addresses avec un champ AddressID qui indique "l'adresse de QUOI ou l'adresse de QUI"
S'il s'agit de l'adresse d'un membre de l'association, AddressID est égal au champ mbID de la table Members
S'il s'agit de l'adresse d'un lieu de concert ou de répétition, AddressID est égal au champ locationID de la table Locations.

Pour l'instant, en cas de suppression d'un lieu ou d'un membre, j'ai un code spécifique qui supprime également la ligne correspondante de la table Addresses

J'aimerais rendre cela plus propre en créant une "clé étrangère" dans la table Addresses,
mais je ne sais pas comment faire ça sans passer par une bidouille du genre créer pour chaque membre une entrée dans la table Location et jouer sur deux clés étrangères en cascade.
Y a-t-il un moyen de traiter le problème sans ce genre de bidouille ?
Modérateur
Salut JP,

pourquoi as tu scindé adresse de user ? en générale, lorsqu'on fait ce genre de choses, c'est pour traiter l'immobilier.
Merci de t’intéresser à la question.

La principale raison c’est qu’une adresse est un "objet" qui peut être une propriété d’un "objet" Member ou d’un "objet" Location. Mettre les propriétés de l’objet Address dans l’objet Member et faire la même chose pour l’objet Location ne m’a pas semblé une bonne idée.
Pour le reste c’est plutôt une curiosité technique sur l’utilisation des clés étrangères qu’un besoin réel car il arrive rarement que je doive supprimer une adresse et le code actuel est satisfaisant.
Modifié par PapyJP (20 Dec 2022 - 10:14)
Après quelques essais et relecture de doc, je comprends que ce que je pensais faire n'est pas possible: si on définit une clé étrangère dans une table, on indique par là que cette table est la "fille" d'une autre table.
Dans mon cas, ou bien la table Addresses est la fille de Locations ou c'est la fille de Members, mais pas des deux.
Je ne crois même pas qu'il soit possible de passer par une indirection en créant un lieu "domicile d'untel" dans la table Locations, car il faudrait que la table Location devienne la fille de la table Members pour que la suppression d'un élément de Members entraîne la suppression de ce lieu pour entraîner en cascade la suppression de l'adresse, et donc il faudrait également créer un membre fictif qui soit le propriétaire des lieux qui ne sont pas des adresses de membres.
Curieux !
Y aurait il quelque chose que j'ai mal compris ?
Modifié par PapyJP (20 Dec 2022 - 12:24)
Modérateur
Le SQL n'a jamais été un langage objet et ne le sera jamais. J'entends par là qu'un langage objet doit avoir :
- un système d'héritage
- polyphormisme
- etc.

Par contre, on peut considérer une table comme un pseudo objet (entité) avec des attributs (champs) [^1]. Par contre, lorsque tu utilises un ORM, il est récurant d'utiliser des objets. Mais cela n'est pas du SQL proprement dit.


[^1] : Edgar Frank Codd
Hello,

Je rebondis rapidement : postgresql est une base de donnée orientée objet avec laquelle il est possible de faire de l’héritage par exemple.

@papy pour mois c’est toujours la même chose : c’est ton modèle de données qui t’induit des problèmes Smiley smile
Je n’ai pas le choix de la base de données, elle est imposée par l’hébergeur.

Oui, j’ai bien compris que le SQL n’est pas fait pour traiter des objets, mais après avoir compris l’importance de la POO il y a plus de 30 ans, je n’ai aucune envie de programmer différemment. Mon code consiste donc à fabriquer des objets à partir des tables de la base et réciproquement.

Avant d’utiliser une base de données relationnelle j’avais fait mon propre système de base de données objet à base de fichiers XML qui marchait fort bien, mais si je veux passer la main un jour il me faut rentrer dans le rang.
Il est sûr que mon modèle pourrai être amélioré. Il a été conçu à partir du précédent et ce n’est que progressivement que je fais des modifications homéopathiques pour essayer de coller un peu plus à l’outil dont je dispose.
C’est justement l’une de ces légères modifications qui m’a conduit à poser cette question. Pour autant que je comprenne, il serait plus orthodoxe de mettre les adresses dans les deux tables, ou créer deux tables d’adresses distinctes sur le même modèle. Si c’est le cas je préfère rester dans mon hérésie et conserver les quelques lignes de code permettant de conserver l’intégrité Smiley cligne
Avez-vous quelque chose d’autre à me proposer ?
Modifié par PapyJP (21 Dec 2022 - 09:26)
Modérateur
Anymah a écrit :
Hello,

Je rebondis rapidement : postgresql est une base de donnée orientée objet avec laquelle il est possible de faire de l’héritage par exemple.


PostgreSQL n'est pas une db objet (au sens strict de la philosophie oop). C'est un abus de langage et une confusion.... PostgreSQL propose une extension vers l'objet. C'est à dire de s'interfacer avec un langage objet tel que Python, Java, PHP, Ruby, C#, etc. Tu n'as pas :
- polyphormisme
- encapsulation
- héritage
- etc.

Sinon, je pense que tu parles des templates ou des schemas. Pour faire simple, c'est juste des patrons que tu peux utiliser pour créer tes db et tables.

@JP: utilise un ORM (un vrai et pas un simple query builder[^1]). Puisque tu codes en php
- Doctrine
- NotORM (il me semble qu'il n'y ait pas de migration)
- redbean
- l'ORM de Cakephp qui de mémoire peut être utilisé en standalone

[^1]:
- query builder
- composition de model
- tous les types de champ
- CRUD
- connexion aux databases (tels que sqlite, mysql, postgres, sqlserver, oracle, etc.)
- migration
- etc.
Modifié par niuxe (20 Dec 2022 - 21:41)
Je parle bien d’héritage comme dans cet exemple de documentation.

Après je te rejoins, ça n’a rien à voir avec tout ce que la POO peut offrir. Mais néanmoins en terme de requête SQL c’est déjà sacrément cool Smiley smile
Modérateur
Je ne connaissais pas INHERITS (spécificités à postgresql et peut être sqlserver et Oracle)

Cependant, avec ce mot clef je ne suis pas sûr que tu aies une bonne maintenance. Autant faire un alter et une relation 1 * 1.

Aussi, il ne faut pas oublier qu'en poo, l'heritage, il faut s'en méfier comme de la peste (au final, tu peux avoir des incohérences)
Modifié par niuxe (20 Dec 2022 - 23:55)
@niuxe
Effectivement si j'avais connu l'existence de doctrine (ou autre ORM) cela m'aurait beaucoup facilité la tâche, plutôt que de développer moi même quelque chose de moins bien.
Néanmoins si je veux transmettre la maintenance de mon site à quelqu'un d'autre il me semble préférable de ne pas demander à cette personne de connaître un outil supplémentaire.
Modérateur
PapyJP a écrit :
@niuxe
Effectivement si j'avais connu l'existence de doctrine (ou autre ORM) cela m'aurait beaucoup facilité la tâche, plutôt que de développer moi même quelque chose de moins bien.
Néanmoins si je veux transmettre la maintenance de mon site à quelqu'un d'autre il me semble préférable de ne pas demander à cette personne de connaître un outil supplémentaire.

Abraham Maslow a écrit :

« Si le seul outil que vous avez est un marteau, vous tendez à voir tout problème comme un clou »

Modifié par niuxe (21 Dec 2022 - 12:29)
Oui, quand je travaillais chez un constructeur d'ordinateur, j'ai remarqué que pour un même problème le spécialiste du hardware proposait de changer le hardware de la machine, le spécialiste des langages proposait de créer un nouveau langage de programmation, etc. Smiley smile
Chacun voit midi à sa porte...

Je ne m'étonne non plus pas que si l'outil que je suis contraint d'utiliser ne convient pas à mes besoins, certains me proposent de changer mes besoins pour entrer dans la norme de l'outil, ou me proposent de changer d'outil, ou d'ajouter une sur-couche à l'outil.

Ce qui m'intéresse c'est de savoir ce que d'autres font ou feraient à ma place, ça me permet parfois de changer ma façon de faire, le plus souvent d'orienter différemment mon travail.
Je ne peux une fois encore que remercier ceux qui répondent à mes questions et me permettent de regarder les chose sous un nouveau jour.
Quand on n'est plus dans le milieu professionnel depuis des années, à la vitesse où les choses évoluent il est important de se tenir informé, même s'il n'est pas possible de tout apprendre et de tout maîtriser.
Modifié par PapyJP (21 Dec 2022 - 16:55)
Modérateur
PapyJP a écrit :
Oui, quand je travaillais chez un constructeur d'ordinateur, j'ai remarqué que pour un même problème le spécialiste du hardware proposait de changer le hardware de la machine, le spécialiste des langages proposait de créer un nouveau langage de programmation, etc. Smiley smile
Chacun voit midi à sa porte...


Tu te compliques la vie. (ma réponse initiale) Je t'ai indiqué que je ne voyais pas pourquoi tu scindes cette donnée. En faisant du SQL d'une manière raisonnable sur des petits et moyens projets, il n'est pas nécessaire de sortir l'artillerie. Je t'ai indiqué que le SQL n'est pas un langage objet et les bases de données ne le sont pas en tant que telles.

PapyJP a écrit :

Ce qui m'intéresse c'est de savoir ce que d'autres font ou feraient à ma place, ça me permet parfois de changer ma façon de faire, le plus souvent d'orienter différemment mon travail.


Je t'ai parlé d'ORM. Parce que tu veux une approche objet. Quand on parle de ce genre de chose (POO et DB), on pense ORM . Ce genre d'outil est conçu pour des projets plus structurés.

PapyJP a écrit :

Je ne peux une fois encore que remercier ceux qui répondent à mes questions et me permettent de regarder les chose sous un nouveau jour.


Pour tes projets et même si tu fais une passation de projets à une tierce personne, tu n'es pas obligé de suivre la tendance (utilisation d'un framework).

Si dans le cas où tu optes pour un framework, alors ce n'est pas parce que tout le monde va dans la même boulangerie que le pain est meilleur. Fût un temps, je sais qu'alsacreations.com (version 2.0 & 3.0) n'était pas conçu avec le framework utilisé par tout le monde (Symfony).

Si tu veux une meilleure architecture pour ton/tes projet/s et aller plus vite, regarde ce qui se fait dans le monde de PHP (puisque tu développes en PHP). En cadre de travail, tu as l'embarras et tu peux choisir celui qui te convient le mieux puisque tu n'as pas la contrainte professionnelle (le client veut ça) .
- Symfony
- Laravel
- Lummen
- Code Igniter
- CakePHP
- FuelPHP
- FalconPHP
- YII
- SlimPHP
- etc.

Celui que je te conseillerai serait : CakePHP. La documentation est en français depuis la version 1.3.7 (de mémoire) et il est assez simple à utiliser (il faut avoir des connaissances solides en php et en développement côté serveur). Il convient très bien pour les petits et moyens projets. Je l'ai beaucoup utilisé dans le travail et dans mes projets personnels.

Un autre aussi qui est simple d'accès (mais la doc est en anglais). Code Igniter est simple. Je l'ai utilisé pour 3 projets. C'est sympa comme framework. Tu ne te prends pas la tête.

Aussi, si tu veux, je peux te filer ce que j'avais fait il y a quelques années avec un micro framework php (je ne le maintiens plus puisque je ne code plus en php). Tu as une base solide (actuellement c'est une structure MV. Si on rajoute la couche model (facile à mettre en place), ce sera un MVC). Il y a beaucoup moins d'outils que te propose un framework monolithe (Laravel, CakePHP, Symfony, etc.). Il faudra rajouter un ORM (tel que redbean puisque tu souhaites orienter tes modeles en poo). C'est simple à faire puisque tu as un excellent système de dépendances au sein du core. Sur ce projet, j'ai conçu la gestion de la base en faisant un adaptateur (plus concise que PDO ) couplé à une factory et un singleton. Pour le templating, j'utilisais TWIG. Par contre, il va falloir faire une élévation de version (simple à faire de mémoire pour l'état actuel du projet).

Un Framework va t'apporter toute une serie d'outils élaborés sans aller chercher pendant des heures sur packagiste la lib qu'il te faut et à apprendre à l'utiliser. Ça te permet d'avoir un projet php vitaminé, maintenable et évolutif (tout dépend de la connaissance de base en php et en développement côté serveur[^1]).

PapyJP a écrit :
Quand on n'est plus dans le milieu professionnel depuis des années, à la vitesse où les choses évoluent il est important de se tenir informé


Non, pas sur ce plan là
Modifié par niuxe (22 Dec 2022 - 01:45)
Franchement, je n'ai pas le temps ni l'envie d'apprendre à utiliser un framework et à transformer mon site en conséquence.
Ce sont des outils pour professionnels du développement web qui développent de multiples sites et travaillent en équipe, pas pour une personne âgée qui gère seule un site d'association et un site de publication d'articles égyptologiques conçus "à l'ancienne".

Il m'arrive souvent de regarder comment les technos évoluent et je me pose la question de savoir si cela peut m'être utile. J'essaie et selon les cas je fais des modifications dans un des deux sites ou les deux pour essayer de tirer parti au mieux des nouvelles possibilités.