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▲
-- 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▲
-- 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▲
-- 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;-- 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)
-- 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;-- Déplacement de la table des utilisateurs
ALTER TABLE forum1_users RENAME TO forums_users;
-- La table du 2° 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;-- 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;


