CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[Python] Gestion d'inventaire JSON

jyjuki
jyjuki
Niveau 8
01 mai 2021 à 23:50:38

Bonjour à tous,

je suis en train de développer un logiciel en Python permettant de gérer un inventaire et je bloque sur quelques choix techniques.

Les choses à savoir :

- J'ai une base de données de tous les produits existants au format JSON stockée sur un serveur distant, cette base de donnée peut être mise à jour en fonction de nouveaux produits arrivant sur le marché ou alors des corrections mineures sur les informations des produits existants.
- Le logiciel peut télécharger ce fichier JSON pour le stocker en local et vérifier si le fichier stocké en local est à jour. Le fichier local ne peux pas être modifié par l'utilisateur.
- Le logiciel permet à l'utilisateur d'ajouter ou retirer de son inventaire des produits (décrits dans la base de donnée).

Mon problème est le suivant : je veux que l'inventaire de mon utilisateur soit une liste de produits que je stockerai en JSON dans un autre fichier mais j'aimerai éviter d'avoir une redondance de donnée entre mon inventaire et ma base de données.
En d'autres termes, j'aimerai que mon inventaire ne soit qu'une liste de "références" vers des objets JSON de ma base de donnée et non une liste d'objets JSON qui seraient copiés depuis la base de donnée pour éviter des inconsistances entre les objets de mon inventaire et ceux de ma base de données après une mise à jour de celle-ci.

Existe-t-il une librairie ou un moyen de référencer un objet JSON dans un autre fichier JSON ?
Je pensais passer par une librairie de gestion de base de donnée comme TinyDB, pensez vous que je puisse arriver à mes fins avec un tel outil, ou m'en suggéreriez vous un autre ?

Merci de vos réponses

Mouig
Mouig
Niveau 6
02 mai 2021 à 00:58:31

Tu tiens vraiment à utiliser une base de données en json ?

Perso j'aurais utilisé une base de données relationelle (comme SQLite par exemple que est simple a utiliser avec python). Tu pourrais avoir une table qui référence tout les produits disponible et une deuzième table pour stocker l'inventaire de l'utilisateur (en utilisant des clés étrangères pour pointer vers ta première table)

Après peut être que tu as des contraintes qui t'obliges à utiliser json. Dans ce cas je saurais pas t'aider.

Message édité le 02 mai 2021 à 00:59:41 par Mouig
godrik
godrik
Niveau 30
02 mai 2021 à 01:14:38

Ton format JSON a un identifiant unique?

jyjuki
jyjuki
Niveau 8
02 mai 2021 à 13:03:54

Merci pour vos réponses.
Rien ne m'oblige à utiliser JSON comme format de stockage, mais c'est dans ce format que je reçoit mes données. Donc je peux convertir ce JSON dans un autre format de base de donnée ça peut m'apporter des comportements dont j'ai besoin.

Mes objets JSON ont un id que je suppose unique mais puisque je n'ai pas le contrôle sur ces données, j'ai peur que ces ids changent au cours d'une mise à jour (c'est déjà arrivé même si ça devrait être très rare).

wouh_pinaise_
wouh_pinaise_
Niveau 6
02 mai 2021 à 15:04:34

Quelle est ta base de données distante ?
Possibilité de l’interroger au travers une api par exemple ?
Tu as la nécessité d'avoir un inventaire stocké localement (consulter l'inventaire hors connexion) ?

Car pour moi, tu n'as pas besoin de stocker une quelconque information localement, il suffit d’interroger la base de données lorsque cela est nécessaire.
Par exemple l'utilisateur lance l'application, un appel est effectué pour récupérer les 10 premiers produits.
Il demande les 10 suivants --> nouvel appel à l'api pour les récupérer.
Idem si tu souhaites mettre en place une recherche par catégorie par exemple.

Si l'utilisateur laisse l'application lancée 2h et qu'entre temps une modification a été effectuée, il peut être nécessaire de rafraîchir le contenu affiché par des appels réguliers ou en utilisant un mécanisme de socket. A chaque modification de la base, les applications ouvertes seraient notifiées du fait qu'un produit a été mis à jour et qu'une mise à jour est donc potentiellement nécessaire (beaucoup plus lourd à mettre en place).

wouh_pinaise_
wouh_pinaise_
Niveau 6
02 mai 2021 à 15:15:07

J'ai loupé une ligne :hap:

- Le logiciel permet à l'utilisateur d'ajouter ou retirer de son inventaire des produits (décrits dans la base de donnée).

Pour moi ça devrait être stocké dans la même base de données qui contient les produits et pas localement (sauf si tu n'as pas les droits en écriture sur cette base).

jyjuki
jyjuki
Niveau 8
02 mai 2021 à 15:53:46

Merci pour ta réponse :)

