DOMANDA Programma gestionale di una biblioteca: come realizzarlo?

Hero467

Utente Attivo
186
13
OS
Ubuntu 22.04 LTS
Salve a tutti,
più per studio personale che per altro ho deciso di provare a realizzare un semplice gestionale per una biblioteca, che deve soddisfare i seguenti requisiti:
  • Deve permettere di aggiungere nuovi libri che avranno i seguenti parametri: Titolo, Genere, Autore, Argomento (sotto forma di una o più parole chiave), Codice identificativo (che verrà generato da un programma) e eventuale codice ISBN
  • Deve ovviamente permettere di navigare tra i vari libri, sia in forma di elenco, sia con la possibilità di cercarli per uno dei parametri (devo ancora decidere se fare tutto attraverso un’unica barra di ricerca oppure creare un menu apposito con una voce da compilare per ogni parametro)
  • Deve permettere di aggiungere nuovi prestiti effettuati, con i seguenti parametri: Nome, Cognome, Data del prestito, data della restituzione. In caso di restituzione non effettuata dopo 30 giorni il programma dovrebbe segnalare il problema alla prima apertura dello stesso dopo il riconoscimento del disguido.
  • Deve permettere di navigare tra i vari prestiti, come per i libri, sia per elenco che per parametri.
Chiarisco subito che il programma nasce come uno studio, non ho nessuna ambizione a metterlo in commercio se non una volta perfezionata questa idea, e in caso lo farò solo per una scuola che ho vicino a casa, quindi non necessito strumenti premium per la sua realizzazione, per esempio database come MySQL, che è gratuito, vanno più che bene.

Come linguaggio di programmazione stavo pensando a Python, che è (al momento) il mio linguaggio principale.
Quanto all’interfaccia grafica essendo con Python opterei per TkInter, il quale (mi hanno detto in un’altro forum) si può interfacciare con CSS, creando così una GUI più gradevole all’occhio di quella predefinita della libreria.

Un amico mi ha consigliato di realizzarlo come un sito web, che però sarebbe di più difficile realizzazione, e avrebbe i costi dell’hosting da sostenere, quindi, almeno per il momento, scarterei questa idea.

In un più lontano futuro, nel caso veda che nella piccola distribuzione il programma piaccia e se riesco a trovare del tempo in più, potrei pensare di ampliarlo, rendendolo un programma professionale e aggiungendogli funzioni.


Questo è tutto, volevo un parere sull’idea e sulla sua realizzazione, e ovviamente consigli e segnalazioni su eventuali idee e errori nella bozza del progetto.
Poi ho domande come:
  • Il linguaggio è quello giusto?
  • Ciò che mi hanno detto le altre persone è corretto?
  • Necessito di altri componenti per la realizzazione di questo programma? O magari ne ho sbagliati alcuni?
Grazie per l’impegno di aver letto questo post e, nel caso, di avermi risposto.
Mi scuso per il papiro che ho scritto, ma mi piacerebbe avere un parere da chi ne sa più di me e ha esperienza nel settore, ed è anche un modo per organizzare le idee.
 

Andretti60

Utente Èlite
5,792
4,384
Prima di tutto, quali sono le tue conoscenze di Python e di database?
I tuoi amici sono corretti, la soluzione ideale sarebbe un database relazionale distribuito (MySQL va bene) con una interfaccia web, in modo che possa essere raggiunto da tutti con un semplice browser. Ma questo ovviamente è complicato (concordo che il termine “complicato” è poi sempre relativo alle proprie conoscenze)
Ma in fondo il “core” del sistema rimane il database, ossia come implementare le tavole e gli indici, se quello non è ben fatto le prestazioni finali saranno inaccettabili. Per progettare e testare un database non hai neanche bisogno di installarne uno, ti basta usare SQLite (un database relazionale personale che supporta SQL) interfacciato a Python. Sono molto semplici da imparare, completamente gratuiti, sono supportati su tutti i sistemi operativi e permettono uno sviluppo RAD (Rapid Application Development). Una volta che il progetto del database è solido potrai poi migrarlo su database “serio”, e cambiare l’interfaccia grafica, ossia potrai fare lo sviluppo in piccoli passi.
 

