Avis sur modélisation Bdd

Eléphant du PHP | 418 Messages

13 janv. 2012, 10:28

Salutation à tous

Bonne année et meilleurs vœux.

Je viens vous demander votre avis sur la modélisation de ma bdd pour un forum.

Actuellement j'ai fait uniquement les tables principales et leurs relations.

Merci de me dire ce que vous en pensez et éventuellement les modifications à apporter.

Modélisation d'après DBDesigner4:
Image

Rendu en SQL:
CREATE TABLE t_users (
  users_id INT(11) NOT NULL AUTO_INCREMENT,
  users_name VARCHAR(45) NULL,
  users_pass VARCHAR(45) NULL,
  users_mail VARCHAR(45) NULL,
  users_web VARCHAR(45) NULL,
  users_avatar VARCHAR(45) NULL,
  users_signature VARCHAR(45) NULL,
  users_inscription INT(11) NULL,
  users_last_visit INT(11) NULL,
  users_group INT(11) NULL,
  users_rank INT(11) NULL,
  users_nb_post INT(11) NULL,
  users_verif TINYINT(8) UNSIGNED NULL,
  users_code TEXT NULL,
  PRIMARY KEY(users_id)
);

CREATE TABLE t_conf (
  conf_name VARCHAR(45) NULL,
  conf_value VARCHAR(45) NULL
);

CREATE TABLE t_cat (
  cat_id INT(11) NOT NULL AUTO_INCREMENT,
  cat_name VARCHAR(45) NULL,
  cat_order INT(11) NULL,
  PRIMARY KEY(cat_id)
);

CREATE TABLE t_forum (
  forum_id INT(11) NOT NULL AUTO_INCREMENT,
  cat_id INT(11) NOT NULL,
  forum_name VARCHAR(45) NULL,
  forum_description VARCHAR(45) NULL,
  forum_order INT(11) NULL,
  forum_nb_post INT(11) NULL,
  forum_auth_view TINYINT(8) UNSIGNED NULL,
  forum_auth_post TINYINT(8) UNSIGNED NULL,
  forum_auth_topic TINYINT(8) UNSIGNED NULL,
  forum_auth_announce TINYINT(8) UNSIGNED NULL,
  forum_auth_moderation TINYINT(8) UNSIGNED NULL,
  PRIMARY KEY(forum_id, cat_id),
  INDEX t_forum_FKIndex1(cat_id)
);

CREATE TABLE t_topic (
  topic_id INT(11) NOT NULL AUTO_INCREMENT,
  users_id INT(11) NOT NULL,
  cat_id INT(11) NOT NULL,
  forum_id INT(11) NOT NULL,
  topic_title VARCHAR(45) NULL,
  topic_nb_view INT(11) NULL,
  topic_date INT(11) NULL,
  topic_type VARCHAR(45) NULL,
  topic_last_post INT(11) NULL,
  topic_first_post INT(11) NULL,
  topic_nb_response INT(11) NULL,
  topic_statut ENUM('0','1') NOT NULL,
  PRIMARY KEY(topic_id, users_id, cat_id, forum_id),
  INDEX t_topic_FKIndex1(users_id),
  INDEX t_topic_FKIndex2(forum_id, cat_id)
);

CREATE TABLE t_post (
  post_id INT(11) NOT NULL AUTO_INCREMENT,
  forum_id INT(11) NOT NULL,
  cat_id INT(11) NOT NULL,
  users_id INT(11) NOT NULL,
  post_content TEXT NULL,
  post_date INT(11) NULL,
  PRIMARY KEY(post_id, forum_id, cat_id, users_id),
  INDEX t_post_FKIndex1(forum_id, cat_id),
  INDEX t_post_FKIndex2(users_id)
);
Merci de votre aide

Cordialement
Modifié en dernier par Fre3z69 le 13 janv. 2012, 13:14, modifié 1 fois.

ViPHP
xTG
ViPHP | 7331 Messages

13 janv. 2012, 11:07

Il est bizarre de voir qu'un post n'appartient pas à un message, pourrais-tu nous expliquer cette volonté ? :)
Car quand je vois ça j'en conclus :
- qu'un topic peut exister sans avoir un quelconque contenu
- qu'on peut avoir un message existant dans un forum sans qu'il soit rattaché à un quelconque topic (donc invisible ?)

Eléphant du PHP | 209 Messages

13 janv. 2012, 11:15

*qu'un post n'appartient pas à un sujet

