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;