elgood | +--src_bd | +--crawler.sql
Le but de cette base de données est :
Plusieurs solutions techniques étaient possibles pour implémenter cette base de données :
Remarque : Les relations en pointillés n'existent pas réellement
dans la base de données. En effet, ce sont des relations fonctionnelles
donc un champ id_site
est directement rajouté aux tables
Pict
et Page
.
Remarque: Il faut aussi noter l'existence d'une table non représentée
sur le schéma : SuppFic
. Cette table n'a aucun lien avec
les tables précédentes car il s'agit en fait d'une table temporaire
qui sert à la maintenance de la base de données et qui ne stocke
aucune information utiles au crawler.
Table Summary |
Site
Stocke les sites dont on a visité au moins une page. |
Page
Stocke les pages visitées, c'est à dire dont on a analysées le contenu à la recherche de tous les liens qu'elles contiennent. |
Http
Stocke les liens de type http trouvés dans toutes les pages visitées. |
MotHttp
Contient tous les mot permettant de désigner une adresse http. |
AppHttp
Indique dans quelle(s) page(s) se trouve le lien http l référencé
par un mot m. |
RefHttp
Indique quel(s) mot(s) décrive(nt) quel(s) lien(s). Modification de dernière minute: table supprimée... |
Mail
Stocke les liens de type mailto trouvés dans toutes les pages visitées. |
MotMail
Contient tous les mot permettant de désigner une adresse de courier électronique. |
AppMail
Indique dans quelle(s) page(s) se trouve le lien mailto l référencé
par un mot m. |
RefMail
Indique quel(s) mot(s) décrive(nt) quel(s) lien(s) de type mailto .Modification de dernière minute: table supprimée... |
Pict
Stocke les liens de type img (c'est à dire vers des images) trouvés
dans toutes les pages visitées. |
MotPict
Contient tous les mot permettant de désigner une image. |
AppPict
Indique dans quelle(s) page(s) se trouve le lien img l référencé
par un mot m. |
RefPict
Indique quel(s) mot(s) décrive(nt) quel(s) lien(s) de type img .Modification de dernière minute: table supprimée... |
SuppFic
Table servant à la maintenance de la base de données. |
Sequence Summary | |
Site_id_site_seq
Séquence générant pour chaque site visité un identificateur unique. |
|
Page_id_page_seq
Séquence générant pour chaque page visitée un identificateur unique. |
|
Http_id_http_seq
Séquence générant pour chaque lien http visité un identificateur unique. |
|
MotHttp_id_mot_seq
Séquence générant pour chaque mot désignant un lien http un identificateur unique. |
|
Mail_id_mail_seq
Séquence générant pour chaque adresse mail trouvée un identificateur unique. |
|
MotMail_id_mot_seq
Séquence générant pour chaque mot associé à une adresse mail un identificateur unique. |
|
Pict_id_pict_seq
Séquence générant pour chaque image trouvée un identificateur unique. |
|
MotPict_id_mot_seq
Séquence générant pour chaque mot associé à une image un identificateur unique. |
Function Summary | |
INTEGER |
ins_http_url(INTEGER,TEXT,TEXT,INTEGER)
Fonction pour insérer un lien de type http (vers une page web) désigné
d'après une chaine de caractères. |
INTEGER |
ins_http_id(INTEGER,INTEGER,TEXT,INTEGER)
Fonction pour insérer un lien de type http (vers une page web) désigné
par son identificateur. |
INTEGER |
ins_mail_adr(INTEGER,TEXT,TEXT,INTEGER)
Fonction pour insérer un lien de type mailto (vers une adresse mail)
désigné d'après une chaine de caractères. |
INTEGER |
ins_mail_id(INTEGER,INTEGER,TEXT,INTEGER)
Fonction pour insérer un lien de type mailto (vers une adresse mail)
désigné par son identificateur. |
INTEGER |
ins_pict_nom(INTEGER,INTEGER,TEXT,TEXT,TEXT,TEXT,INTEGER)
Fonction pour insérer un lien de type img (vers une image) désigné
par le chemin de l'image, son nom et le nom du fichier contenant son code
binaire. |
INTEGER |
ins_pict_id(INTEGER,INTEGER,TEXT,INTEGER)
Fonction pour insérer un lien de type img (vers une image) désigné
par son identificateur. |
INTEGER |
supp_page(INTEGER)
Supprime la page dont l'indentificateur est passé en argument. |
Table Detail |
CREATE TABLE Site ( url TEXT NOT NULL UNIQUE, id_site SERIAL PRIMARY KEY );
En effet, toute url peut se décomposer en deux parties:
Par exemple: http://www.rgagnon.com/javadetails/java-0083.html
est une page appartenant au site http://www.rgagnon.com
et
dont le chemin est /javadetails/java-0083.html
url
- L'url du site (par ex: http://www.rgagnon.com
)id_site
- Identificateur désignant de manière
unique ce siteCREATE TABLE Page ( fin_url TEXT, id_site INTEGER, date INTEGER, id_page SERIAL PRIMARY KEY, UNIQUE(fin_url,id_site), FOREIGN KEY (id_site) REFERENCES Site ON UPDATE CASCADE ON DELETE CASCADE );
Une page est identifiée de façon unique par le site auquel elle appartient et le chemin de son code dans ce site.
Remarque: Le chemin d'une page peut être null (par ex, http://www.free.fr)
fin_url
- Le chemin de la page dans l'arborescence du site
id_site
- L'identificateur du site dans lequel se trouve
cette pagedate
- La date de dernière modification de la pageid_page
- L'identificateur qui désigne de manière
unique la pageCREATE TABLE Http ( lien TEXT NOT NULL UNIQUE, id_http SERIAL PRIMARY KEY );
Un lien http est de la forme: <A HREF="http://www.gooogle.com">Moteur
de recherche</A>
.
Dans cette table on stocke l'adresse du lien, c'est dire http://www.gooogle.com
.
lien
- Adresse http du lien trouvéid_http
- Identificateur désignant ce lien http
de manière uniqueCREATE TABLE MotHttp ( mot TEXT NOT NULL UNIQUE, id_mot SERIAL PRIMARY KEY );
Un lien http est de la forme: <A HREF="http://www.gooogle.com">Moteur
de recherche</A>
.
Dans cette table on stocke les mots associés à l'adresse du
lien, c'est dire moteur
et recherche
.
Les mots associés à un lien subissent plusieurs traitements avant d'être ajoutés à la base de données :
mot
- Mot décrivant un lien httpid_mot
- Identificateur désignant de manière
unique un mot relatif à un lien httpCREATE TABLE AppHttp ( id_page INTEGER NOT NULL, id_http INTEGER NOT NULL, id_mot INTEGER NOT NULL, occurence INTEGER DEFAULT 1, UNIQUE (id_page,id_http,id_mot), FOREIGN KEY (id_page) REFERENCES Page ON UPDATE CASCADE ON DELETE CASCADE, FOREIGN KEY (id_mot) REFERENCES MotHttp ON UPDATE CASCADE ON DELETE CASCADE, FOREIGN KEY (id_http) REFERENCES Http ON UPDATE CASCADE ON DELETE CASCADE );
Cette page a deux utilités:
next
(voir projet d'algorithmique).
occurence
.
id_page
- Identificateur d'une page dans laquelle on a
trouvé le couple lien - mot.id_http
- Identificateur du lien http.id_mot
- Identificateur du mot.occurence
- Nombre de fois que ce couple lien - mot a été
trouvé dans cette page.CREATE TABLE RefHttp ( id_http INTEGER, id_mot INTEGER, UNIQUE (id_http,id_mot), FOREIGN KEY (id_http) REFERENCES Http ON UPDATE CASCADE ON DELETE CASCADE, FOREIGN KEY (id_mot) REFERENCES MotHttp ON UPDATE CASCADE ON DELETE CASCADE );
En fait, cette table devrait être supprimée dans une prochaine version car elle est inutile et dangeureuse. En effet:
AppHttp
.
On peut tout de même noter que cette table permet d'améliorer
les performances de certaines requêtes (car cette table est bien moins
grande que AppHttp
) ; mais cela se fait au détriment
de l'espace mémoire.
id_http
- Un lien httpid_mot
- Un mot décrivant ce lien httpCREATE TABLE Mail ( mail TEXT NOT NULL UNIQUE, id_mail SERIAL PRIMARY KEY );
mailto
trouvés dans toutes
les pages visitées.
Un lien mail est de la forme: <A HREF="mailto:super.man@free.fr">Super
Man</A>
.
Dans cette table on stocke l'adresse du lien, c'est dire mailto:super.man@free.fr
.
mail
- Adresse mail du lien trouvéid_mail
- Identificateur désignant ce lien mail
de manière uniqueCREATE TABLE MotMail ( mot TEXT NOT NULL UNIQUE, id_mot SERIAL PRIMARY KEY );
Un lien http est de la forme: <A HREF="mailto:monsieur.muscles@free.fr">Monsieur
muscles</A>
.
Dans cette table on stocke les mots associés à l'adresse,
c'est dire monsieur
et muscles
.
Les mots associés à une adresse subissent plusieurs traitements avant d'être ajoutés à la base de données :
mot
- Mot décrivant un lien httpid_mot
- Identificateur désignant de manière
unique un mot relatif à un lien httpCREATE TABLE AppMail ( id_page INTEGER NOT NULL, id_mail INTEGER NOT NULL, id_mot INTEGER NOT NULL, occurence INTEGER DEFAULT 1, UNIQUE (id_page,id_mail,id_mot), FOREIGN KEY (id_page) REFERENCES Page ON UPDATE CASCADE ON DELETE CASCADE, FOREIGN KEY (id_mot) REFERENCES MotMail ON UPDATE CASCADE ON DELETE CASCADE, FOREIGN KEY (id_mail) REFERENCES Mail ON UPDATE CASCADE ON DELETE CASCADE );
mailto
l
référencé par un mot m.
Cette page a deux utilités:
next
(voir projet d'algorithmique).
occurence
.
id_page
- Identificateur d'une page dans laquelle on a
trouvé le couple lien - mot.id_mail
- Identificateur du lien mail.id_mot
- Identificateur du mot.occurence
- Nombre de fois que ce couple lien - mot a été
trouvé dans cette page.CREATE TABLE RefMail ( id_mail INTEGER, id_mot INTEGER, UNIQUE (id_mail,id_mot), FOREIGN KEY (id_mail) REFERENCES Mail ON UPDATE CASCADE ON DELETE CASCADE, FOREIGN KEY (id_mot) REFERENCES MotMail ON UPDATE CASCADE ON DELETE CASCADE );
En fait, cette table devrait être supprimée dans une prochaine version car elle est inutile et dangeureuse. En effet:
AppMail
.
On peut tout de même noter que cette table permet d'améliorer
les performances de certaines requêtes (car cette table est bien moins
grande que AppMail
) ; mais cela se fait au détriment
de l'espace mémoire.
id_mail
- Un lien vers une adresse électroniqueid_mot
- Un mot décrivant ce lien mailCREATE TABLE Pict ( nom TEXT NOT NULL, chemin TEXT NOT NULL, id_site INTEGER, fichier TEXT, id_pict SERIAL PRIMARY KEY, UNIQUE(nom,chemin,id_site), FOREIGN KEY (id_site) REFERENCES Site ON UPDATE CASCADE ON DELETE CASCADE );
img
(c'est à dire vers une
image) trouvés dans toutes les pages visitées.
Un lien img
est de la forme: <IMG SRC="ICONS/redball.gif"
HEIGHT=13 WIDTH=13 ALT="Baballe rouge">
.
Dans cette table on stocke plusieurs informations afin d'être capable de désigner de manière unique n'importe quelle image. Pour cela, ils nous faut donc connaître :
SRC
du lien).
SRC
du
lien).
Normalement le code binaire de l'image aurait dû être stocké
dans la base de données. Cependant, pour cela, il aurait fallu soit
être le super utilisateur postgres
(pour pouvoir utiliser
les fonctions lo_import
et lo_export
directement
dans une requête SQL) ce qui est impossible, soit écrire unr
fonction en C spécialement pour réaliser l'insertion ce qui
aurait encore rajouter un langage de plus dans ce projet. Donc pour faire
plus simple, les images sont stockées dans le répertoire local
data/pict
. I l faut donc rajouter à cet table un champ
pour mémoriser le nom du fichier local contenant le code binaire
de l'image.
nom
- Nom du fichier contenant l'image sur le serveur distantchemin
- Chemin absolu depuis la racine du site pour accéder
au fichierid_site
- Identificateur du site auquel appartient l'imagefichier
- Nom du fichier local dans lequel le code binaire de l'image
est stockéid_pict
- Identificateur désignant cette image de manière
uniqueCREATE TABLE MotPict ( mot TEXT NOT NULL UNIQUE, id_mot SERIAL PRIMARY KEY );
Un lien img
est de la forme: <IMG SRC="ICONS/redball.gif"
HEIGHT=13 WIDTH=13 ALT="Baballe rouge">
.
Dans cette table on stocke les mots associés à l'image, c'est
dire contenu dans le champ ALT
du lien (baballe
et rouge
).
Les mots associés à une image subissent plusieurs traitements avant d'être ajoutés à la base de données :
mot
- Mot décrivant un lien httpid_mot
- Identificateur désignant de manière
unique un mot relatif à un lien httpCREATE TABLE AppPict ( id_page INTEGER NOT NULL, id_pict INTEGER NOT NULL, id_mot INTEGER NOT NULL, occurence INTEGER DEFAULT 1, UNIQUE (id_page,id_pict,id_mot), FOREIGN KEY (id_page) REFERENCES Page ON UPDATE CASCADE ON DELETE CASCADE, FOREIGN KEY (id_mot) REFERENCES MotPict ON UPDATE CASCADE ON DELETE CASCADE, FOREIGN KEY (id_pict) REFERENCES Pict ON UPDATE CASCADE ON DELETE CASCADE );
img
l référencé
par un mot m.
Cette page a deux utilités:
next
(voir projet d'algorithmique).
occurence
.
id_page
- Identificateur d'une page dans laquelle on a
trouvé le couple lien - mot.id_pict
- Identificateur du lien image.id_mot
- Identificateur du mot.occurence
- Nombre de fois que ce couple lien - mot a été
trouvé dans cette page.CREATE TABLE RefPict ( id_pict INTEGER, id_mot INTEGER, UNIQUE (id_pict,id_mot), FOREIGN KEY (id_pict) REFERENCES Pict ON UPDATE CASCADE ON DELETE CASCADE, FOREIGN KEY (id_mot) REFERENCES MotPict ON UPDATE CASCADE ON DELETE CASCADE );
En fait, cette table devrait être supprimée dans une prochaine version car elle est inutile et dangeureuse. En effet:
AppPict
.
On peut tout de même noter que cette table permet d'améliorer
les performances de certaines requêtes (car cette table est bien moins
grande que AppPict
) ; mais cela se fait au détriment
de l'espace mémoire.
id_pict
- Un lien vers une imageid_mot
- Un mot décrivant ce lien imageCREATE TABLE SuppFic ( fichier TEXT );
Cette table est mise à jour a chaque appel de la fonction supp_page
.
En effet, cette fonction inscript dedans le nom du fichier local (champ
fichier
dans la table Pict
) de toutes les images
qui ont été supprimées lors de la suppression de la
page passée en argument.
Cette façon de procéder à plusieurs inconvéniens :
VerifThread
)
bien que cela ne soit de toute façon pas très util.
lo_import
et lo_export
), nous aurions stocké le code
binaire des images directement dans la base de données et cette table
n'aurait jamais existée.
fichier
- Le nom du fichier local contenant le code binaire
de l'image supprimée.Sequence Detail |
http
visité un identificateur
unique.
http
un identificateur unique.
Function Detail |
Cette fonction ne gère pas explicitement le contrôle des
accès concurents. C'est a dire qu'elle ne verrouille aucune table.
Cela garantit des performance maximales puisque tous les processus peuvent
accéder à n'importe quelle table à tout moment. Cependant,
ce comportement pourrait porter atteinte à l'intégrité
de la base de données. En fait, l'intégrité de la base
de données est assurée par les triggers que Postgresql a créés
pour assurés l'unicité de certains champs des tables (mot
clef UNIQUE
). Ainsi, en cas de collision entre deux processus
l'une des transactions est annulée (voir la remarque ci-dessous)
; elle pourra être retentée plus tard.
Ce mécanisme suppose pour obtenir de bonnes performances que ces collisions
sont rares. Ce qui reste bien sûr à démontrer mais qui
semble à priori probable (de plus cela est confirmé dans la
pratique (voir le fichier data/crawler.log.coll
qui mémorise toutes
les collisions)).
Cette méthode retourne l'identificateur du lien inséré.
Celui-ci est soit un nouvel identificateur obtenu grâce à Http_id_http_seq
si le lien n'éxistait pas déjà dans la base, soit l'identificateur
que ce lien possédait déjà.
Remarques:
BEGIN
et COMMIT
(ou END
).
Si une erreur survient durant une transaction, toutes les commandes qui
ont déjà été exécutées sont
annulées de façon à garantir l'intégrité
de la base de données.
$1
- identificateur de la page dans laquelle le lien a
été trouvé
$2
- url pointée par le lien
$3
- mot descriptif du lien
$4
- nombre de fois que ce lien est désigné
par ce mot dans cette page
http
(vers une
page webl) désigné par son identificateur passé en argument.
Cette fonction est identique à ins_http_url
exceptée
qu'elle est plus rapide. En effet, puisqu'on passe l'identificateur de ce
lien http en paramètre cela signifie qu'il existe déjà
dans la base de données. Donc la fonction ne le vérifie pas
(contrairement à ins_http_url
).
Pour plus d'information sur la gestion de la concurence lors d'une insertion
voir ins_http_adr
.
$1
- identificateur de la page dans laquelle le lien a
été trouvé
$2
- identificateur du lien http
$3
- mot descriptif du lien
$4
- nombre de fois que ce lien est désigné
par ce mot dans cette page
mailto
(vers
une adresse mail) désigné d'après une chaine de caractères.
Cette fonction ne gère pas explicitement le contrôle des
accès concurents. C'est a dire qu'elle ne verrouille aucune table.
Cela garantit des performance maximales puisque tous les processus peuvent
accéder à n'importe quelle table à tout moment. Cependant,
ce comportement pourrait porter atteinte à l'intégrité
de la base de données. En fait, l'intégrité de la base
de données est assurée par les triggers que Postgresql a créés
pour assurés l'unicité de certains champs des tables (mot
clef UNIQUE
). Ainsi, en cas de collision entre deux processus
l'une des transactions est annulée (voir la remarque ci-dessous)
; elle pourra être retentée plus tard.
Ce mécanisme suppose pour obtenir de bonnes performances que ces collisions
sont rares. Ce qui reste bien sûr à démontrer mais qui
semble à priori probable (de plus cela est confirmé dans la
pratique (voir le fichier data/crawler.log.coll
qui mémorise toutes
les collisions)).
Cette méthode retourne l'identificateur de l'adresse insérée.
Celui-ci est soit un nouvel identificateur obtenu grâce à Mail_id_mail_seq
si l'adresse n'éxistait pas déjà dans la base, soit
l'identificateur que cette adresse possédait déjà.
Remarques:
BEGIN
et COMMIT
(ou END
).
Si une erreur survient durant une transaction, toutes les commandes qui
ont déjà été exécutées sont
annulées de façon à garantir l'intégrité
de la base de données.
$1
- identificateur de la page dans laquelle le lien a
été trouvé
$2
- adresse pointée par le lien
$3
- mot descriptif du lien
$4
- nombre de fois que ce lien est désigné
par ce mot dans cette page
mailto
(vers
une adresse mail) désigné par son identificateur passé
en argument.
Cette fonction est identique à ins_mail_adr
exceptée
qu'elle est plus rapide. En effet, puisqu'on passe l'identificateur de cette
adresse mail en paramètre cela signifie qu'elle existe déjà
dans la base de données. Donc la fonction ne le vérifie pas
(contrairement à ins_mail_adr
).
Pour plus d'information sur la gestion de la concurence lors d'une insertion
voir ins_mail_adr
.
$1
- identificateur de la page dans laquelle le lien a
été trouvé
$2
- identificateur de l'adresse pointée par le
lien
$3
- mot descriptif du lien
$4
- nombre de fois que ce lien est désigné
par ce mot dans cette page
img
(vers une
image) désigné par le chemin de l'image, son nom et le nom du
fichier contenant son code binaire.
Cette fonction ne gère pas explicitement le contrôle des
accès concurents. C'est a dire qu'elle ne verrouille aucune table.
Cela garantit des performance maximales puisque tous les processus peuvent
accéder à n'importe quelle table à tout moment. Cependant,
ce comportement pourrait porter atteinte à l'intégrité
de la base de données. En fait, l'intégrité de la base
de données est assurée par les triggers que Postgresql a créés
pour assurés l'unicité de certains champs des tables (mot
clef UNIQUE
). Ainsi, en cas de collision entre deux processus
l'une des transactions est annulée (voir la remarque ci-dessous)
; elle pourra être retentée plus tard.
Ce mécanisme suppose pour obtenir de bonnes performances que ces collisions
sont rares. Ce qui reste bien sûr à démontrer mais qui
semble à priori probable (de plus cela est confirmé dans la
pratique (voir le fichier data/crawler.log.coll
qui mémorise
toutes les collisions)).
Cette méthode retourne l'identificateur du lien inséré.
Celui-ci est soit un nouvel identificateur obtenu grâce à Pict_id_pict_seq
si le lien n'éxistait pas déjà dans la base, soit l'identificateur
que ce lien possédait déjà.
Remarques:
BEGIN
et COMMIT
(ou END
).
Si une erreur survient durant une transaction, toutes les commandes qui
ont déjà été exécutées sont
annulées de façon à garantir l'intégrité
de la base de données.
$1
- identificateur du site contenant cette image
$2
- identificateur de la page dans laquelle un lien vers
l'image a été trouvé
$3
- nom du fichier de l'image dans le site (sur le serveur
distant)
$4
- chemin absolu du fichier de l'image depuis la racine
du site
$5
- nom du fichier local où le code binaire de
l'image a été stockée
$6
- mot descriptif du lien
$7
- nombre de fois que ce lien est désigné
par ce mot dans cette page
img
(vers une
image) désigné par son identificateur passé en argument.
Cette fonction est identique à ins_pict_nom
exceptée
qu'elle est plus rapide. En effet, puisqu'on passe l'identificateur de cette
image en paramètre cela signifie qu'elle existe déjà
dans la base de données. Donc la fonction ne le vérifie pas
(contrairement à ins_pict_nom
).
Pour plus d'information sur la gestion de la concurence lors d'une insertion
voir ins_pict_nom
.
$1
- identificateur de la page dans laquelle le lien a
été trouvé
$2
- identificateur de l'image pointée par le lien
$3
- mot descriptif du lien
$4
- nombre de fois que ce lien est désigné
par ce mot dans cette page
Lorsqu'une page est supprimée (parcequ'elle n'est plus accessible sur le web), on supprime également tous les liens (http, mail et image) qui n'ont été trouvé que dans cette page ainsi que tous les mots ne désignant que ces liens.
$1
- l'identificateur de la page a supprimer.