Même avis que xTG sur le sujet. Le reste me semble correct mais tu n'as pas abordé les droits.

Sinon petite question, à quoi te sert le champ first post dans topic ?

Eléphant du PHP | 418 Messages

13 janv. 2012, 11:20

Le champ first c'est pour déterminer l'ID du premiers post afin de faire des requêtes me permettant de pouvoir afficher ce derniers lors d'une réponse

Oui effectivement j'ai oublier la iason entre t_topic et t_post ^^ je m'en occupe de suite.

qu'entend tu par les "droits"??

Merci de vôtre aide.

Eléphant du PHP | 209 Messages

13 janv. 2012, 11:23

La possibilité de modération, suppression pourquoi pas édition de post ainsi que définir à quels forums, catégories, fonctionnalités les utilisateurs ont accès par exemple.

Eléphant du PHP | 418 Messages

13 janv. 2012, 13:09

ils y sont

  forum_auth_view TINYINT(8) UNSIGNED NULL,
  forum_auth_post TINYINT(8) UNSIGNED NULL,
  forum_auth_topic TINYINT(8) UNSIGNED NULL,
  forum_auth_announce TINYINT(8) UNSIGNED NULL,
  forum_auth_moderation TINYINT(8) UNSIGNED NULL,
Après je savais pas si je devais en faire une table ou pas alors je l'ai mit avec t_forum

C'est bien de cela qu'il s'agit?

[EDIT] Par contre, je sait pas pourquoi DBDesigner me met les id des éventuelles relations avec une table que je veux relier

C'est a dire:

Pour la table t_topic il me fait:
...
  INDEX t_topic_FKIndex1(users_id),
  INDEX t_topic_FKIndex2(forum_id, cat_id)
ai je vraiment besoin d'indiquer cat_id, sachant que je l'est déjà dans la relation entre t_cat et t_forum?

Et pour les messages privés, j'ai besoin de faire une relation entre la table t_users et la table t_mp??
Merci de votre aide
Modifié en dernier par Fre3z69 le 13 janv. 2012, 13:34, modifié 1 fois.

ViPHP
xTG
ViPHP | 7331 Messages

13 janv. 2012, 13:33

Je vois mal comment fonctionne ton système de droit.
Normalement on fait une table intermédiaire reliant user et forum.

Pour ton id catégorie en effet ce n'est pas bon, cela doit venir de ton utilisation du logiciel.
Il doit y avoir d'autres liens possibles entre entités.

Eléphant du PHP | 418 Messages

13 janv. 2012, 13:53

j'ai fait une relation 1:1 je sais pas trop si c'est correcte, au pire je vire les champs non souhaités.

Pour les droits, ui c'est le moyen le plus simple que j'ai trouver, j'avoue que je vois pas trop comment faire autrement, surtout que j'ai pas trop envie de me taper les droits aux forum membre par membre.
En fait j'ai une constante qui détermine le niveau des rangs. exp: 1=visiteur, 2=utilisateur, 3=modo, 4=admin, 5=superadmin.

Bref dans la table t_users, j'ai un champ qui renseigne le status du membre "users_rank" et j'aurais juste à déterminer par une condition le droit pour le forum.

j'ai tester déja, voici un exemple:
<?php
//on vérifie le rang de l'utilisateur
	if (verif_auth($data0['auth_topic']))
	{
//on affiche le bouton permettant de poster un nouveau topic
		$bouton = '<div class="topic-actions"><a href="index.php?r=poster&action=nouveautopic&f='.$forum.'"><span class="nouveautopic"></span></a>'.get_list_page($page, $nombreDePages, 'index.php?r=voirforum&f='.$forum).'</div>';
	}
?>
---

Le seul inconvénient que je connaisse avec ce système, c'est que il faut s'assurer que l'utilisateur à bien le droit de se situer dans la page de formulaire et des l'envoie du formulaire, afin que personne ne puisse envoyer des données via un formulaire déporté, mais ça c'est le gros soucis pour plain de codeurs ^^

Bref, en tout cas je suis toujours ouvert pour connaitre de nouveau truc, alors si tu as une idée plus poussée sur la question, je suis preneur ;-)

Merci de votre aide, cordialement

Eléphant du PHP | 418 Messages

13 janv. 2012, 14:13

J'ai refait mon shéma

le voici en image
Image

