-
Question de Modelisation
Salut,
J'aimerais avoir votre avis ou un retour d'experience sur la facon optimale
de modeliser une base afin d'obtenir les meilleurs performances en terme de temps de reponse sur requete.
Je vais essayer de vous donner tous les infos sans en faire une tonne.
Je dois mettre en place une base de données gerant des contacts.
pas mal de contacts puisqu'il y en aura entre 6 et 7 millions.
cela se traduira par une table contact contenant entre autre le nom,prenom,la civilite, l'adresse(quoi que cela fera peut etre l'objet d'une autre table)
Je dois egalement stocké associé a ces contacts tout un ensemble d'informations tel que le telephone,l'email mais aussi la csp et des infos sur les gouts ou activité d'achat, activité sportive.
Ces données ne sont pas toutes renseignés pour tous les contacts.
Ma question j'y arrive, c'est comment stocker ces données ?
ma facon de faire serait de creer une table info_contact avec evidemment une cle etrangere vers la table contact. un champ Id_type_info qui permettra de savoir quel type d'info on trouve et un champ valeur contenant la valeur elle meme.
Cette table vous l'aurez compris risque de contenir au bas mot 40 à 50 millions de ligne. Du coup j'ai peur que cela ne permette pas d'avoir des temps de reponse rapide lors du requete et c'est justement ce qui m'importe.
il y aura tres souvent des interrogations du type "donnez les contacts dont la csp est employé, qui ont un email de renseigné et qui ont acheté dans les 12 derniers mois."
je vais me lancer dans des tests avec un generateur de données afin de pouvoir tester quelques requetes pour voir le temps de reponse.
Si vous avez des conseils , je suis preneur.
Merci
Maveric
P.S : désolé pour la longueur du message
-
Bonjour,
Je travaille avec des tables de plusieurs milliards de records.
Voici mes conseils:
Liste toutes les colonnes nécessaires. Sépare-les en trois catégories: Contenu unique, Contenu non-unique et Contenu marginal.
Contenu unique: Comment puis-je identifier mon record à même le contenu? L'adresse email garantie l'unicité et est un standard. Tu peux ajouter des choses comme le nom, des éléments de l'addresse. Uniquement les champs obligatoires doivent être choisis. Si l'adresse email n'est pas obligatoire, elle vous est inutile dans cette catégorie.
Contenu non-unique: Le contenu que je voudrai aller chercher et qui n'est pas déjà dans le première catégorie.
Contenu texte marginal: des informations qui sont peu souvent utilisées.
Le contenu unique doit être combiné pour construire la clé unique "clustered" avec l'aide d'un identifiant unique incrémental si l'unicité n'est pas garantie à 100%.
Le contenu non-unique est combiné avec les première colonnes pour former la table principale.
Le contenu marginal doit être stocké dans une table différente de façon tabulaire, c'est-à-dire qu'un record dans la table principale peut être lié 0 à n records dans cette table dépendemment s'il possède le contenu marginal en question.
Table 1
Contact_id int (pk)
email nvarchar(255) (pk)
firstname
lastname
phonenumber
Table 2
Contact_id int (pk)
field_id int (pk)
field_content ntext
Table 3
field_id int (pk)
field_description
Ensuite, d'après les besoins de données prévus, il faut contruire des index non-clustered en joignant la clé logique (Contact_id) avec les éléments de la requête et en stipulant en premier les champs-catégories (pays, sexe, etc.) qui aideront les seeks à éliminer les plus de données le plus vite possible. Une erreur à ne pas commettre: il ne sert à rien de mettre tous les champs dans un index en pensant accélérer les requêtes globales.
Vérifie bien que tes index sont bien utilisés en regardant l'Execution plan.
Commence avec ça.
-
Merci Babyneedle pour tes elements de réponse.
Je ne suis pas sur t avoir bien compris tes conseils.
La séparation des colonnes en trois colonnes, ok
Concernant les tables, ta table 1 est donc la table principale que tu enonces a un moment donné c'est cela ? elle contient le contenu dit unique.
LA table 2 est celle qui contient le contenu non unique.
tu utilises le type ntext pour le champ field_content qui certe peux accepter beaucoup de chose mais j'ai un peur de l'utilisation de celui ci car il va server souvent dans les requetes. Si le type nvarchar est suffisant pour stocker ce que j'ai a y mettre, me conseille tu plutot d'utiliser celui ci ?
cette table est stocké de facon tabulaire, il y a n records pour 1 record dans la table principale.
Enfin la table 3 est juste la table de description du contenu de la table 2.
Il y a donc une table 4 pour le contenu marginal ?
Est je bien tout compris ?
J'ai comme un doute...
J'en profite pour demander si quelqu'un connait un generateur de données
pour sql server qui serait gratuit.
Merci encore en tout cas Babyneedle d'avoir pris du temps pour repondre a ma demande un peu inhabituel sur ce forum.
Maveric
-
-
Je connaissais les liens que tu donnes.
Sqlpro donne de tres bons conseils.
J'aurais aimé d'ailleurs avoir son avis sur mon probleme.
J'entends par generateur de données un outil qui permet
de generer de facon aleatoire des données dans des tables.
Cela me permettra de me mettre en situation presque reel
au niveau de la quantité de donnée et d'avoir le temps de reponse
des futurs requetes.
Eric