Ma base de données est un mélange entre les données récupérées à partir d'une API donnant des infos sur les produits et des métriques que j'ai calculées avec des algos lourds (traitement d'image notamment).

Pour que vous ayez plus de recul sur mon appli, voici plus d'info : c'est une appli qui à partir d'une image acquise avec une caméra va essayer de reconnaitre le produit et l'ajouter à un inventaire que l'utilisateur pourra gérer. L'algo est fonctionnel mais nécessite de comparer les métriques calculées sur l'image d'entrée avec les métriques stockées pour chaque produit dans la base de donnée pour savoir de quel produit l'objet pris en photo est le plus proche (en gros calculer une distance entre les métriques de mon objet pris en photo et celle de tous les produits).

Puisque la reconnaissance de l'objet passe par la comparaison avec tous les autres produits (ou un sous-ensemble mais qui serait conséquent), j'aurai quasiment à retélécharger la base de donnée à chaque fois (ou en tout cas faire une requête pour chaque produit). C'est pour ça que je préfère l'avoir en local et la mettre à jour quand celle sur le serveur a été mise à jour (par l'ajout de nouveaux produits notamment).

De plus, il peut y avoir plusieurs utilisateurs qui utilisent le logiciel mais qui ne partagent pas le même inventaire et qui se foutent de l'inventaire du voisin. C'est pour cela que je ne peux pas intégrer l'inventaire dans la base de données.

wouh_pinaise_
wouh_pinaise_
Niveau 6
02 mai 2021 à 18:51:06

J'ai pas encore tout compris. :hap:
Ton application sera utilisée dans un intranet ou utilisable par internet ?
Car en général ce n'est pas conseillé qu'une base de données soit accessible directement depuis l'extérieur.

Puisque la reconnaissance de l'objet passe par la comparaison avec tous les autres produits (ou un sous-ensemble mais qui serait conséquent), j'aurai quasiment à retélécharger la base de donnée à chaque fois (ou en tout cas faire une requête pour chaque produit). C'est pour ça que je préfère l'avoir en local et la mettre à jour quand celle sur le serveur a été mise à jour (par l'ajout de nouveaux produits notamment).

La reconnaissance doit être effectuée côté client ?
Car tu pourrais la faire au moment où tu ajoutes / édites un produit. Ca éviterait de le faire sur chaque poste utilisateur (si j'ai bien compris ce que tu as expliqué).

De plus, il peut y avoir plusieurs utilisateurs qui utilisent le logiciel mais qui ne partagent pas le même inventaire et qui se foutent de l'inventaire du voisin. C'est pour cela que je ne peux pas intégrer l'inventaire dans la base de données.

Les utilisateurs ne sont pas authentifiés ? Car on pourrait imaginer que tu stockes en base, si tu est sur du nosql clé valeur par ex, l'id utilisateur + la liste des ids de produits (mais il faudrait que tes produits aient des ids uniques).
Et sinon tu pourrais ne stocker que les ids localement, soit dans du tinydb ou du sqlLite comme mentionné ci-dessus (mais encore une fois, il faudrait que tes produits aient des ids).

Mon avis (c'est comme ça que je l'aurais fait, pas forcément la meilleure solution) est que pour mener à bien ton projet, tu dois mettre en place un backend qui fait tout le traitement lors de l'ajout / édition de produit et qui mette à disposition des apis rest pour les récupérer.
Ton application cliente ne ferait que de la récupération de données sans réel traitement (à part la sauvegarde de l'inventaire en local ou dans la base).
Tu ne ferais ainsi les traitements que lorsque c'est nécessaire.
Et si tu veux du temps réel (mettre à jour l'interface client) : lorsque tu insères / édites les données, tu peux envoyer une notification a toutes les applications connectées à ton backend via socket.io https://python-socketio.readthedocs.io/en/latest/intro.html pour leur notifier de récupérer une nouvelle version des données affichées.

jyjuki
jyjuki
Niveau 8
02 mai 2021 à 22:18:34

Le 02 mai 2021 à 18:51:06 :
J'ai pas encore tout compris. :hap:
Ton application sera utilisée dans un intranet ou utilisable par internet ?
Car en général ce n'est pas conseillé qu'une base de données soit accessible directement depuis l'extérieur.

L'appli serait utilisable par n'importe qui. La base de donnée des produits n'est pas une donnée sensible de mon point de vue mais si je peux éviter qu'elle soit accessible, ce serait un plus. Je pensais dans le pire des cas la chiffrer avant envoi au client et permettre au client de la déchiffrer.

La reconnaissance doit être effectuée côté client ?
Car tu pourrais la faire au moment où tu ajoutes / édites un produit. Ca éviterait de le faire sur chaque poste utilisateur (si j'ai bien compris ce que tu as expliqué).

C'est pas tout à fait ça. Ma base de donnée contient déjà les métriques que j'ai calculé par avance pour tous les produits de la base de données. Il faut juste que je calcule ces métriques pour l'objet présent dans la photo de l'utilisateur (ce qui n'est pas hyper long si on ne le fais que sur une image) pour les comparer avec celles précalculées dans la base.
Et je préfèrerai que ce calcul soit faite coté client pour éviter d'avoir à envoyer la photo au serveur et récupérer les résultats.

Les utilisateurs ne sont pas authentifiés ? Car on pourrait imaginer que tu stockes en base, si tu est sur du nosql clé valeur par ex, l'id utilisateur + la liste des ids de produits (mais il faudrait que tes produits aient des ids uniques).
Et sinon tu pourrais ne stocker que les ids localement, soit dans du tinydb ou du sqlLite comme mentionné ci-dessus (mais encore une fois, il faudrait que tes produits aient des ids).

Les utilisateurs ne sont pas authentifiés mais je suis en train d'y songer pour pouvoir stocker leur inventaire sur le serveur. Ca aurait plusieurs avantages, notamment le fait de pouvoir faire du contrôle d'erreur des inventaires lors de la mise à jour de la base de données (si un changement dans la base de donnée venait à être gênant, typiquement, un id qui change).

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Programmation
  • Création de sites web
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment