<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
     "dtd/xml/4.1.2/docbookx.dtd"[
<!ENTITY % afnic_custom SYSTEM "../../lib/afnic-docbook.inc">
%afnic_custom;
]>
<!-- $Id: modelisation.db,v 1.1 2003-11-26 16:31:16 bortzmeyer Exp $ -->
<article lang="fr">
  <articleinfo>
    <title>Modélisation de données</title>
    <author>
      <surname>Bortzmeyer</surname>
      <firstname>Stéphane</firstname>
      <affiliation>
	<address><email>bortzmeyer@nic.fr</email></address>
      </affiliation>
    </author>
    <pubdate>$Date: 2003-11-26 16:31:16 $</pubdate>
  </articleinfo>
<section><title>Généralités</title> 

    <para>Nous allons expliquer ici les enjeux de la modélisation de
    données pour un registre DNS, par exemple d'un ccTLD. Un registre,
    a pour activité centrale la gestion d'une base de données. La
    publication (whois, et surtout serveur de noms) vient après et
    peut même parfois être sous-traitée. Mais la base de données est
    le c&#339;ur de métier.
</para>
    <para>Les discussions doivent donc être clairement séparées en :
<itemizedlist>
	<listitem><para>Discussions sur le modèle de données,</para>
	</listitem>
	<listitem><para>Discussions sur la présentation de ces données (sur une page Web
      ou bien via whois).</para>
	</listitem>
      </itemizedlist>
Ainsi, la base de données peut stocker une date abstraite mais la présenter
 aussi bien comme "2003-11-26" ou bien comme "Mercredi 26 novembre
 2003".</para>
<figure float="1">
	<title>Les composants d'un registre</title>
      <mediaobject>
         <imageobject>
           <imagedata fileref="composants.eps" format="EPS"/>
         </imageobject>
         <imageobject>
           <imagedata fileref="composants.png" format="PNG"/>
         </imageobject>
         <textobject>
           <phrase>Un registre est centré autour d'une base de
           données, et comporte des éléments périphériques comme le
           serveur de noms ou bien le serveur whois.</phrase>
         </textobject>
         <caption>
           <para>La base de données (SBGD : Système de Gestion de Base
           de Données) est le c&#339;ur de l'activité du registre.
           </para>
         </caption>
       </mediaobject>
      </figure>
  </section>
  <section>
    <title>Créer son schéma</title>
    <para>Il n'existe pas une méthode unique pour faire un schéma de
données. Il existe des règles techniques mais l'intuition joue quand 
même son rôle. Ce texte est donc surtout un avis personnel. Une grande connaissance des règles métier est nécessaire puisque ce sont elles qu'on veut
modéliser.</para>
    <para>Il existe divers outils informatiques pour créer un schéma. Mais un traitemen
t de
texte ordinaire peut être suffisant pour les schémas simples.</para>
<para>Un exemple de langage de modélisation simple est de représenter
      les données sous forme de <emphasis>tables</emphasis>. Chaque
