[C++] Moteur BDD

Fermé
Luffy =) Messages postés 365 Date d'inscription mercredi 20 avril 2005 Statut Membre Dernière intervention 19 mai 2006 - 11 mai 2005 à 21:59
Luffy =) Messages postés 365 Date d'inscription mercredi 20 avril 2005 Statut Membre Dernière intervention 19 mai 2006 - 17 mai 2005 à 15:02
Salut à tous :-D

je développes une petite appli en C++ où je dois gérer un bon nombre de données. l'utilisation de fichier texte peut être une solution, mais pour une recherche, ça risque de faire un peu long... j'ai pas envie d'utiliser une base de données existante car il faudrait installer un serveur de bd à chaque fois qu'on installe l'appli.

Alors je voulais savoir comment gérer ça, en gros faire un "petit moteur de base de données simplifié" pour pouvoir accéder rapidement aux infos voulues.

Merci ++
A voir également:

13 réponses

kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
11 mai 2005 à 22:02
Ben tu te fait des classes d'objet C++, des méthodes pour enregistrée tes données et les loader dans/depuis des fichiers plats, des accesseurs, ... comme ne java quoi (je fais de C++ c'est pour ca ;) ).

non ? ca ne te dit pas ? en tout cas je ne vois que ca ! Ca va prendre un peu de mémoire mais bon...
0
Luffy =) Messages postés 365 Date d'inscription mercredi 20 avril 2005 Statut Membre Dernière intervention 19 mai 2006 110
11 mai 2005 à 22:16
en fait, c'est pour une partie de l'appli qui gère une liste de mp3 sur le PC. <parenthèse sur le projet>
ce n'est que le début, mais avec un pote qui est pas mal calé en électronique, on doit faire une appli qui gère un liste de mp3, et surtout de CD, avec un porte CD qui serait relié au PC par le port USB, et tu choisis un skeud et un petit moteur alimenté par le 5V du USB ressortirait le CD hors du porte CD. donc mon pote s'oocupe de la carte à microcontroleur avec le petit moteur et moi de l'appli sur le PC et sur la carte. en gros y'a du boulot !!!
</parenthèse>

mais ta solution reviendrait au même que de lire dans un fichier, la seule différence c'est que l'accès à la mémoire est quand même bcp plus rapide qu'au disque. Mais si tu as quelques milliers de mp3 sur ton PC, pour en rechercher un dans le tableau en mémoire, ça risque d'être assez long ! mais c'est vrai que cela pourrait être une solution !
à voir, je vais essayer ça.
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
11 mai 2005 à 22:40
ben je ne vois que une DB dans ce cas la.

Mais pour en revenir à la mémoire : tu peux tres bien faire une structure toute simple qui représente un mp3 et en faire des listes chainée selon la premiere lettre : plusieurs liste chainée (une par lettre par exemple). Comme ca les recherche sont plus rapide puisque tu connaitra la premiere lettre du cd ou de la musique.
De même pour les ajouts ou permutation, ...
L'appli sera peut etre plus longue au démarrage mais bon...
Pour les enregistrement : un fichier plat par lettre (par liste chainée donc en fait). Et tu n'es pas obligé de loader tout au départ de l'appli mais uniquement lors de la première demande : par exemple, j'ouvre l'appli, hopopop, je demande Muse, hopopo il me loade uniquement la liste Chainée 'M' du fichier plat concernant cette liste de cd (ou musique) commencant par la lettre 'M'. Comme ca c'est beaucoup plus rapide (gain de temps et de mémoire), et puis si tu n'utilise plus une liste, hopop, tu dé-alloue la mémoire vite fait bien fait. Au final, l'appli ne sera pas plus lente que cela.

Par contre, si tu veux stocher des donnée sur les morceaux, etc.. la c'est déjà moins tranquille, mais même genre de systeme et pis hopopo... mais ca va te prendre du temps !
Sinon, ben tu met un DB mysql : gratuit, tu propose l'install en même temp que ton appli : peit prog system rapido..

Enfin bref, tu as plusieurs solutions, à toi de voir !

++
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
11 mai 2005 à 22:43
De toute facon DB, DB, meme un DB déjà faite est obligée d'employé des fichiers plats, donc.. c'est juste que ce sera certainement mieux fait je pense... (pas pour douter de tes capacité, loin de là :) ).

