... pour modéliser mon système. - SQL/NoSQL - Programmation
Marsh Posté le 02-08-2011 à 23:39:17
Oui, ça ne doit pas être très compliqué d'enregistrer tout ça dans une base SQL.
Ensuite, tu récupère l'action qui correspond à tes critères.
Marsh Posté le 02-08-2011 à 23:46:22
mrbebert a écrit : Oui, ça ne doit pas être très compliqué d'enregistrer tout ça dans une base SQL. |
Ah, merci bien Mr. bebert.
Donc en gros, si mes souvenir son bon, c'est du genre !
1 create db
3 ou 4 create tablle
Des insert ou un truc du genre.
Et une requête .| ?
Merci.
Marsh Posté le 03-08-2011 à 00:18:38
En théorie, il y a d'abord une phase de réflexion mais en pratique, oui, c'est ça
Le SGBD fournit le stockage et le moteur d'accès mais il faut voir aussi comment tu accèdes aux données dans ton langage.
Marsh Posté le 03-08-2011 à 00:57:42
En théorie, je sais pas trop sur quoi réfléchir.
Merci pour tes réponses.
Marsh Posté le 03-08-2011 à 09:06:33
+1 pour une modélisation dans une BD. En plus, si t'as un grand nb d'objets/actions/utilisateurs, côtés perfs, un SGBD sera bien mieux
Donc nous disons :
1 table objet
1 table action
1 table utilisateurs
1 table relationnelle entre objet et action (au moins les 2 clés étrangères des 2 tables concernées)
1 table relationnelle entre entre objet et utilisateur (idem, au moins les 2 clés étrangères des tables concernées).
Marsh Posté le 03-08-2011 à 09:32:40
Et bonjour rufo... Merci pour ta contribution...
Si tu as le temps, tu peux me souvenir le rôle des clef étrangère, comment on les détermine.
Pour le moment j'ai même pas les def des table principales.
Faut que je révise les SGBD.
Marsh Posté le 03-08-2011 à 10:29:24
table "utilisateur"
accessoirement, j'aimerais ajouter :
tant qu'à y être
table "object"
accessoirement, j'aimerais ajouter :
peut-être même un
table "action"
accessoirement, j'aimerais ajouter :
table "Object_from_user"
table "action_from_object"
Marsh Posté le 03-08-2011 à 10:38:19
une clé étrangère sert à établir une relation entre la table dans laquelle elle est définie "étrangère" et pointe sur une clé primaire d'une table. Dans el cas d'une relation 1-n ou 0-n, la clé étrangère se trouve directement dans la table à laquelle elle lie la table dont elle est issue
ex : une entreprise contient plusieurs employés.
J'ai une table entreprise avec comme clé primaire IDentreprise
J'ai une table employé avec comme clé primaire IDemployé et comme clé étrangère, IDentreprise pour me permettre d'établir la relation qu'un employé travaille dans une entreprise.
Ici, t'es dans le cas d'une relation n-n, il faut donc une table relationnelle qui va lier les 2 tables impliquées dans la relation (objet et action, par ex). La table objet a comme clé primaire IDobjet, la table action, la clé primaire IDaction.
Il faut une table relationnelle ObjetAction qui peut avoir une clé primaire (un entier auto incrémenté par ex, mais cette clé primaire n'est pas obligatoire) et au moins, chaque clé primaire des 2 tables. La clé primaire de cette table relationnelle peut éventuellement être la concaténation des 2 clés étrangères. Par ailleurs, si y'a d'autres infos qui caractérisent une relation objet-action, c'est dans cette table qu'il faut rajouter les champs correspondant à ces caractéristiques supplémentaires.
Marsh Posté le 03-08-2011 à 10:41:10
C'est ça l'idée, par contre le coup de stocker des pointeurs ada en base, je le sens pas Habituellement, on sérialise carrément l'objet quan don veut le stocker en BD.
Sinon, pour le coup de tracer si un user est loggé ou pas, on le fait pas trop dans la table users, mais plutôt dans une table de type "log" (on y trouve, par ex, la date et heure de connexion, pourquoi pas l'IP...).
Marsh Posté le 03-08-2011 à 10:45:33
rufo a écrit : |
Merci rufo...
Qu'entends tu par sérialiser les objets ?
Merci.
Marsh Posté le 03-08-2011 à 11:06:03
C'est transformer sous la forme d'une chaîne de caractères les attributs d'un objet, en général sous un formalisme qui ressemble beaucoup au JSON.
Marsh Posté le 03-08-2011 à 11:14:33
rufo a écrit : |
Mais heu ! Je vais jamais savoir faire ça.
edit : en fait j'ai déjà trouver une bibliothèque Ada.
Merci rufo.
Marsh Posté le 03-08-2011 à 18:21:28
Bonjour ou re-
Que faut-il faire avant de pouvoir se connecter à une base de donnée.
Peut-être la créer ? Mais comment ?
J'ai installé MySql-server-5.0.0, j'ai entré un mot de passe, j'ai oublié de noter le nom pour l'administration
Et après dans mon code j'ai fais ceci :
Code :
|
Mais j'ai une erreur MySql.Connect_Failure.
S'il vous plaît ?
Merci pour vos lumières.
Marsh Posté le 03-08-2011 à 18:49:55
J'ai trouvé, pour le moment je suis l'utilisateur root.
Je renseigne le mot de passe correspondant et c'est bon.
Code :
|
Marsh Posté le 04-08-2011 à 09:32:19
Y'a juste besoin de se connecter au serveur Mysql. Après, avec des requêtes SQL tu peux créer une BD (CREATE DATABASE), des tables (CREATE TABLE), modifier la structure d'une table (ALTER TABLE), insérer, modifier, supprimer des enregistrements dans ne table (INSERT INTO, UPDATE, DELETE)...
Marsh Posté le 04-08-2011 à 13:26:28
Bonjour à touts, bonjour rufo, merci pour ça.
Je reviens sur l'analyse de mes besoins (la structure de la db),
Dans ma base, Je veux :
En suite, je veux savoir si un utilisateur à le droit d'effectuer une action sur une objet.
Par défaut tous les utilisateurs ont le droit d'effectuer quelques actions.
Suite à une de ces quelque actions, les utilisateurs peuvent effectuer les actions restantes.
Comment procéder (structurellement parlant) ?
Pour le moment j'ai :
table "Users_Table"
table "Objects_Table"
table "Actions_Table"
Ma requête sera constitué de "User_Name", "Action_Name", "Object_Name" qui doit me retourner un booléen.
Pour synthétiser,
Je prend :
la liste de verbes d'un langage naturel pour en faire des actions ;
la liste des noms " " " " " " " objets ;
J'ajoute en suite un à un les utilisateurs qui ont par défaut le droit d'effectuer les actions "créer" "construire" "générer" "produire", etc, sur quelque objet.
Suite à une des actions précédente, l'utilisateur à le droit d'effectuer toute les autres actions sur l'objet généré.
Vous voyer ce que j'essaye de faire ?
Merci pour vos réponses.
Marsh Posté le 04-08-2011 à 14:05:10
1) Pas la peine de mettre "_Table" dans le nom de tes tables, ça alourdit et on se doute bien que ce sont des tables.
2) préfère le sha-1 au md5 (algo cassé depuis qq années).
Comme dit dans mon post http://forum.hardware.fr/hfr/Progr [...] m#t2093050
Il te manque 2 tables de relations : une table pour stocker les relations entre objet et action et une autre entre objet et utilisateur.
La table obj_action est initialisée avec TOUTES les actions qu'on peut faire sur un objet donné.
par contre, par rapport à ce que tu dis, c'est pas une relation entre objet et utilisateur qu'il te faut, mais entre la table relationnelle obj_action et utilisateur.
Cette table obj_action_user est initialisée avec les seules actions que chaque utilisateur peut faire pour certains objets.
Du coup on se retrouve avec toujours 5 tables :
Objet : ObjID, ObjNom ...
Action : ActID, ActNom ...
Utilisateur : UtilID, UtilNom, UtilMdP ...
ObjetAction : ObjActID, ObjID, ActID
ObjetActionUtilisateur : ObjActUtilID, ObjActID, UtilID, ActionFaite
ActionFaite est un booléen pour dire si l'action a été effectuée ou pas.
Je pense pas qu'on puisse faire qu'une table pour la relation objet/action/utilisateur car en faisant ça, on pourrait plus lister les actions pouvant être faites sur les objets, indépendamment des droits des utilisateurs.
Ensuite, une fois que tes utilisateurs ont fait certaines actions, celles-ci peuvent déclencher l'ajout de nouvelles entrées dans la table ObjetActionUtilisateur permettant ainsi à un utilisateur de faire de nouvelles actions. Les actions ajoutées seront celles qui se trouve dans
la table ObjetAction et qui n'ont pas de couple [ObjActID, UtilID] dans ObjetActionUtilisateur...
Marsh Posté le 04-08-2011 à 15:33:25
Rufo, merci, merci bien pour ton aide.
Je crée trois tables de données et les 2 tables de relations avec MySQL....
Code :
|
Citation : Ensuite, une fois que tes utilisateurs ont fait certaines actions, celles-ci peuvent déclencher l'ajout de nouvelles entrées dans la table ObjetActionUtilisateur permettant ainsi à un utilisateur de faire de nouvelles actions. Les actions ajoutées seront celles qui se trouve dans la table ObjetAction et qui n'ont pas de couple [ObjActID, UtilID] dans ObjetActionUtilisateur... |
Ce qui veux dire, qu'a chaque ajout d'un utilisateur, j'ajoute les actions primaires.
Suite à une action primaire j'ajoute les actions secondaires.
Ca se renseigne comment une table de relation ?
15 ans que j'ai pas fait de bd.
il faut que je maintienne deux groupe d'actions :
Je poste, je suis pomé là.
Marsh Posté le 04-08-2011 à 16:21:21
Pour pas avoir de pb, mets comme valeur par défaut FALSE pour Is_Done dans la déf de ta table
Ben dans l'ordre, tu remplis d'abord les 3 tables Action, user et Object.
Ensuite ObjectAction, dans laquelle tu vas mettre les couples Object_Id/Action_Id (donc l'ensemble des action possibles pour chaque objet).
Enfin, ObjectActionUser dans laquelle tu vas mettre les couples ObjectAction_Id/user_Id pour définir les actions que chaque utilisateur peut faire au départ sur certains objets, ObjectAction_Id étant trouvé en recherchant dans la table ObjectAction le couple action/objet que l'utilisateur pourra faire au début.
Vu qu'apparemment la notion d'action primaire (celle pouvant être faite au début par n'importe quel utilisateur) et secondaire (action faite ensuite) semble ne pas dépendre d'un algorithme/logique métier (cf ton topic sur les réseaux de neurones et d'apprentissage) va falloir ajouter un champ dans une table, voire une table.
Si la notion de primaire/secondaire ne dépend que du type d'action, alors, faut rajouter le champ "Type" (valeur 1 pour "primaire" et 2 pour "secondaire" ) dans la table Action.
Si cette notion dépend de l'objet et donc de l'action, faut rajouter le champ "Type" dans la table ActionObject.
Si cette notion dépend de l'utilisateur et de l'action ou carrément de l'utilisateur/action/objet, alors faut créer une table relationnelle de paramétrage avec une clé primaire auto-incrémentée, les clés primaires des tables concernées (donc 2 ou 3 clés) et le champ "Type".
Après, pour remplir ta table ObjectActionUser, faudra aller piocher dans la nouvelle table (ou dans le champ Type mis sur une des tables existantes) et filtrer d'abord sur la valeur 1 puis 2
Marsh Posté le 10-08-2011 à 16:16:35
Bonjour rufo, bonjour à tous,
Désolé pour ma réponse tardive, un défaut d'Internet.
Merci encore rufo pour ces réponse rapide et précise.
En fait, je suis encore à me demander comment fonction mon système à ce jour.
Mais je profite du fil pour te demander rufo si par hasard tu saurais, et pouvais me dire pour quoi mes requêtes MySQL ci-dessus ne fonctionne pas même avec un point- virgule à la fin ?
Je doit dire que je retrouve le net à l'instant je n'ai pas cherché encore.
Je fait ces requêtes à partir d'un client Ada MySQL... et en ligne de command en exécutant mysql, ces requête ne passe pas.
Marsh Posté le 10-08-2011 à 16:35:22
Le type INTEGER n'existe pas. Suivant la taille, tu as TINYINT (1 octet), SMALLINT (2 octets), INT (4 octets), BIGINT...
Ca donne pour ta première table
Code :
|
Au passage, tu souhaites utiliser les foreign key, ça veut dire qu'il faut utiliser le moteur InnoDB (cf instruction ENGINE). Ici, je l'ai fait en Myisam. Dans une BD, tu peux mélanger les moteurs suivant les tables..
Je te conseille de t'installer wampserver ou un outil graphique pour construire tes tables : ça te génère le code sql Dans wampserver, l'outil s'appelle phpmyadmin...
Marsh Posté le 10-08-2011 à 16:59:28
Merci rufo.
rufo a écrit : |
Non, je veux pas utiliser tout ça, j'ai mis Foreign key parce que c'était l'exemple donné.
Je veux simplement lier mes tables avec mes clefs étrangères.
Marsh Posté le 10-08-2011 à 17:01:30
ben sans les foreign key, les contraintes entre les tables devront être gérées par l'appli. C'est pas un pb en soit, faut juste en avoir conscience
Dans ce cas, le moteur MyIsam suffit (attention, c'est pas forcément le moteur qui est mis par défaut, donc bien le préciser dans la création de tes tables avec la clause ENGINE=MYISAM).
Marsh Posté le 11-08-2011 à 15:58:15
Bonjour, merci rufo.
J'aurais deux questions concernant MySQL... Je suis aller à la fnac pour trouver un bouquin sur MySQL, j'ai pas trouvé, même en commande, ça peu se trouver en librairie ?
L'autre concerne l'hébergement de ma base, je ne sais pas ou elle est mais j'aurais voulu la mettre dans mon répertoire personnel qui se trouve sur le partition /home, est-ce possible ?
Edit : j'ai trouvé pour la localisation de la base. Merci.
Marsh Posté le 11-08-2011 à 16:35:37
Répertoire /data de mysql.
Pour le bouquin, pas utile, y'a l'aide en ligne T'as tout sur toutes les commandes, avec des exemples. Et sur le web, pleins de tutos.
Marsh Posté le 11-08-2011 à 17:07:18
j'ai fait ça pour la localisation de la base, j'ai déplacer /var/lib/mysql dans /home et modifier le path de datadir dans /etc/mysql.cnf
En suivant ce tuto : http://www.kitsgraphiques.net/chan [...] -tu44.html
Ok pour l'aide, je vais voir. Merci encore rufo.
En fait je suis encore dans l'intérrogation sur la structure de ma base.
Ah oui, une autre question : Peut-on faire des requetes multi-base ?
Une autre : peut-on comme sur Access mettre le contenu d'une requête dans une table ?
Merci.
Marsh Posté le 11-08-2011 à 17:44:46
Oui, on peut faire des requêtes multi-bases, suffit que les bases soient sur le même serveur et faire précéder dans les requêtes les noms des tables du nom de la base.
Ex : SELECT... FROM BD1.table1 t1, BD2.table2 t2 WHERE...
Oui, on peut mettre le résultat d'une requête dans une table via INSERT INTO [TEMPORARY] TableName SELECT ..... FROM.... WHERE....
Sans la clause TEMPORARY, le résultat sera accessible à tous les users qui se connectent à la BD. Avec la clause, seul le user qui a créé la table y aura accès. Pour des questions de perfs, tu peux aussi mettre le résultat dans une table (temporaire ou pas) créée avec le moteur MEMORY (ce sont des tables qui ne sont stockées qu'en mémoire, pas sur disque).
ps : Access, c'est pas un SGBD et c'est de la daube
Marsh Posté le 11-08-2011 à 17:53:11
ReplyMarsh Posté le 12-08-2011 à 09:03:47
pas de quoi mais ma conclusion est du vécu (mon projet de fin d'études d'école d'ingé en ASP et Access, je te dis pas le nb de fois que la BD plantait et la limitation à 1 ou 2 connexions max en // )
Marsh Posté le 18-08-2011 à 23:09:05
Bonsoir, bonsoir rufo, perso, bonsoir à tous.
Sans transition.
Mon système se transforme en jeu et si vous avez du temps je suis preneur de conseils.
"Je voudrais concevoir un jeu banal a priori, on partage une carte en réseau pour y placer des armes et une unité stratégique et on calcule qui gagne.
La règle exactement est simple a priori ; Tant que l'unité stratégique n'est pas détruite, on peu ajouter des armes et tirer dans la limite d'une charge maximum, si non la partie est perdu simplement. Le point stratégique est un point invisible des joueurs alors que les armes le sont. Le point stratégique est placé au début de parti et on ne peut pas le déplacer, les armes sont déplaçable."
Les armes restantes des unités stratégiques détruites sont ajouter à votre arsenal. On recherche les unités stratégique à la main ou à l'aide d'outils de recherches qu'il faudra gérer.
pour réaliser e jeu, je doit au moins faire une BD pour la gestion du jeu.
Techniqement ça ressemnble à ça pour le moment :
table user ... -- comme d'hab.avec
table Wopr -- C'est l'unité stratégique.
(,
x_source : double,
y_source : double,
Charge : double;
-- j'hésite à inclure des information de ciblage X,Y_target qui seront produite lors des recherches de cibles.
User_Id int not null
table Missils --
(missil_id int,
x_source double,
y_Source double,
charge : real,
x_target : double,
y_target : double,
Charged : boolean
Woper_Id int)
un wopr appartient à un utilisateur, et plusieurs missiles appartiennent à un wopr.
Vous voyez quelque chose pour m'aider.
Marsh Posté le 26-08-2011 à 14:06:13
Bonjour, bonjour à tous, directe, je demande pas qu'on face mon boulot, mais ! J'aurais voulu quelque exemple de requête plus ou moins adapté à mes besoins, si vous voulez bien. Pour reprendre, Mais j'ai pas envi, mais faut le faire... C'est pour minuterie.
Comme vous le savez peut-être, j'ai changé d'idée initiale, mais je vais pas refaire un topic pour si peu, bref, je fais un jeu vite fait en attente de reprise du projet initial, bref...
La règles en gros.
Tant que l'unité stratégique n'est pas détruite, on peu ajouter des armes et tirer dans la limite d'une charge maximum, si non la partie est perdu simplement.
Le point stratégique est un point invisible des joueurs alors que les armes le sont.
Le point stratégique est placé au début de parti et on ne peut pas le déplacer, les armes sont déplaçable.
Les armes restantes des unités stratégiques détruites sont ajouter à votre arsenal. On recherche les unités stratégique à la main ou à l'aide d'outils de recherches qu'il faudra gérer.
Voici mes tables....données par shwo cretae table de Mysql.
Code :
|
Code :
|
Code :
|
Dessus, je dois faire, les requêtes suivantes : (entre parenthèses, les paramètre en entrée et sortie)
Certaine de ces requêtes constitue des ensemble de requête sql, en faite, ce sont les entrées de mon ordonanceur.
|
Alors, déjà, est-ce que j'ai bon avec mes tables ?
Et vraiement, merci si vous pouvez me donner des exemple pour le test d'existence, un ajout et Launch, je peut compléter les info si besoin.
Merci.
edit : au moins un coup de main sur la conception ...
Marsh Posté le 26-08-2011 à 19:06:18
Pour le Get_Wopr par exemple, je voudrais faire une recherche sur le Username dans la table Users pour récupérer le User_Id et faire une recherche avec le User_Id dans la table Wopr en une seul requête, y a moyen ?
Marsh Posté le 26-08-2011 à 20:20:14
Bonsoir, alors, a priori j'ai bon mais j'ai pas si bon parce que ma requête plante depuis Ada.
Alors, je sais qu'on est pas dans la cat Ada, mais c'est du SQL...
Code :
|
Marsh Posté le 26-08-2011 à 23:29:54
Faudrait apprendre le SQL Ce que tu cherches à faire s'appelle une jointure.
SELECT * FROM Woprs w INNER JOIN Users u ON (w.User_Id = u.User_Id) WHERE u.Username = 'Mon nom';
Edit : mettre *, c'est pas bien dans le SELECT
Marsh Posté le 26-08-2011 à 23:55:59
rufo a écrit : Faudrait apprendre le SQL |
C'est ce que je fait. Merci rufo.
J'ai pas compris ce que font w et u...
Mais ma requête, elle est pas bonne, c'est pas pareil ?
Marsh Posté le 28-08-2011 à 22:36:43
u et w sont des alias pour les tables, ça permet de nommer les champs plus rapidement (moins de lettres à taper ) Ta requête est moins lisible que la mienne et niveaux perfs, pourrait être plus lente car tu passes par une sous-requête. L'optimiseur de mysql pourrait ne pas le voir et laisser exécuter cette sous-requête inutile...
Par contre, niveau résultat, elle devrait sortir au moins une ligne...
Marsh Posté le 28-08-2011 à 22:45:45
Merci rufo pour ça...
Finalement je me suis fait un gestionnaire de données maison. Trop compliquer à porter un SGBD, MysSQL encore, mais postgresql, bref, j'ai abandonée ma dépendance à un SGBD, peut-être reviendrais-je sur ma décision...
Marsh Posté le 29-08-2011 à 11:53:55
Pas une bonne décision à mon avis Un sgbd est bien plus performant pour gérer des données, surtout que les dévs qui ont codé mysql sont vraiment très bons
Marsh Posté le 02-08-2011 à 22:19:21
Bonjour,
J'essaye de faire un truc, je n'y arrive pas.
Avec Java en modélisation orientée objet ?
Avec C++ ?
C ?
Je me demande si un SGBD ne serait pas mieux adapter.
En effet, j'ai N "noms" d'objets et N "actions" sur chacun des N objets appartenant N "utilisateurs".
Ce que je ne parviens pas à modéliser concrètement avec le langage Ada en modélisation orientée objet
Mon besoin est de pouvoir tester si une action appartient à une classe pour un utilisateur.
Si oui
On effectue l'action sur l'objet pour l'utilisateur.
fin si;
Ada me fournit divers SGBD
Faisable... ?
S'il vous plaît !
Merci pour vos réponses.
Message édité par Profil supprimé le 02-08-2011 à 22:31:14