Cocoa et bases de données

chaps31chaps31 Membre
09:21 modifié dans API AppKit #1
Pas certains d'être où il faut avec cette question mais je ne sais pas où la mettre.

Je réalise un projet Xcode qui doit utiliser une base de données. Le programme doit ensuite être installé sur des ordis de personnes qui n'ont pas de formation informatique particulière.

J'étais parti sur PostgreSQL (MySQL est payant si on ne veut pas donner son code source et SQLite ne permets pas le multiposte), mais un doute m'étreint peut-on faire tourner sur un ordi un serveur de base de donnée SQL sans personne de qualifié ou mieux vaut-il s'orienter vers autre chose ?

Le problème est que je ne vois pas quelle autres bases de données je peux utiliser avec un projet Cocoa.

Merci de vos lumières.
«1

Réponses

  • bofybofy Membre
    09:21 modifié #2
    Bonjour

    Je pense (suis sûr) que PostgreSQL est le seul moteur de BDD relationnel valable.
    Je travaille là  dessus depuis pas mal de temps.
    J'ai une interface NKD opérationnelle, mais vieille et pas maintenue.
    En fait mon problème n'est pas tant l'interface objc-pgsql que cocoa-objc lui-même, dont les réactions semblent faites pour qu'on ne s'en serve pas, sauf dans un clan d'initiés, dont heureusement je ne fais pas partie.

    Mais je suis prêt à  continuer, d'autant plus qu'on serait plusieurs

    bien à  toi
  • wiskywisky Membre
    09:21 modifié #3
    Je comprend pas trop vos attente, vous souhaitez vous connecter à  un serveur de base de donnée où vous souhaitez intégrer le serveur de base de données dans votre logiciel ?

    Dans le premier cas, il n'est pas difficile d'utiliser un serveur de BDD distant en incluant les entête du SDK du moteur du SGDB. Dans le second cas, il est plus difficile à  réaliser et je ne l'ai jamais fait ;)

    Autre solutions, attaquer le serveur de BDD via un middleware PHP (un simple page PHP faisant les requête SQL et retournant le résultat formaté en XML)... Cette solution à  des avantages :
    - C'est le serveur qui supporte la charge de l'exécution des requêtes et la charge mémoire de la DB.
    - ça passe à  travers les PROXY et sur Internet
    - facile à  sécuriser via SSL sur Apache.
  • chaps31chaps31 Membre
    09:21 modifié #4
    Merci de vos réponses, en fait mon projet est un logiciel de gestion de clientèle donc la BDD est indispensable, elle s'adresse à  des indépendants, en premier lieu moi et en second lieu des proches (puis si tout se passe bien j'élargis).

    Le soucis que j'avais c'est qu'il faut un installeur simple et un utilisateur qui comprend le mot postgresql aussi bien que moi je comprend "hytr夝$gt"....

    Manquant d'expérience une fois le tout codé je me demande si postgre peut tourner tranquille sur l'ordi sans intervention extérieure, si oui alors j'opte pour postgres même si des soucis restent :

    A l'installation il faut modifier le fichier pg_hba.conf pour activer la sécurisation d'accès par mot de passe et pour l'instant je n'ai trouvé aucun moyen simple, pire l'accès au fichier n'est pas ouvert par défaut à  l'utilisateur mac os x, uniquement  un utilisateur postgres créé automatiquement. Bref bonne galère pour qu'au premier lancement mon appli modifie pg_hba.conf .... C'est ce genre de difficulté et la crainte du besoin impératif de maintenance sur site qui me faisait douter de postgresl...
    Mais tu semblent l'utiliser sans problème bofy . Je suppose que tu n'as pas automatisé la modification de pg_hba.conf, la librairie C libpq ne semble avoir rien prévu...

    Galère galère le développement d'appli avec base de données avec un mac...
  • schlumschlum Membre
    09:21 modifié #5
    Si tu installes le serveur avec le logiciel à  chaque fois, à  quoi sert de pouvoir gérer le multi-poste ??
    Pourquoi SQLite ne suffirait pas dans ce cas ?

    Galère galère le développement d'appli avec base de données avec un mac...
    


    Euh... Moins qu'avec Windows crois moi  :o
  • chaps31chaps31 Membre
    09:21 modifié #6
    SQLite présente 2 défauts, mais si je me trompe j'en serais heureux et je me jette dans SQLite :

    - Pas de protection de la base par mot de passe, n'importe qui peut accéder au fichier qui contient la base.

    - Les accès concurrentiels : en utilisation courante il peut y en avoir plusieurs (mais moins de 10). Plusieurs ordi reliés en réseau (d'expérience entre 1 et 5) peuvent accéder à  la même base. Si une écriture est en cours et qu'une demande d'accès pour écriture arrive si j'ai bien tout compris un verrou empêchera tout accès et le second sera rejeté... Pas terrible...

    Oui je préfèrerais SQLite, jamais le projet sera utilisé dans une grosse structure avec pléthores d'ordi en réseau et Postgres ou Mysql sont surement surdimensionnés, mais je ne vois pas de SQLite avec protection de la base contre les curieux ni un moyen de gérer plusieurs demandes d'écriture en même temps, ne serais-ce que 4... Mais peut-être que j'ai mal compris et que les demandes d'écritures sont juste mises en attente et traitées les unes après les autres, auquel cas vu le petit nombre de requête simultanées cela ne devrait pas poser problème.
  • schlumschlum Membre
    09:21 modifié #7
    http://www.hwaci.com/sw/sqlite/prosupport.html#crypto

    SQLite est une base "embedded" (embarquée) ; il n'y a pas de connexion réseau à  la base, tout est en local.
    Alors si tu veux gérer des accès réseau, il faut une interface réseau adéquate (comme gsoap...) dans laquelle tu peux effectivement mettre les requêtes en attente avec un verrou fichier.


    Donc, si le serveur n'est pas sur les postes clients, pourquoi se prendre le chou avec l'installateur ?
  • chaps31chaps31 Membre
    décembre 2008 modifié #8
    Merci je vais gratter tout ça, la dure vie de l'amateur.... au sens noble du terme  ::)


    Edit : gsoap est en GPL, et je ne veux pas dévoiler mon code source... argh
  • AliGatorAliGator Membre, Modérateur
    09:21 modifié #9
    Oui en fait je n'ai pas bien compris moi non plus si tu veux :
    - Plusieurs clients, mais une seule base de donnée (installée sur un serveur à  part) commune à  tous les clients et à  laquelle tous les clients se connectent
    - Ou plusieurs clients mais chacun ayant sa propre base de données, installée sur le même ordi donc.

    Dans le premier cas, la base de données n'est à  installer que sur une machine, ton serveur, et est commune à  tous donc oui il faut gérer les accès concurrentiels mais du coup pas besoin de l'installer avec ton soft : toi tu l'installes une fois pour toute sur ton serveur, mais ceux qui utilisent ton client et à  qui tu fournis un installeur n'ont pas à  s'en soucier, ton installeur n'ayant pas à  installer la base de données sur les clients. --> PostgreSQL

    Dans le second cas chacun a sa base de données donc oui il faut que ton installeur gère l'installation de la base de données en local sur chaque machine, mais non il n'y a pas à  gérer les accès concurrents car il n'y aura pas de notion de réseau, chacun ayant sa propre base qu'il accède de son côté sans toucher à  la base des autres. --> SQLite

    J'imagine que c'est la première solution qui t'intéresse, une base commune pour tous, donc tu n'as qu'à  l'installer sur une machine faisant office de serveur, mais pas à  installer la base chez tous les clients, non ? Ou alors j'ai loupé un truc ?
  • chaps31chaps31 Membre
    09:21 modifié #10
    Tu n'as rien loupé, vu l'aide que vous m'apportez je vais être clair : je suis vétérinaire, les logiciels de gestion de clinique vétérinaire sous mac sont peu nombreux et très cher, je veux faire le mien et en faire profiter des amis, voire le vendre si ce que je ponds donne pleine satisfaction.

    Donc une BDD (nom adresse... des clients, les animaux, les médicaments....), basée sur un ordi. S'il n'y a qu'un ordi plus de problème (SQLite), par contre il faut prévoir plusieurs ordis qui accèderont à  la base (exemple : 2 consultations, 1 accueil) et souvent en même temps, donc si j'ai bien compris : postgresql.

    Tant que c'est chez moi pas de soucis en effet je m'installe postgres sur le poste principal et ne programme que les accès à  la base dans mon projet. Mais en le passant à  d'autres (gracieusement au début mais payant par la suite selon la qualité de ma réalisation), il faut donc forcément qu'ils installent une fois le serveur postgresql (pkg tout prêt existe), je m'arrache donc actuellement les cheveux pour intégrer la configuration initiale du serveur postgresql dans mon projet en Cocoa.
    De plus il n'y aura personne pour surveiller le serveur, il faut que postgresql soit du velours (SAV par téléphone avec moi).

    Donc si j'ai bien tout compris je peux oublier SQLite, Schlum dans un autre post me proposait de résoudre le problème du multiposte mais via gsoap qui est en GPL donc pas possible pour moi, et reste le problème de la sécurisation d'accès à  la base qui n'est pas assurée avec SQLite.

    Donc point de salut sans Postgresql si je ne me trompe, j'ai cherché d'autres système de base de données, en BSD  ;)  Il n'y en a pas, et puis postgreSQL a le bon gout de fournir une bibliothèque C pour accéder à  la base de donnée, pratique pour intégrer dans de l'Objective-C
  • schlumschlum Membre
    09:21 modifié #11
    dans 1228473488:
    Edit : gsoap est en GPL, et je ne veux pas dévoiler mon code source... argh


    Non, gsoap est en multi-licence, dont une "gSOAP Public License" dérivant de la MPL1.1

    MPL est entre GPL et BSD... Si on modifie le source de gsoap, on doit rendre public ces modifications ; par contre il n'y a aucune obligation sur le code qui utilise gsoap.
  • wiskywisky Membre
    décembre 2008 modifié #12
    Travaillant déjà  avec des serveurs de base de données, voici le choix que je ferais :
    - Mon logiciel Lite inclu SQLite pour la version monoposte
    - Mon logiciel Pro avec un serveur MySQL/Postgresql et l'accès via le réseau.

    Techniquement, dans le logiciel tu créer une class gérant la connexion a la base de donnée... C'est elle qui, selon la version ira se connecter à  la base SQLite ou Postgresql et retournera le résultat. Cela permet dans ton logiciel d'envoyer toujours les mêmes requêtes (et recevoir toujours les mêmes type de réponses) et c'est la class qui "traduit" pour la base utilisé. Cela évite de gérer les deux type de base de partout dans ton programme.
    C'est un peux compliqué car il faut gérer deux type de base de donnée dans la même class.
  • pinuspinus Membre
    09:21 modifié #13
    Dans l'absolu, l'idée est sympa. Mais encore faut-il que le SQL utilisé reste simplet : je bosse depuis quelques temps sur une migration MySQL -> SQLite, et pas mal de requêtes tordues avec multiples "XXX JOIN" partent en arc-en-ciel avec SQLite...
    Donc tant que le SQL est "raisonnable", ça paraà®t faisable. Sinon, faut faire des requêtes différentes en fonction du moteur derrière.
    Pinus.
  • wiskywisky Membre
    09:21 modifié #14
    d'où la class de gestion de la connexion à  la DB. Cette class analyse les requêtes et les traduits selon le produit de destination.
    Je te l'accorde c'est assez gros comme boulot. Mais il est souvent possible de s'en tirer sans faire des requêtes avec plusieurs "JOIN"
  • chaps31chaps31 Membre
    09:21 modifié #15
    Autant tout faire en Postgresql, de toute façon avec pg_hba.conf je peux limiter les accès à  localhost. Donc autant ne pas s'encombrer de SQLite en plus non ?
  • schlumschlum Membre
    09:21 modifié #16
    Vu que c'est peu de connexions, moi j'opterais pour la solution SQLite avec un petit WebService Soap au dessus et des verrous.
    Faire tourner un serveur PostGre c'est assez lourd et contraignant sur un poste " client " qui n'est pas trop fait pour ça.
  • chaps31chaps31 Membre
    09:21 modifié #17
    Et en ce qui concerne la rapidité d'exécution entre sqllite-soap et postgresql ? car la bdd sera lourde, bcoup d'enregistrements, bcoup de colonnes.

    Je vais me renseigner sur cette fameuse "soupe"  :P
  • wiskywisky Membre
    09:21 modifié #18
    Préfère alors postgresql car il sera à  même de bien gérer une DB de plusieurs Mo...
  • schlumschlum Membre
    09:21 modifié #19
    dans 1228505941:

    Préfère alors postgresql car il sera à  même de bien gérer une DB de plusieurs Mo...


    SQLite peut gérer des bases lourdes très bien... Le facteur inconnu c'est l'encryption par contre ; jamais utilisé et je ne sais pas si ça ralentit beaucoup  :-\\
  • chaps31chaps31 Membre
    09:21 modifié #20
    Il est vrai que j'ai lu que SQLite n'a aucune protection, un fichier que n'importe qui peut ouvrir.... gênant...
  • schlumschlum Membre
    09:21 modifié #21
    J'ai mis un lien à  la page d'avant... On peut y mettre une encryption.
    http://www.hwaci.com/sw/sqlite/prosupport.html#crypto
  • pinuspinus Membre
    09:21 modifié #22
    Bonjour,

    S'agissant de SQLite, il y a un éditeur qui a développé un serveur au dessus de ce moteur. Serveur qui s'installe en un clic, et qui permet d'encrypter les fichiers de bases de données (et les communications client/serveur) :

    http://www.realsoftware.com/products/realsql/index.php

    Pas sûr que ça colle à  tes besoins, mais c'est peut-être à  voir.

    Pinus.
  • chaps31chaps31 Membre
    09:21 modifié #23
    Merci, reste à  voir le prix de ce cryptage
  • pinuspinus Membre
    09:21 modifié #24
    Le prix ne porte pas que sur le cryptage. C'est une vrai serveur de bases de données. Et il se trouve que le moteur DB utilisé est SQLite. Je viens de vérifier, c'est 400€ HT pour le serveur (connexions illimitées). C'est pas donné. Mais c'est peut-être le prix à  payer pour la simplicité de l'install du serveur et la sécurité. Mais il y a probablement d'autres solutions.
    Pinus
  • schlumschlum Membre
    09:21 modifié #25
    C'est du vol...
  • pinuspinus Membre
    09:21 modifié #26
    schlum : t'excite pas: c'est pas moi qui l'édite, ni le vends...
    (Pour mémoire, la conversation portait sur le Client/Serveur avec SQlite, et la protection des données.) C'est donc une des options possibles. Et comme je l'ai dit: c'est pas donné.
    Pinus
  • schlumschlum Membre
    décembre 2008 modifié #27
    dans 1228610891:

    schlum : t'excite pas: c'est pas moi qui l'édite, ni le vends...
    (Pour mémoire, la conversation portait sur le Client/Serveur avec SQlite, et la protection des données.) C'est donc une des options possibles. Et comme je l'ai dit: c'est pas donné.
    Pinus


    Je ne m'excite pas, je dis clairement ce que c'est c'est tout  :)
    La protection de données est déjà  faite en option dans SQLite, et mettre un serveur au dessus de tout ça, ça se fait en 1h avec gSOAP  :P

    En plus, c'est fait pour travailler avec RealBasic  ;)
  • pinuspinus Membre
    09:21 modifié #28
    Je ne connais pas REALbasic, mais dans l'archive que tu récupères sur leur site, il y a un SDK C assez bien foutu. Donc rien ne t'oblige à  l'utiliser avec REALbasic...

    Ton truc avec gSOAP, ça donne quoi niveau :

    - écritures concurrentielles (car c'est bien gentil de mettre un serveur en 1 heure au dessus de SQLite mais si lorsqu'un client écrit, il vérouille toute la base, ton serveur db n'aura de serveur que le nom...)

    - Perfs ? SOAP est verbeux et limaceux...

    Perso je suis un supporter de PostgreSQL, mais il faut admettre que dans le cadre d'un déploiement auprès de non-professionnels de l'informatique, ça peut (parfois) être délicat...

    Pinus.


  • schlumschlum Membre
    09:21 modifié #29
    dans 1228643367:
    - écritures concurrentielles (car c'est bien gentil de mettre un serveur en 1 heure au dessus de SQLite mais si lorsqu'un client écrit, il vérouille toute la base, ton serveur db n'aura de serveur que le nom...)


    C'est de toute manière le fonctionnement de SQLite quelque soit la technique utilisée au dessus... À moins que le serveur ne groupe lui même les requêtes ce qui serait dangereux car pourrait bloquer un SELECT.
    Vu que les requêtes se comptent en millisecondes, ça ne se voit pas au niveau de quelques utilisateurs.

    - Perfs ? SOAP est verbeux et limaceux...


    ... et largement suffisant pour ce genre de logiciels  ;)
  • chaps31chaps31 Membre
    09:21 modifié #30
    dans 1228645509:

    Vu que les requêtes se comptent en millisecondes, ça ne se voit pas au niveau de quelques utilisateurs.
    ... et largement suffisant pour ce genre de logiciels  ;)


    C'est certains qu'avec des requêtes en quelques millisecondes et moins de 10 utilisateurs ça ne doit pas se voir. Tout ça me permettrais de garder une option sur SQLite s'il n'y avait leproblème du cryptage, si à  chaque install il faut payer 400 euros pour un soft gratuit ou vendu moins cher... ça ne tiens pas mais merci de l'info.
  • schlumschlum Membre
    décembre 2008 modifié #31
    Ah oui, effectivement, j'avais pas vu que l'encryption était une extension payante pour SQLite...   :o
Connectez-vous ou Inscrivez-vous pour répondre.