Hero467

Utente Attivo
186
13
OS
Ubuntu 22.04 LTS
Grazie per la risposta.
Python sono messo decentemente, esaminando rapidamente il programma a livello logico non ci dovrebbe essere niente che non sappia fare. Database sono preso male, non conosco niente. Però mi sono messo a studiare SQL, proprio per questo progetto e perché so che in futuro non potrò fare quasi nulla senza database.
Quanto all’interfaccia web sarebbe bello, e sicuramente più efficiente, ma essendo che è solo uno studio mio o al massimo sarebbe una distribuzione limitatissima mi sembra un po’ uno spreco di risorse, senza contare che avrebbe un numero maggiore di tecnologie da utilizzare
 

Andretti60

Utente Èlite
5,792
4,384
Sei sulla strada buona, stai capendo le priorità del progetto.
Ti dico subito che progettare un database è estremamente difficile, ho letto un articolo di un esperto del settore che lavora come consulente per grandi aziende, da decenni. Ha detto che solo il 25% di quello che vede è fatto bene, la metà è mediocre, il resto fa schifo.

Io non sono un esperto, non ti so consigliare libri di testo ma hai bisogno di studiarne uno, devi assolutamente farti le basi sui concetti dei database, sapere un po’ di come funzionano internamente (sapere cosa siano e come funzionino architettura b-tree e chiavi di indicizzazione) aiuta poi a ottimizzarlo, ma prima di tutto devi farti un po’ le ossa su come si costruiscano le tabelle, come si popolano e come si leggono, per questo ho suggerito sqlite. È lo strumento ottimale per imparare. Con SQLite puoi cominciare e scrivere un po’ di SQL, ti consiglio di usare un sql manager, ti basta un modello base, anche quelli sono gratuiti, alla fine avrai una idea di come funzioni il tutto, incluse le difficoltà e problemi che tale processo implica.

Lascia stare al momento concetti come “database deployment” (scusa non so l’italiano), web services, web interface, che sono anche loro difficili per se, ma come ho detto prima quelli si possono cambiare e migliorare poi in futuro, un database no, se non è progettato bene in partenza si va ben poco lontano. Proprio in questi giorni sto lavorando su un progetto cercando di capire perché non funziona, basato su un database progettato una ventina di anni fa. Se il problema è interno, saranno dolori.

Non esitare a fare altre domande, saremmo più che felici di risponderti.
Magari qui qualcuno ti sa consigliare qualche buon testo, io studiai queste cose troppi anni fa, non ho più nemmeno più i testi che ho usato, adesso per lavoro uso solo i “reference” che trovo online, che è poi tutto quello che ti serve una volta che hai i concetti chiave.
 

BAT

Moderatore
Staff Forum
Utente Èlite
11,915
5,327
CPU
Neurone solitario
Dissipatore
Ventaglio azionato a mano
Scheda Madre
Casalinga
RAM
Molto molto volatile
GPU
Binoculare integrata nel cranio
PSU
Pastasciutta, pollo e patatine al forno
Net
Segnali di fumo e/o tamburi
OS
Windows 10000 BUG
Database sono preso male, non conosco niente
però è esattamente quello che ti serve: se progetti e realizzi bene il database, le gui con cui gestirlo le puoi fare col linguaggio che vuoi, quindi se vuoi un'applicazione desktop il DB lo interroghi dalle finestre della gui, se vuoi un'applicazione che funziona online, lo interrogherai lato server e restituirai i risultati in HTML
sta di fatto che lo devi realizzare bene
 

Hero467

Utente Attivo
186
13
OS
Ubuntu 22.04 LTS
Sei sulla strada buona, stai capendo le priorità del progetto.
Ti dico subito che progettare un database è estremamente difficile, ho letto un articolo di un esperto del settore che lavora come consulente per grandi aziende, da decenni. Ha detto che solo il 25% di quello che vede è fatto bene, la metà è mediocre, il resto fa schifo.

