8797 sujets

Développement web côté serveur, CMS

Modérateur
Bonjour tlm,

Depuis quelques temps je me pose cette question. Cela va faire maintenant pas mal de temps que je code en sql et je n'ai pas encore vu deux tables avec une relation de 1:1. Peut être que c'est intéressant d'un point de vue d'une bonne séparation des entités ?

avez vous déjà renconté ce type de relation et dans quel cas ?

happy dev
Modérateur
Salut PanPan50,

Ce lien t'aidera à comprendre de quoi je parle : cardinalités. Là plus précisément je parle du type de relation entres les tables.

Sinon, je viens de tomber sur un exemple très concret. Ce type de relation est rare. On peut le trouver dans quelques cas :

une table employés (nom, prenom, age, situation famille,etc.)
une table salaires(numéro de sécu, salaire, nivo de salaire, etc.)
Je l'utilise quand les données n'ont pas d'autres rapports entre elles que la relation qui les unit.

Typiquement, dans mon jeu, j'ai plusieurs jeux de tables qui sont liés par une relation 1:1 :

coté monstres d'abord :
- monstres_type
- monstres_carac
- monstres_divinité

La première table définit le monstre au niveau affichage et rp (description, skin, race et espèce).
La seconde table définit le monstre au niveau de ses caractéristiques (forces, endurance, esquive, précision,...)
La troisième table définissait le monstre au niveau de ses relations avec les Dieux.

Chacune des tables avait un rôle et une fonction différente, n'était pas appelé au même moment (la première était appellée surtout dans les informations sur la carte ou dans les infos sur les monstres; la seconde dans les combats; la troisième à la fin des combats).


Dans le même genre et peut-être beaucoup plus clair, mes tables PJ :

- PJ_général : c'est la table qui définit globalement le PJ (race, classe, sexe) -sert à l'affichage de la fiche de personnage- -5 champs-
- PJ_carte : c'est la table qui indique sa position et son skin -sert à l'affichage du pj sur la carte- -4 champs-
- PJ_carac : c'est la table qui indique ses carac (force, magie, maîtrises, esquives,...) -18 champs-
- PJ_métier : c'est la table qui indique ses points de progression dans les différents métiers -8 champs-
- PJ_dieux : c'est la table qui regroupe les croyances et faveurs divines -8 champs-

J'aurais très bien pu regrouper toutes ces tables sur une table "PJ", mais maintenir une table comprenant plus d'une trentaine de champs, c'est assez lourd et peu digeste...


Bref, pour moi l'intérêt majeur de diviser les tables (et donc de faire plusieurs tables avec des relations 1:1), c'est surtout une question de sémantiques. Tu sépares parce que sémantiquement ces champs n'ont pas de rapport entre eux hormis un point commun qui est l'ID ^^
Salut,

d'un point de vue purement théorique des relations 1,1 n'ont pas lieu d'être : tu peux directement regrouper tes deux tables.

Là où ça devient intéressant, c'est quand tu développes des modules qui se greffent sur la base (mise à jour, ajout de fonctionnalités): tu ne modifies pas la table principale, et donc tu évites de générer des erreurs. (en plus tu ne perds pas de temps à revérifier tout le plan de validation de la base...)
Zed13 a écrit :
Salut,

d'un point de vue purement théorique des relations 1,1 n'ont pas lieu d'être : tu peux directement regrouper tes deux tables.

Là où ça devient intéressant, c'est quand tu développes des modules qui se greffent sur la base (mise à jour, ajout de fonctionnalités): tu ne modifies pas la table principale, et donc tu évites de générer des erreurs. (en plus tu ne perds pas de temps à revérifier tout le plan de validation de la base...)


Ah oui, tel que tu le décris j'ai déjà eu à gérer ça, j'ajoutais des paramètres à des utilisateurs d'un forum, j'avais donc créé une table liée à ma table user pour ne pas interférer avec le CMS de base.
Modérateur
Zed13 a écrit :
...
d'un point de vue purement théorique des relations 1,1 n'ont pas lieu d'être : tu peux directement regrouper tes deux tables.


D'où la question que je me suis posé.


Zed13 a écrit :
Là où ça devient intéressant, c'est quand tu développes des modules qui se greffent sur la base (mise à jour, ajout de fonctionnalités): tu ne modifies pas la table principale, et donc tu évites de générer des erreurs. (en plus tu ne perds pas de temps à revérifier tout le plan de validation de la base...)


Ah oui bien vu. on évite le ALTER TABLE avec X ADD COLUMN. En fait cette pratique est une sorte de surcharge que je garde bien soigneusement dans mon esprit.

@Lothindil : Ta base de données est un exemple pertinent qui illustre bien ma question

En tout cas merci pour vos réponses complémentaires.

Happy dev Smiley smile
Modifié par niuxe (20 Aug 2012 - 21:22)