table comporte une série de <emphasis>champs</emphasis> (ou
attributs).</para>
<para>Il existe des liens entre les tables, représentés ici par des
flèches.</para>
<figure float="1" id="schema">
	<title>Les tables et leurs liens</title>
      <mediaobject>
         <imageobject>
           <imagedata fileref="schema.eps" format="EPS"/>
         </imageobject>
         <imageobject>
           <imagedata fileref="schema.png" format="PNG"/>
         </imageobject>
         <textobject>
           <phrase>Trois tables, Domains, Contacts et Hosts sont ici représentées.</phrase>
         </textobject>
         <caption>
           <para>Un exemple simple avec des tables et des liens. Un
           domain a un contact technique, et un serveur de noms. Il
           pointe donc vers les tables Contacts et Hosts.
           </para>
         </caption>
       </mediaobject>
      </figure>
    <orderedlist>
      <listitem><para>Commencez par le glossaire : des termes non définis sont souvent
      une cause ultérieure d'incompréhension. Exemples pour un
      registre : transfert et transmission. Ou bien propriétaire et
      titulaire.</para>
      </listitem>
      <listitem><para>Désolé de répéter mais oubliez la présentation : les noms des
      attributs, par exemple, ne sont typiquement pas affichés à
      l'extérieur. Il n'est pas nécessaire qu'ils soient "conviviaux"
      ou bien "en français".</para>
      </listitem>
      <listitem><para>Avant d'ajouter un attribut, demandez-vous :
      <itemizedlist>
	    <listitem><para>S'il est utile : les logiciels de gestion de base de
            données modernes ne s'inquiètent pas pour une colonne en
            plus. Mais chaque colonne doit être remplie au cours des
            processus métier et plus il y a de colonnes, plus il faut
            gérer de cas.</para>
	    </listitem>
	    <listitem><para>S'il sera utile. On peut toujours ne pas utiliser un
            attribut qu'on a. Mais l'inverse est impossible donc il
            peut être préférable d'avoir d'avantage d'attributs que
            nécessaire.</para>
	    </listitem>
	  </itemizedlist>
</para>
      </listitem>
      <listitem><para>Pensez à la sémantique, pas uniquement à la représentation
       technique. Par exemple, la date de création d'un domaine
       est-elle remise à zéro en cas de changement de titulaire
       (transmission) ? </para>
      </listitem>
    </orderedlist>
  </section>
  <section>
    <title>SQL</title>
    <para>Les textes précédents étaient assez haut perchés par rapport
    à la
réalité des bases de données, c'est normal pour une introduction. En
fait, les bases sont créées et manipulées à partir d'un langage nommée
SQL (Structured Query Language). Le schéma est donc un source écrit en
SQL, avec des tables en nombre plus important que celles prévues pour
le schéma abstrait, notamment pour mettre en &#339;uvre les
    liens.</para>
<para>Le schéma très simple vue <link
    linkend="schema">précédemment</link> peut ainsi s'écrire ainsi :
<programlisting>
CREATE TABLE Domains (
 id SERIAL,
 name TEXT NOT NULL, -- Always stored in lower 
 created TIMESTAMP DEFAULT now(),
 last_modified TIMESTAMP DEFAULT now(),
 status TEXT NOT NULL DEFAULT 'reserved'
 );

CREATE TABLE Contacts (
 id SERIAL,
 handle TEXT DEFAULT new_handle () UNIQUE NOT NULL, 
 firstname TEXT,
 name TEXT NOT NULL,
 email TEXT NOT NULL,
 phone TEXT,
 address1 TEXT NOT NULL,
 address2 TEXT,
 address3 TEXT,
 city TEXT NOT NULL,
 zipcode TEXT NOT NULL,
 country TEXT NOT NULL,
 created TIMESTAMP DEFAULT now(),
 last_modified TIMESTAMP DEFAULT now());

CREATE TABLE Hosts (
       id SERIAL,
       name TEXT NOT NULL, -- Name is not unique because a host may have several addresses
          -- (IPv4 and IPv6 for instance)
       -- May be null (host outside the managed domain)
       address INET 
);

-- La table suivante est un lien
CREATE TABLE Contact_Domains (
       domain INTEGER REFERENCES Domains (id) NOT NULL,
       contact INTEGER REFERENCES Contacts (id) NOT NULL,
       type TEXT NOT NULL CONSTRAINT Valid_domain_contact_types CHECK (type IN ('tech', 'admin', 'billing', 'registrant'))
);

-- La table suivante est un lien
CREATE TABLE Nameservers (
       domain INTEGER REFERENCES Domains (id) NOT NULL,
       nameserver INTEGER REFERENCES Hosts (id) NOT NULL);
</programlisting></para>
<para>Une requête comme "tous les domaines créés depuis le 1<superscript>er</superscript> janvier 2003 peut alors s'écrire :
<programlisting>
SELECT * FROM Domains WHERE created > '2003-01-01';
</programlisting></para>
</section>
</article>