Io non sono un esperto, non ti so consigliare libri di testo ma hai bisogno di studiarne uno, devi assolutamente farti le basi sui concetti dei database, sapere un po’ di come funzionano internamente (sapere cosa siano e come funzionino architettura b-tree e chiavi di indicizzazione) aiuta poi a ottimizzarlo, ma prima di tutto devi farti un po’ le ossa su come si costruiscano le tabelle, come si popolano e come si leggono, per questo ho suggerito sqlite. È lo strumento ottimale per imparare. Con SQLite puoi cominciare e scrivere un po’ di SQL, ti consiglio di usare un sql manager, ti basta un modello base, anche quelli sono gratuiti, alla fine avrai una idea di come funzioni il tutto, incluse le difficoltà e problemi che tale processo implica.

Lascia stare al momento concetti come “database deployment” (scusa non so l’italiano), web services, web interface, che sono anche loro difficili per se, ma come ho detto prima quelli si possono cambiare e migliorare poi in futuro, un database no, se non è progettato bene in partenza si va ben poco lontano. Proprio in questi giorni sto lavorando su un progetto cercando di capire perché non funziona, basato su un database progettato una ventina di anni fa. Se il problema è interno, saranno dolori.

Non esitare a fare altre domande, saremmo più che felici di risponderti.
Magari qui qualcuno ti sa consigliare qualche buon testo, io studiai queste cose troppi anni fa, non ho più nemmeno più i testi che ho usato, adesso per lavoro uso solo i “reference” che trovo online, che è poi tutto quello che ti serve una volta che hai i concetti chiave.
Grazie mille, ci lavorerò sicuramente.

Una domanda la ho: essendo che Python è originariamente un linguaggio interpretato, se compilo un programma con pyinstaller, non c’è il rischio che diventi più lento di un file compilato da un altro linguaggio?
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
1,558
1,201
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
Grazie mille, ci lavorerò sicuramente.

Una domanda la ho: essendo che Python è originariamente un linguaggio interpretato, se compilo un programma con pyinstaller, non c’è il rischio che diventi più lento di un file compilato da un altro linguaggio?

Sarà sicuramente più lento, con Pyinstaller l'interprete è incluso nell'exe che distribuisci, per questo non serve averlo sulla macchina che lo esegue. Non mi sembra trasformi tutto in codice per l'architettura target, ma puoi dare un occhio alla doc.

Per il tipo di applicazione comunque potrebbe non vedersi molto la differenza.
 
  • Mi piace
Reazioni: Andretti60

Hero467

Utente Attivo
186
13
OS
Ubuntu 22.04 LTS
Perfetto, grazie.

Posso continuare a postare in questo thread i miei dubbi su questo piccolo progetto?

Man mano che lo svilupperò intendo
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
1,558
1,201
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
Certo, se l'argomento è il medesimo scrivi pure qui.
 
  • Mi piace
Reazioni: Andretti60

Andretti60

Utente Èlite
5,792
4,384
Python è straziantemente lento, perché è un linguaggio compilato interpretato creato per scrivere script e non applicazioni dove l’efficienza sia una priorità. Nel tuo caso ci sono buoni motivi per usare python
  • Stai studiando e sperimentando, per il momento la velocità non è un problema
  • conosci già Python quindi non devi Perdere tempo imparare un nuovo linguaggio di programmazione (eventualmente dovrai)
  • Nel tuo caso le prestazioni finali del programma dipenderanno solo dal database, per il quale l’applicazione (in Python) è solo una interfaccia.
Edit: grazie @BAT
 
Ultima modifica:

BAT

Moderatore
Staff Forum
Utente Èlite
11,915
5,327
CPU
Neurone solitario
Dissipatore
Ventaglio azionato a mano
Scheda Madre
Casalinga
RAM
Molto molto volatile
GPU
Binoculare integrata nel cranio
PSU
Pastasciutta, pollo e patatine al forno
Net
Segnali di fumo e/o tamburi
OS
Windows 10000 BUG
  • Triste