Bonne nuit ++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Luffy =) Messages postés 365 Date d'inscription mercredi 20 avril 2005 Statut Membre Dernière intervention 19 mai 2006 110
11 mai 2005 à 23:15
bon je crois que je vais en effet utiliser les listes chainées (pour la première fois, ben ouais j'ai jamais fait ça encore...) car cela simplifiera nettement la "mise en mémoire" de tous les mp3 facilement, c'est-à dire sans réallocation mémoire à chaque fois. par contre je n'ai pas très bien compris ton histoire d'utiliser les listes chainées avec les première lettre des groupes...

en fait ce que je compte faire, c'est une structure mp3 avec les données (titre, groupe, durée, ) et avec un pointeur vers la prochaine structure (une liste chaine quoi ! enfin d'après ce que j'ai compris...)

je viens de finir ma fonction pour récupérer les tags mp3, ensuite il me faut la fonction pour lister et écrire dans un fichier les mp3 sur le PC.

++ et merci kij =)
0
Tut tut !!!

Pas de liste chainée !!
Tu fais du C++ --> classe vector.
Ca a exactement les même avantage que tu dis, et l'accès en lecture est aussi optimisé qu'un tableau classique (pointeur sur liste).
Par contre ta liste chainée risque de ramer à mort.

Tips pour accélerer ta recherche :
Tu ne doit pas avoir 36000 champs dans la structure qui code un mp3.
Tu peux créer des index alphabétique pour chaque champs de la structure.
(Ca revient à avoir l'ordre de la liste, triée alphabétiquement, mais ausi bien selon le titre, l'artiste, l'album, le genre, la taile, etc...)

Vu qu'une recherche c'est (souvent) une comparaison de début de chaine...

Par contre, si tu veux faire une recherche sur un fragment pas forcément au début, la tu ne coupe pas à la recherche exhaustive. Mais dis toi que ton algo reste en O(n) ce qui est du point de vu de la complexité, très bien.
0
Luffy =) Messages postés 365 Date d'inscription mercredi 20 avril 2005 Statut Membre Dernière intervention 19 mai 2006 110
11 mai 2005 à 23:47
C++ --> classe vector oh la la... va falloir que je me documente là !

Ca revient à avoir l'ordre de la liste, triée alphabétiquement, mais ausi bien selon le titre, l'artiste, l'album, le genre, la taile, etc...
ce serait énorme si ça pouvait faire ça !!!

Mais dis toi que ton algo reste en O(n)

euh... Monsieur ! monsieur ! j'ai pas compris là!

en tout cas je vais voir ce que donne la classe vector, j'en ai tellement entendu parler qu'il était sur qu'il fallait que je m'y mette !

bon je vais lire un peu de doc et je reviens !
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
12 mai 2005 à 09:41
0(n) constitue le degré de complexité de ton algo, plus il est élévé et moins c'est bien car plus complexe et donc moins rapide (plus d'opérations..)

Quand au Vector, suis les conseil de SKZ, moi je disais liste chainée car je ne connais pas le C++, mais si tu as l'équivalent de fait (en mieux toujours !!), c'est pas la peine de le refaire..

voilà

++
0
Luffy =) Messages postés 365 Date d'inscription mercredi 20 avril 2005 Statut Membre Dernière intervention 19 mai 2006 110
16 mai 2005 à 22:28
coucou =)

me revoilà avec mes vecteurs. j'avais pas trop eu le temps de regarder avant...

mais petite question : on ne peut utiliser qu'un tableau à une dimension avec les vecteurs ou j'ai rien compris ???
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
17 mai 2005 à 09:16
Hello, moi aussi je ais mon gand retour :)

Ben si c'est un Vector, rien ne t'empeche de faire des Vectors de Vector non ? (Si c'est le même principe qu'en Java...)
0
Luffy =) Messages postés 365 Date d'inscription mercredi 20 avril 2005 Statut Membre Dernière intervention 19 mai 2006 110
17 mai 2005 à 10:14
Salut kij =) ça va bien?

bon je vais essayer ta méthode car j'ai tenté de mettre un tableau de char dans un vector, et il n'accepte pas...