et en sql
CREATE TABLE t_users (
  users_id INT(11) NOT NULL AUTO_INCREMENT,
  users_name VARCHAR(45) NULL,
  users_pass VARCHAR(45) NULL,
  users_mail VARCHAR(45) NULL,
  users_web VARCHAR(45) NULL,
  users_avatar VARCHAR(45) NULL,
  users_signature VARCHAR(45) NULL,
  users_inscription INT(11) NULL,
  users_last_visit INT(11) NULL,
  users_group INT(11) NULL,
  users_rank INT(11) NULL,
  users_nb_post INT(11) NULL,
  users_verif TINYINT(8) UNSIGNED NULL,
  users_code TEXT NULL,
  PRIMARY KEY(users_id)
);

CREATE TABLE t_online (
  online_id INT(11) NOT NULL AUTO_INCREMENT,
  online_date INT(11) NULL,
  online_ip INT(20)) NULL,
  PRIMARY KEY(online_id)
);

CREATE TABLE t_cat (
  cat_id INT(11) NOT NULL AUTO_INCREMENT,
  cat_name VARCHAR(45) NULL,
  cat_order INT(11) NULL,
  PRIMARY KEY(cat_id)
);

CREATE TABLE t_conf (
  conf_name VARCHAR(45) NULL,
  conf_value VARCHAR(45) NULL
);

CREATE TABLE t_topic (
  topic_id INT(11) NOT NULL AUTO_INCREMENT,
  users_id INT(11) NOT NULL,
  topic_title VARCHAR(45) NULL,
  topic_nb_view INT(11) NULL,
  topic_date INT(11) NULL,
  topic_type VARCHAR(45) NULL,
  topic_last_post INT(11) NULL,
  topic_first_post INT(11) NULL,
  topic_nb_response INT(11) NULL,
  topic_statut ENUM('0','1') NOT NULL,
  PRIMARY KEY(topic_id),
  INDEX t_topic_FKIndex1(users_id)
);

CREATE TABLE t_forum (
  forum_id INT(11) NOT NULL AUTO_INCREMENT,
  cat_id INT(11) NOT NULL,
  forum_name VARCHAR(45) NULL,
  forum_description VARCHAR(45) NULL,
  forum_order INT(11) NULL,
  forum_nb_post INT(11) NULL,
  forum_auth_view TINYINT(8) UNSIGNED NULL,
  forum_auth_post TINYINT(8) UNSIGNED NULL,
  forum_auth_topic TINYINT(8) UNSIGNED NULL,
  forum_auth_announce TINYINT(8) UNSIGNED NULL,
  forum_auth_moderation TINYINT(8) UNSIGNED NULL,
  PRIMARY KEY(forum_id),
  INDEX t_forum_FKIndex1(cat_id)
);

CREATE TABLE t_mp (
  users_id INT(11) NOT NULL,
  mp_sender INT(11) NULL,
  mp_receiver INT(11) NULL,
  mp_title VARCHAR(45) NULL,
  mp-post TEXT NULL,
  mp_date INT(11) NULL,
  mp_read ENUM('0','1') NULL,
  INDEX t_mp_FKIndex1(users_id)
);

CREATE TABLE t_post (
  post_id INT(11) NOT NULL AUTO_INCREMENT,
  users_id INT(11) NOT NULL,
  topic_id INT(11) NOT NULL,
  forum_id INT(11) NOT NULL,
  post_content TEXT NULL,
  post_date INT(11) NULL,
  PRIMARY KEY(post_id),
  INDEX t_post_FKIndex2(users_id),
  INDEX t_post_FKIndex2(forum_id),
  INDEX t_post_FKIndex3(topic_id)
);
Merci pour votre aide

(désolé j'ai pas penser à re éditer le message du dessus)

ViPHP
xTG
ViPHP | 7331 Messages

13 janv. 2012, 14:18

Hum si tu ne sais pas utiliser la cardinalité...
Je te conseille cette lecture : http://sqlpro.developpez.com/cours/modelisation/merise/

Eléphant du PHP | 418 Messages

14 janv. 2012, 08:47

merci, j'ai hâte de dévorer se roman ^^

Merci de votre aide

Eléphant du PHP | 418 Messages

21 janv. 2012, 21:58

Voila, j'ai modélisé ma BDD (enfin presque toute), mais j'ai une question à vous poser.

Je souhaite mettre en place des autorisations pour les forum (pour les droits de voir, de poster, de répondre, de modérer et de créer des annonces), mais je ne sais pas si je dois faire une table autorisation, qui seras liée a celle des forum, ou alors si je met les autorisation directement dans la table forum?

que me suggérez vous svp?

Merci de votre aide, cordialement