phpBB2 : Partager une base de données entre plusieurs forums

Image non disponible


précédentsommairesuivant

III. La nouvelle structure des données

Nous allons utiliser des vues (CREATE VIEW) pour partager les informations entre les sites. Je vais prendre l'exemple de 2 sites désignés par les préfixes "forum1_" et "forum2_" ; le préfixe "forums_" désigne les tables partagées. Pour suivre mon exemple, installez simplement deux fois phpBB2 en utilisant les préfixes "forum1_" et "forum2_" et en prenant soin d'indiquer des noms différents pour les cookies (panneau d'admin / config). Placez les scripts de phpBB dans des répertoires "forum-1" et "forum-2" à la racine de votre serveur Web.

III-A. Création de la nouvelle organisation

Exécuter :
Sélectionnez
-- Une nouvelle table sera nécessaire
CREATE TABLE forums_sites (
  site_id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT,
  site_uri VARCHAR(255) NOT NULL,
  site_users_config_table VARCHAR(255) NOT NULL,
  site_groups_table VARCHAR(255) NOT NULL,
  site_user_groups_table VARCHAR(255) NOT NULL,
  site_config_table VARCHAR(255) NOT NULL,
  PRIMARY KEY (site_id),
  UNIQUE (site_uri),
  UNIQUE (site_users_config_table),
  UNIQUE (site_groups_table),
  UNIQUE (site_user_groups_table),
  UNIQUE (site_config_table)
);

-- Les sites partageant la base de données
INSERT INTO forums_sites (site_uri, site_users_config_table, site_groups_table, site_user_groups_table, site_config_table)
VALUES
('http://localhost/forum-1/', 'forum1_users_config', 'forum1_groups', 'forum1_user_group', 'forum1_config'),
('http://localhost/forum-2/', 'forum2_users_config', 'forum2_groups', 'forum2_user_group', 'forum2_config');

III-B. Modification de la structure existante

Exécuter :
Sélectionnez
-- Réutilisons les tables de l'un des forums pour créer les vues
ALTER TABLE forum1_categories RENAME TO forums_categories;
ALTER TABLE forum1_forums RENAME TO forums_forums;
ALTER TABLE forum1_forum_prune RENAME TO forums_forum_prune;
ALTER TABLE forum1_posts RENAME TO forums_posts;
ALTER TABLE forum1_posts_text RENAME TO forums_posts_text;
ALTER TABLE forum1_topics RENAME TO forums_topics;
ALTER TABLE forum1_topics_watch RENAME TO forums_topics_watch;
ALTER TABLE forum1_vote_desc RENAME TO forums_vote_desc;
ALTER TABLE forum1_vote_results RENAME TO forums_vote_results;
ALTER TABLE forum1_vote_voters RENAME TO forums_vote_voters;

-- Les mêmes tables des autres forums ne sont plus nécessaires
DROP TABLE forum2_categories, forum2_forums, forum2_forum_prune,
	forum2_posts, forum2_posts_text, forum2_topics, forum2_topics_watch,
	forum2_vote_desc, forum2_vote_results, forum2_vote_voters;

-- Nous avons besoin de l'identifiant du site dans la table de plus haut niveau
ALTER TABLE forums_categories ADD site_id INT(4) NOT NULL DEFAULT 0;
UPDATE forums_categories SET site_id=1;

-- Réutilisons maintenant les tables communes à tous les sites
ALTER TABLE forum1_banlist RENAME TO forums_banlist;
ALTER TABLE forum1_confirm RENAME TO forums_confirm;
ALTER TABLE forum1_disallow RENAME TO forums_disallow;
ALTER TABLE forum1_privmsgs RENAME TO forums_privmsgs;
ALTER TABLE forum1_privmsgs_text RENAME TO forums_privmsgs_text;
ALTER TABLE forum1_search_results RENAME TO forums_search_results;
ALTER TABLE forum1_search_wordlist RENAME TO forums_search_wordlist;
ALTER TABLE forum1_search_wordmatch RENAME TO forums_search_wordmatch;
ALTER TABLE forum1_words RENAME TO forums_words;

-- Les mêmes tables des autres forums ne sont plus nécessaires
DROP TABLE forum2_banlist, forum2_confirm, forum2_disallow, forum2_privmsgs,
	forum2_privmsgs_text, forum2_search_results, forum2_search_wordlist,
	forum2_search_wordmatch, forum2_words;

III-C. Création des Vues

Forum 1 :
Sélectionnez
-- Les catégories ont l'identifiant du site de destination
CREATE OR REPLACE VIEW forum1_categories AS
SELECT *
FROM forums_categories
WHERE site_id IN (0, 1);

-- Ces catégories nous permettent de restreindre les forums à un site
CREATE OR REPLACE VIEW forum1_forums AS
SELECT f.*
FROM forums_forums f
INNER JOIN forum1_categories c ON f.cat_id = c.cat_id;

-- Ces forums nous permettent de restreindre les sujets à un site
CREATE OR REPLACE VIEW forum1_topics AS
SELECT t.*
FROM forums_topics t
INNER JOIN forum1_forums f ON t.forum_id = f.forum_id;

-- Ces sujets nous permettent de restreindre les messages à un site
CREATE OR REPLACE VIEW forum1_posts AS
SELECT p.*
FROM forums_posts p
INNER JOIN forum1_topics t ON p.topic_id = t.topic_id;

-- Ces messages nous permettent de restreindre leur contenu à un site
CREATE OR REPLACE VIEW forum1_posts_text AS
SELECT pt.*
FROM forums_posts_text pt
INNER JOIN forum1_posts p ON p.post_id = pt.post_id;

-- Les forums nous permettent de restreindre les autorisations à un site
CREATE OR REPLACE VIEW forum1_forum_prune AS
SELECT fp.*
FROM forums_forum_prune fp
INNER JOIN forum1_forums f ON fp.forum_id = f.forum_id;

-- Les sujets nous permettent de restreindre leur surveillance à un site
CREATE OR REPLACE VIEW forum1_topics_watch AS
SELECT tw.*
FROM forums_topics_watch tw
INNER JOIN forum1_topics t ON tw.topic_id = t.topic_id;

-- Les sujets nous permettent de restreindre les sondages à un site
CREATE OR REPLACE VIEW forum1_vote_desc AS
SELECT vd.*
FROM forums_vote_desc vd
INNER JOIN forum1_topics t ON vd.topic_id = t.topic_id;

-- Les sujets nous permettent de restreindre les résultats des sondages à un site
CREATE OR REPLACE VIEW forum1_vote_results AS
SELECT vr.*
FROM forums_vote_results vr
INNER JOIN forum1_vote_desc vd ON vr.vote_id = vd.vote_id;

-- Les sujets nous permettent de restreindre les votants des sondages à un site
CREATE OR REPLACE VIEW forum1_vote_voters AS
SELECT vv.*
FROM forums_vote_voters vv
INNER JOIN forum1_vote_desc vt ON vv.vote_id = vt.vote_id;
Forum 2 :
Sélectionnez
-- Les catégories ont l'identifiant du site de destination
CREATE OR REPLACE VIEW forum2_categories AS
SELECT *
FROM forums_categories
WHERE site_id IN (0, 2);

-- Ces catégories nous permettent de restreindre les forums à un site
CREATE OR REPLACE VIEW forum2_forums AS
SELECT f.*
FROM forums_forums f
INNER JOIN forum2_categories c ON f.cat_id = c.cat_id;

-- Ces forums nous permettent de restreindre les sujets à un site
CREATE OR REPLACE VIEW forum2_topics AS
SELECT t.*
FROM forums_topics t
INNER JOIN forum2_forums f ON t.forum_id = f.forum_id;

-- Ces sujets nous permettent de restreindre les messages à un site
CREATE OR REPLACE VIEW forum2_posts AS
SELECT p.*
FROM forums_posts p
INNER JOIN forum2_topics t ON p.topic_id = t.topic_id;

-- Ces messages nous permettent de restreindre leur contenu à un site
CREATE OR REPLACE VIEW forum2_posts_text AS
SELECT pt.*
FROM forums_posts_text pt
INNER JOIN forum2_posts p ON p.post_id = pt.post_id;

-- Les forums nous permettent de restreindre les autorisations à un site
CREATE OR REPLACE VIEW forum2_forum_prune AS
SELECT fp.*
FROM forums_forum_prune fp
INNER JOIN forum2_forums f ON fp.forum_id = f.forum_id;

-- Les sujets nous permettent de restreindre leur surveillance à un site
CREATE OR REPLACE VIEW forum2_topics_watch AS
SELECT tw.*
FROM forums_topics_watch tw
INNER JOIN forum2_topics t ON tw.topic_id = t.topic_id;

-- Les sujets nous permettent de restreindre les sondages à un site
CREATE OR REPLACE VIEW forum2_vote_desc AS
SELECT vd.*
FROM forums_vote_desc vd
INNER JOIN forum2_topics t ON vd.topic_id = t.topic_id;

-- Les sujets nous permettent de restreindre les résultats des sondages à un site
CREATE OR REPLACE VIEW forum2_vote_results AS
SELECT vr.*
FROM forums_vote_results vr
INNER JOIN forum2_vote_desc vd ON vr.vote_id = vd.vote_id;

-- Les sujets nous permettent de restreindre les votants des sondages à un site
CREATE OR REPLACE VIEW forum2_vote_voters AS
SELECT vv.*
FROM forums_vote_voters vv
INNER JOIN forum2_vote_desc vt ON vv.vote_id = vt.vote_id;

En cas de problème avec une Vue, relancer la requête devrait suffire à la réparer.

III-D. Le cas des Utilisateurs

Nous utiliserons ici aussi des Vues SQL mais, cette fois, nous les combinerons avec des tables dans chaque site.

phpBB par défaut :
  • phpbb_users
Notre besoin :
  • forums_users (table)
  • forum1_users_config (table)
  • forum1_users (vue = forums_users + forum1_users_config)
  • forum2_users_config (table)
  • forum2_users (vue = forums_users + forum2_users_config)
La configuration utilisateur par site :
Sélectionnez
-- Structure (forum 1)
CREATE TABLE forum1_users_config (
	user_id MEDIUMINT (8) NOT NULL ,
	user_session_time INT (11) NOT NULL DEFAULT '0',
	user_session_page SMALLINT (5) NOT NULL DEFAULT '0',
	user_lastvisit INT (11) NOT NULL DEFAULT '0',
	user_style TINYINT (4) DEFAULT NULL ,
	user_lang VARCHAR (255) DEFAULT NULL ,
	user_dateformat VARCHAR (14) NOT NULL DEFAULT 'd M Y H:i',
	user_rank INT (11) DEFAULT '0',
	PRIMARY KEY (user_id) ,
	KEY user_session_time (user_session_time)
);

-- Copie des infos des utilisateurs (forum 1)
INSERT INTO forum1_users_config
	(user_id, user_session_time, user_session_page, user_lastvisit,
	user_style, user_lang, user_dateformat, user_rank)
SELECT user_id, user_session_time, user_session_page, user_lastvisit,
	user_style, user_lang, user_dateformat, user_rank
FROM forum1_users;

-- Structure (forum 2)
CREATE TABLE forum2_users_config (
	user_id MEDIUMINT (8) NOT NULL ,
	user_session_time INT (11) NOT NULL DEFAULT '0',
	user_session_page SMALLINT (5) NOT NULL DEFAULT '0',
	user_lastvisit INT (11) NOT NULL DEFAULT '0',
	user_style TINYINT (4) DEFAULT NULL ,
	user_lang VARCHAR (255) DEFAULT NULL ,
	user_dateformat VARCHAR (14) NOT NULL DEFAULT 'd M Y H:i',
	user_rank INT (11) DEFAULT '0',
	PRIMARY KEY (user_id) ,
	KEY user_session_time (user_session_time)
);

-- Copie des infos des utilisateurs (forum 2) depuis le forum 1
INSERT INTO forum2_users_config
	(user_id, user_session_time, user_session_page, user_lastvisit,
	user_style, user_lang, user_dateformat, user_rank)
SELECT user_id, user_session_time, user_session_page, user_lastvisit,
	user_style, user_lang, user_dateformat, user_rank
FROM forum1_users;
La configuration partagée :
Sélectionnez
-- Déplacement de la table des utilisateurs
ALTER TABLE forum1_users RENAME TO forums_users;

-- La table du  forum n'est plus utile
DROP TABLE forum2_users;

-- Suppression des champs réservés à a config par site
ALTER TABLE forums_users
	DROP user_session_time,
	DROP user_session_page,
	DROP user_lastvisit,
	DROP user_style,
	DROP user_lang,
	DROP user_dateformat,
	DROP user_rank;
Les vues pour lire les données :
Sélectionnez
-- Forum 1
CREATE OR REPLACE VIEW forum1_users AS
SELECT u.*,
	uc.user_session_time, uc.user_session_page, uc.user_lastvisit,
	uc.user_style, uc.user_lang, uc.user_dateformat, uc.user_rank
FROM forums_users u
INNER JOIN forum1_users_config uc ON u.user_id = uc.user_id;

-- Forum 2
CREATE OR REPLACE VIEW forum2_users AS
SELECT u.*,
	uc.user_session_time, uc.user_session_page, uc.user_lastvisit,
	uc.user_style, uc.user_lang, uc.user_dateformat, uc.user_rank
FROM forums_users u
INNER JOIN forum2_users_config uc ON u.user_id = uc.user_id;

précédentsommairesuivant

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Copyright © 2007 Guillaume Rossolini. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.