mais le problème est de lier les informations de la chanson. prenons l'exemple que je dois stocker le titre et l'auteur de la chanson. si je trie pour une recherche par le titre de la chanson, l'auteur doit suivre également.

Or si je fais un vector de vectors, ben ce n'est pas sur que ça marche...

enfin je vais de ce pas tester tout ça, et je te dis.
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
17 mai 2005 à 10:26
Hello Luffy,

Pour pouvoir faire ce que tu veux, il te suffit de découper tes informations :

Je veux dire par la, faire des objets Auteurs, des objets Musiques, etc.. et faire des méthodes pour lier les objets ensemble (mais pas forcément du même type : par exmple, dans un objet Auteur, on pourra avoir un Vector de pointeur sur objet Musique, ou Album, et ainsi on pourra retrouver les titres d'un Auteur si on l'a. Inversement, une Musique pourra avoir comme attribut un Vector de pointeur sur Auteur afin de lier la chason aux auteurs. Ensuite tu peux faire des méthodes d'acces (accesseurs) pour lire les infos d'un objet, en faire des listes chainées, etc. (C'est du Java quoi, dsl si je me base trop la dessus je ne connais que cela en objet (à par php et jaascript qui sont hors sujet) ).

C'est uniquement de la conception objets en fait. Les listes chainée par la suite serviront plus à stocker tes infos dans des fichiers pour les sauvegarde et loading en début / fin de programme (ou en cours comme je l'ai dit avant..), et pour avoir une structure générale dans laquelle rechercher par Auteur (liste d'auteurs), ou par Musique (liste chainée de musique classée par ordre alphabétique),...

Voilà, voilà comment je ferais pour ton truc.

++
0
Luffy =) Messages postés 365 Date d'inscription mercredi 20 avril 2005 Statut Membre Dernière intervention 19 mai 2006 110
17 mai 2005 à 10:50
pffffff... tu es d'un compliqué kij ;-)
c'est vrai que cela aurait pu être une solution, mais pas simple !

alors j'ai fait un truc et ça a l'air de marché :

//déclaration de la structure de données des chansons
struct data
{
	CString titre;
	CString auteur;
};

//déclaration du vector
vector <A> chanson;

/*fonction qui bientot ira lire dans le fichier au chargement de l'application et va initialiser le vector
int CChanson::Init(void)
{

	data chanson1; //déclaration d'une structure
//initialisation des données
	chanson1.auteur="auteur"; 
	chanson1.titre = "titre";
//on met les données dans le vector
	chanson.push_back(chanson1);

	return 0;
}

je trouve ça plus clair (et surtout plus simple à coder) !!!

et désolé, oui j'utilise la classe CString des MFC, certains m'en voudront, mais elle est quand même bien pratique =)
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
17 mai 2005 à 10:57
Je suis d'accord avec sur le fait que c'est plus simple comme tu fais mais le probleme c'est que tu aura bcp moins de flexibilité pour effectuer des recherches dans ta "base".
Je ne connais pas spécialament le C++ sinon je t'aurais pondu un exemple complet pour que tu vois ce que ca donne.. et je pense que tu aurais été convaincu. Mais tu as raison : commence simplement, et modifie au fur et à mesure. Seulement, une bonne méthodes pour la conception d'un programme est de fixer toutes les contraites des le départ et les objetifs réels du programme. (Tout ca pour redire que tu aura poins de fonctionnalité / flexibilité pour tes recherches par la suite).

0
Luffy =) Messages postés 365 Date d'inscription mercredi 20 avril 2005 Statut Membre Dernière intervention 19 mai 2006 110
17 mai 2005 à 15:02
mais le probleme c'est que tu aura bcp moins de flexibilité pour effectuer des recherches dans ta "base".

pas si sur, car du moment que je puisse trier par ordre alphabétique le champ que je veux, sa devrait aller assez vite et facilement.

mais le problème c'est que dès que je mets les fonctions de tri de la librairie standard duC++, ben mon compilo me génère pleins d'erreurs... il ne doit pas aimer les vectors de structure en fait... ouuuuuiiiiinnnnnn...

bon, alors je crois que je vais étudier plus en détail ce que tu m'as proposé, et je reviens te poser qq questions ;-)
0