Reazioni: Andretti60

Andretti60

Utente Èlite
5,792
4,384
interpretato volevi dire 😅 (oppure NON compilato...)
Ecco cosa succede a scrivere alle sei del mattino prima che il caffè (che è poi la principale fonte di energia di noi tecnici) sia entrato in circolo; vado per la mia seconda tazza adesso. Grazie, corretto.
 

BAT

Moderatore
Staff Forum
Utente Èlite
11,915
5,327
CPU
Neurone solitario
Dissipatore
Ventaglio azionato a mano
Scheda Madre
Casalinga
RAM
Molto molto volatile
GPU
Binoculare integrata nel cranio
PSU
Pastasciutta, pollo e patatine al forno
Net
Segnali di fumo e/o tamburi
OS
Windows 10000 BUG
  • Mi piace
Reazioni: Andretti60

Hero467

Utente Attivo
186
13
OS
Ubuntu 22.04 LTS
Python è straziantemente lento, perché è un linguaggio compilato interpretato creato per scrivere script e non applicazioni dove l’efficienza sia una priorità. Nel tuo caso ci sono buoni motivi per usare python
  • Stai studiando e sperimentando, per il momento la velocità non è un problema
  • conosci già Python quindi non devi Perdere tempo imparare un nuovo linguaggio di programmazione (eventualmente dovrai)
  • Nel tuo caso le prestazioni finali del programma dipenderanno solo dal database, per il quale l’applicazione (in Python) è solo una interfaccia.
Edit: grazie @BAT
Quindi in caso avessi intenzione di metterlo in commercio in futuro mi toccherebbe riscrivere tutto da capo con un altro linguaggio, giusto?
Post unito automaticamente:

Mi sto mettendo ora a imparare SQL, applicando direttamente ciò che imparo al progetto, e mi sorge un dubbio:
è meglio creare una tabella con tutti i prestiti di tutti i libri per poi collegare ogni voce dei prestiti al relativo libro o è meglio creare una tabella dei prestiti diversa per ogni libro sempre da collegare al relativo libro nella tabella dei libri? Scusate per le ripetizioni
 
Ultima modifica:

DispatchCode

Moderatore
Staff Forum
Utente Èlite
1,558
1,201
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
Quindi in caso avessi intenzione di metterlo in commercio in futuro mi toccherebbe riscrivere tutto da capo con un altro linguaggio, giusto?
Post unito automaticamente:

Mi sto mettendo ora a imparare SQL, applicando direttamente ciò che imparo al progetto, e mi sorge un dubbio:
è meglio creare una tabella con tutti i prestiti di tutti i libri per poi collegare ogni voce dei prestiti al relativo libro o è meglio creare una tabella dei prestiti diversa per ogni libro sempre da collegare al relativo libro nella tabella dei libri? Scusate per le ripetizioni

La velocità è relativa, non è tutto. Innanzitutto sono gli algoritmi da ottimizzare.
Poi, per dire, immagina di avere il software in rete: se le query sono ottimizzate ma le immagini delle copertine dei libri pesano 3MB l'una, puoi usare Python o C++, ma non avrai differenze, in quanto il problema è dettato da altro.

Tra un software desktop e uno via web (quindi su un server) ti consiglierei la seconda. Al di là di ottimizzazioni, facilità di distribuzione etc avresti un problema non trascurabile, a mio avviso: il fatto che potrà essere crackato.

Per risponderti nel merito di MySQL: la cosa corretta è avere una tabella dei prestiti, dove associ il libro e la persona a cui l'hai prestato; quindi avrai quelle che si chiamano chiavi esterne. Saranno due colonne tipo id_utente e id_libro.
Ovviamente dovrai considerare anche il numero di libri che hai a disposizione, nel senso che puoi prestare a due persone diverse il medesimo libro (insomma, se ci sono 10 copie, in teoria puoi prestarne 10, MA ad esempio solo a persone diverse).
 
  • Mi piace
Reazioni: Andretti60

Entra

oppure Accedi utilizzando