La structure de la base de données est assez simple. Certaines conventions
ont été utilisées, que vous repérerez assez facilement au cours de ce document.
Par exemple, la plupart des objets sont indexés par un entier autoincrémenté
dont le nom est du type id_objet, et qui est déclaré comme clé primaire
dans la table appropriée.
NB : cet article commence à dater, et personne n’a encore pris la peine d’en faire la mise à jour. Il faut le lire comme un élément permettant de comprendre le fonctionnement de SPIP, mais plus comme un outil de référence. Si vous souhaitez contribuer à la documentation en refondant cet article, surtout n’hésitez pas !
Contenu rédactionnel
Les rubriques : spip_rubriques
Chaque rubrique est identifiée par son id_rubrique.
id_parent est l’id_rubrique de la rubrique qui contient cette rubrique (zéro si la rubrique se trouve à la racine du site).
titre, descriptif, texte parlent d’eux-mêmes.
id_secteur est l’id_rubrique de la rubrique en tête de la hiérarchie contenant cette rubrique. Une rubrique dépend d’une rubrique qui dépend d’une rubrique...
jusqu’à une rubrique placée à la racine du site ; c’est cette dernière rubrique
qui détermine l’id_secteur. Cette valeur précalculée permet
d’accélérer certains calculs de l’espace public (en effet, les brèves sont classées par
secteur uniquement, et non selon toute la hiérarchie).
maj est un champ technique mis à jour automatiquement par MySQL, qui contient
la date de la dernière modification de l’entrée dans la table.
export, id_import sont des champs réservés pour des fonctionnalités futures.
Les articles : spip_articles
Chaque article est identifié par son id_article.
id_rubrique indique dans quelle rubrique est rangé l’article.
id_secteur indique le secteur correspondant à la rubrique
susmentionnée (voir le paragraphe précédent pour l’explication
de la différence entre les deux).
titre, surtitre, soustitre, descriptif, chapo, texte, ps parlent d’eux-mêmes.
date est la date de publication de l’article (si l’article n’a pas encore été
publié, c’est la date de création).
date_redac est la date de publication antérieure si vous réglez cette
valeur, sinon elle est égale à « 0000-00-00 ».
statut est le statut actuel de l’article : prepa (en cours de rédaction),
prop (proposé à la publication), publie (publié), refuse
(refusé), poubelle (à la poubelle).
accepter_forum : permet de régler manuellement si l’article
accepte des forums (par défaut, oui).
maj : même signification que dans la table des rubriques.
export est un champ réservé pour des fonctionnalités futures.
images est un champ contenant la liste des images utilisées par
l’article, dans un format particulier. Ce champ est généré par spip_image.php3.
visites et referers sont utilisés pour les statistiques sur les
articles. Le premier est le nombre de chargements de l’article dans
l’espace public ; le deuxième contient un extrait de hash des différents
referers, afin de connaître le nombre de referers distincts. Voir inc-stats.php3.
Les auteurs : spip_auteurs
Chaque auteur est identifié par son id_auteur.
nom, bio, nom_site, url_site, pgp sont
respectivement le nom de l’auteur, sa courte biographie, son adresse e-mail,
le nom et l’URL de son site Web, sa clé PGP. Informations modifiables librement
par l’auteur.
email, login sont son e-mail d’inscription et son login. Ils ne sont
modifiables que par un administrateur.
pass est le hash MD5 du mot de passe.
htpass est la valeur cryptée (i.e. générée par crypt()) du mot de passe pour le .htpasswd.
statut est le statut de l’auteur : 0minirezo (administrateur),
1comite (rédacteur), 5poubelle (à la poubelle),
6forum (abonné aux forums, lorque ceux-ci sont réglés en mode « par
abonnement »).
maj a la même signification que dans les autres tables.
Les brèves : spip_breves
Chaque brève est identifiée par son id_breve.
id_rubrique est la rubrique (en fait, le secteur) dans laquelle est classée
la brève.
titre, texte, lien_titre, lien_url sont le titre, le texte, le nom et
l’adresse du lien associé à la brève.
date_heure est la date de la brève.
statut est le statut de la brève : prop (proposée à la publication),
publie (publiée), refuse (refusée).
maj : idem que dans les autres tables.
Les mots-clés : spip_mots
Chaque mot-clé est identifié par son id_mot.
Le type du mot-clé est le type, ou groupe, choisi pour le mot-clé.
En définissant plusieurs types, on définit plusieurs classifications
indépendantes (par exemple « sujet », « époque », « pays »...).
titre, descriptif, texte parlent d’eux-mêmes.
maj : idem que dans les autres tables.
Les sites syndiqués : spip_syndic
Chaque site syndiqué est identifié par son id_syndic.
id_rubrique et id_secteur définissent l’endroit dans
la hiérarchie du site où viennent s’insérer les contenus syndiqués.
nom_site, url_site, descriptif sont le nom, l’adresse et
le descriptif du site
syndiqué.
url_syndic est l’adresse du fichier dynamique utilisé pour
récupérer les contenus syndiqués (souvent il s’agit de url_site
suivi de backend.php3).
Les articles syndiqués : spip_syndic_articles
Chaque article syndiqué est identifié par son id_syndic_article.
id_syndic réfère au site syndiqué d’où est tiré l’article.
titre, url, date, lesauteurs parlent d’eux-mêmes.
Eléments interactifs
Les messages de forums : spip_forum
Chaque message de forum est identifié par son id_forum.
L’objet auquel est attaché le forum est identifié par son id_rubrique,
id_article ou id_breve. Par défaut, ces valeurs sont égales à zéro.
Le message parent (c’est-à-dire le message auquel répond ce message)
est identifié par id_parent. Si le message ne répond à aucun autre message,
cette valeur est égale à zéro.
titre, texte, nom_site, url_site sont le titre et le texte du message,
le nom et l’adresse du lien y attaché.
auteur et email_auteur sont le nom et l’e-mail déclarés par l’auteur.
Dans le cas des forums par abonnement, ils ne sont pas forcément identiques
aux données enregistrées dans la fiche de l’auteur (i.e. dans la table spip_auteurs).
id_auteur identifie l’auteur du message dans le cas de forums par abonnement.
statut est le statut du message : publie (lisible dans l’espace public),
prive (écrit en réaction à un article dans l’espace privé),
privrac (écrit dans le forum interne dans l’espace privé),
off (supprimé ou à valider, selon la modération des forums - a priori
ou a posteriori).
ip est l’adresse IP de l’auteur, dans les forums publics.
maj a la même signification que dans les autres tables.
Les pétitions : spip_petitions
id_article identifie l’article auquel est associée la pétition
(une seule pétition par article).
email_unique, site_obli, site_unique, message
définissent la configuration de la pétition : l’adresse e-mail des
signataires doit-elle être unique dans les signatures, l’adresse Web
est-elle obligatoire, est-elle unique, un message attenant aux signatures
est-il autorisé (oui ou non).
texte est le texte de la pétition.
maj : pareil que dans les autres tables.
Les signatures de pétitions : spip_signatures
Chaque signature est identifiée par son id_signature.
id_article identifie l’article, donc la pétition sur laquelle
est apposée la signature.
nom_email, ad_email, nom_site, url_site
sont le nom, l’adresse e-mail, ainsi que le site Web déclarés
par le signataire.
message est le message éventuellement entré par le
signataire.
statut est le statut de la signature : publie (acceptée),
poubelle (supprimée) ; toute autre valeur donne la valeur
de la clé de validation utilisée pour la confirmation par e-mail.
maj a la même signification que dans les autres tables.
Les relations entre objets
Ces tables ne gèrent aucun contenu, simplement une relation
entre les objets présents dans d’autres tables. Ainsi :
spip_auteurs_articles spécifie la relation entre auteurs
et articles. Si un id_auteur y est associé à un id_article, cela
veut dire que l’auteur en question a écrit ou co-écrit l’article
(il peut y avoir plusieurs auteurs par article, et vice-versa bien sûr).
spip_mots_articles définit de même la relation de
référencement des articles par des mots-clés.
Gestion du site
La table spip_meta est primordiale. Elle contient des
couples (nom, valeur) indexés par le nom (clé primaire) ;
ces couples permettent de stocker différentes informations telles
que la configuration du site, ou la version installée de SPIP.
La table spip_forum_cache est utilisée afin d’adapter le
système de cache à l’instantanéité des forums. Pour chaque
fichier du cache ayant donné lieu à une requête sur la table
spip_forum, la table spip_forum_cache stocke les paramètres
de la requête (article, rubrique, brève et éventuel message parent
du forum). Lorsqu’un message est posté, les paramètres du
message sont comparés avec ceux présents dans spip_forum_cache,
et pour chaque correspondance trouvée le fichier cache indiqué
dans la table est effacé. Ainsi les messages n’attendent pas le
recalcul régulier de la page dans laquelle ils s’insèrent pour apparaître
dans l’espace public.
Indexation (moteur de recherche)
Six tables sont utilisées par le moteur de recherche. Elles se divisent
en deux catégories.
Le dictionnaire d’indexation : spip_index_dico
Chaque mot rencontré au cours de l’indexation est stocké dans cette table,
ainsi que les 64 premiers bits de son hash MD5. C’est le mot qui sert de
clé primaire, permettant ainsi d’effectuer très rapidement des requêtes sur un
début de mot ; on récupère alors le(s) hash satisfaisant à la requête, afin
d’effectuer la recherche proprement dite dans les tables d’indexation.
Les tables d’indexation : spip_index_*
Ces tables, au nombre de cinq, gèrent chacune l’indexation d’un type
d’objet : articles, rubriques, brèves, auteurs, mots-clés. Une entrée
par mot et par objet est stockée. Chaque entrée contient le hash du mot (en fait les 64 bits de poids
fort du hash MD5, cf. ci-dessus), l’identifiant de l’objet indexé (par exemple
l’id_article pour un article), et le nombre de points associé à l’indexation du mot
dans l’objet. Ce nombre de points est calculé en fonction du nombre d’occurences
du mot, pondéré par le champ où ont lieu les occurences : une occurence dans
le titre d’un article génère plus de points qu’une occurence dans le corps de l’article.
Le mécanisme d’indexation est expliqué plus en détail ici.