Gestione database per food (tipo justeat)

willano

Nuovo Utente
80
3
Ciao ragazzi, ho bisogno del vostro aiuto.
Ho un database in cui ho delle categorie e dei prodotti (ogni prodotto appartiene ad una categoria).
Ora vorrei inserire la possibilità di assemblare un prodotto e vorrei che per una determinata categoria ci sia un prodotto di default un prezzo fisso e poi per ogni ingrediente aggiunto ho dei prezzi miei.
Come posso fare?

Ad esempio, io ho le categorie panini, piadine, insalate in cui ho già dei prodotti composti da me.
Quello che voglio fare è avere una categoria componibile per panini, piadine e insalate in cui ho un prezzo di base fisso, e poi aggiungo degli ingredienti io

La struttura del DB è la seguente:
CATEGORIA(id, nome, tipo) il tipo può essere bar o ristorante
PRODOTTO(id,idCategoria,nome, descrizione, prezzo, quantità) la descrizione in questo caso sarebbero gli ingredienti del prodotto (visto che è composto da me)
ORDINE(id, orario, info)
CARRELLO(id, idOrdine, idProdotto, quantità) il carrello contiene la lista di prodotti aggiunti associati ad un ordine

Per realizzare quello che voglio, devo cambiare la struttura del DB o va bene così?
Attualmente mi funziona già tutto correttamente però vorrei aggiungere questa funzionalità sperando di non dover cambiare la struttura.

Io ho pensato di creare una tabella a parte "categoria-speciale" e li ci salvo le categorie componibili. Poi mi creo gli ingredienti e associo un prodotto di default a quella categoria.

SUGGERIMENTI?
 
Ultima modifica:

DispatchCode

Utente Attivo
1,168
771
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
HDD
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
GPU
Nvidia Geforce GTX 960M, 4GB
Audio
Realtek
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
Domanda: tu dici "la descrizione in questo caso sarebbero gli ingredienti del prodotto".
Quindi hai gestito gli ingredienti come TEXT/VARCHAR? Perchè in tal caso non mi sembra un buon modo per gestirli, e per svariati motivi.
Ad esempio, se dovessi cercare tutti i prodotti che usano solo farina di tipo integrale, che fai? Secondo me gli ingrendienti vanno gestiti con una tabella separata, e poi associ l'ID del prodotto agli ID ingredienti (1 a molti).
Se non usi una stringa, allora come non detto.

Ah piccola nota: ti conviene tenere separata l'IVA del prodotto, ed avere il prezzo senza IVA e quello con IVA (che ora è al 22, ma chissà...). Puoi farti semplicemente anche Prezzo senza iva, e campo con la percentuale di IVA; se vuoi puoi avere il campo "totale" dove applichi già direttamente l'IVA facendo il calcolo.

Non so se ho capito bene il tuo quesito: tu faresti una tabella che associ l'ID della categoria con l'ID del prodotto, e poi gli ingredienti sono appunto "componibili".. è corretto? Dipende anche da quanto dicevo qui sopra, da come stai trattando gli ingredienti.


PS. ma non ti conveniva associare già un prodotto ad una categoria anche? Non vedo la chiave esterna nel prodotto. Non hanno categorie?
 

willano

Nuovo Utente
80
3
Domanda: tu dici "la descrizione in questo caso sarebbero gli ingredienti del prodotto".
Quindi hai gestito gli ingredienti come TEXT/VARCHAR? Perchè in tal caso non mi sembra un buon modo per gestirli, e per svariati motivi.
Ad esempio, se dovessi cercare tutti i prodotti che usano solo farina di tipo integrale, che fai? Secondo me gli ingrendienti vanno gestiti con una tabella separata, e poi associ l'ID del prodotto agli ID ingredienti (1 a molti).
Se non usi una stringa, allora come non detto.

Ah piccola nota: ti conviene tenere separata l'IVA del prodotto, ed avere il prezzo senza IVA e quello con IVA (che ora è al 22, ma chissà...). Puoi farti semplicemente anche Prezzo senza iva, e campo con la percentuale di IVA; se vuoi puoi avere il campo "totale" dove applichi già direttamente l'IVA facendo il calcolo.

Non so se ho capito bene il tuo quesito: tu faresti una tabella che associ l'ID della categoria con l'ID del prodotto, e poi gli ingredienti sono appunto "componibili".. è corretto? Dipende anche da quanto dicevo qui sopra, da come stai trattando gli ingredienti.


PS. ma non ti conveniva associare già un prodotto ad una categoria anche? Non vedo la chiave esterna nel prodotto. Non hanno categorie?
Si, la descrizione contiene la descrizione del prodotto. Esempio: Panino Milanese: cotoletta-insalata ecc (l'hanno voluto così).

Si, un prodotto è associato già ad una categoria (ho dimenticato di mettere l'idCategoria).

Quindi ora si viene a creare questo problema di avere la possibilità di comporre un prodotto (me l'hanno chiesta dopo che già avevo realizzato il DB).
Dovrei avere per la categoria, per esempio, "CREA PANINO" un ingrediente di default con un prezzo fisso e poi ogni ingrediente che aggiunge ha un suo costo. E devo limitare la possibilità di aggiungere 1 o più volte un ingrediente.

Suppongo che ovviamente dovrei cambiare la struttura del DB, ma ho pensato di fare in questo modo.
Mi creo a parte una tabella ingredienti e una tabella prodotto_componibile.
Poi trasformo questo prodotto componibile in un prodotto (soluzione barbara) e dovrebbe fuznionare
 

DispatchCode

Utente Attivo
1,168
771
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
HDD
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
GPU
Nvidia Geforce GTX 960M, 4GB
Audio
Realtek
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
Che contenga la descrizione del prodotto è corretto, poichè anche la colonna lascerebbe desumere quello; se contiene gli ingredienti invece è errato.

Ok per l'id categoria nel prodotto.

Secondo me dovresti già gestire i tuoi prodotti con degli ingredienti "separati" e associarli con una "1 a molti"; così facendo non avresti nemmeno (avuto) problemi con la variazione richiesta.
E qui si, in una situazione come questa serve un vincolo come quello dici: l'id del prodotto non può essere associato 2 volte allo stesso ID ingrediente (è un vincolo che puoi mettere a db).

In teoria quindi si, secondo me dovresti cambiarla.

Secondo me rischi di complicarti la vita all'aumentare dei dati (e con nuove richieste). E appunto, se ti chiedono di fare ricerche o statistiche o altro, come fai se ti ritrovi con alcuni prodotti con ingredienti (separati, esterni) ed altri che invece sono parte di un campo testuale?
Oltretutto in questo modo puoi anche stabilire facilmente se un prodotto può essere componibile, oppure se è "fisso" (ti basterebbe un attributo sul prodotto ad esempio).

Se proprio non puoi/vuoi cambiarla... allora puoi seguire la strada che hai indicato. In quel caso tutti i prodotti che hanno come ID quello della categoria "crea panino" saranno personalizzabili ed avranno ingredienti associati. Secondo me ti conviene associarli esternamente e non usarla il "prodotto componibile" in maniera temporanea (ovvero per trasformarlo in prodotto). Questo perchè... se volessero aggiungere altri prodotti in futuro? Se lo trasformi "in prodotto", e segui la logica che usi nel caso di un prodotto normale, non riusciresti più a permetterne la composizione.

Ps.
Se non ho afferrato qualcosa dimmi, ti sto rispondendo tra una "pausa" e l'altra. :)
 

willano

Nuovo Utente
80
3
Se proprio non puoi/vuoi cambiarla... allora puoi seguire la strada che hai indicato. In quel caso tutti i prodotti che hanno come ID quello della categoria "crea panino" saranno personalizzabili ed avranno ingredienti associati. Secondo me ti conviene associarli esternamente e non usarla il "prodotto componibile" in maniera temporanea (ovvero per trasformarlo in prodotto). Questo perchè... se volessero aggiungere altri prodotti in futuro? Se lo trasformi "in prodotto", e segui la logica che usi nel caso di un prodotto normale, non riusciresti più a permetterne la composizione.
Ti spiego come vorrei fare:
attualmente ho questa tabella prodotto(idProdotto, idCategoria, nome, descrizione, prezzo, giacenza)
Nella descrizione c'è la descrizione del prodotto (ovvero da cosa è composto)

Ora io ho necessità di aggiungere la funzionalità "crea prodotto". Allora ho pensato di fare così.
Creo la tabella ingredienti(id, nome, prezzo)
Faccio creare una nuova categoria "crea panino" (magari facendo scegliere la categoria di base che ha e che vuole comporre, in modo tale che se sceglie "panino" io creo la categoria "crea panino".
Poi mi credo la tabella per stabilire quali ingredienti mostrare in una categoria componiIngredienti(idIngrediente,idCategoria, ingredienteDefault, prezzoBase, quantitàAmmessa)
Infine mi creo la tabella componiProdotto(id, idIngrediente).
Per ultimo, dato che ho la tabella CARRELLO(id, idProdotto, quantità) che è compatibile con la tabella prodotto,
mi trasformo il componiProdotto in Prodotto (prelevo la lista di ingredienti e la aggiungo al campo descrizione)

Potrebbe essere corretto così?
 

DispatchCode

Utente Attivo
1,168
771
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
HDD
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
GPU
Nvidia Geforce GTX 960M, 4GB
Audio
Realtek
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
La tua tabella ComponiProdotto, che immagino abbia due chiavi esterne e non solo una (prodotto e ingrediente), manterrà sempre questa associazione? Oppure una volta che passi da ComponiProdotto a Prodotto, distruggi l'associazione?

Se non avrai mai update, ma solo nuove create (e delete sui record vecchi), allora puoi fare così (perchè non verranno mai modificati gli ingredienti di un prodotto).
Valgono poi le consideazioni esposte sopra, ma se nel tuo caso specifico non hanno attinenza... allora va bene.
 

willano

Nuovo Utente
80
3
La tua tabella ComponiProdotto, che immagino abbia due chiavi esterne e non solo una (prodotto e ingrediente), manterrà sempre questa associazione? Oppure una volta che passi da ComponiProdotto a Prodotto, distruggi l'associazione?
Si, avrà idProdotto e idIngrediente.

In che senso distruggo l'associazione? A me la tabella componiProdotto mi serve solamente per poter creare un prodotto compatibile con la tabella prodotto. Poi, i record verranno cancellati

Il problem qual è, io non posso basarmi sul prezzo del singolo ingrediente, perchè nel menù ci sono anche gli antipasti e questi hanno un prezzo fisso e non che si basano sugli ingredienti
 
Ultima modifica:

DispatchCode

Utente Attivo
1,168
771
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
HDD
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
GPU
Nvidia Geforce GTX 960M, 4GB
Audio
Realtek
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
Ok bhe, questo cambia le cose. :)

Per "distruggere l'associazione" intendevo dire: una volta che trasformi il tuo prodotto con ingredienti in un prodotto, puoi aggiungere a quest'ultimo altri ingredienti o eventualmente toglierli? Da come dici vengono cancellati subito, quindi immagino che di modifiche al prodotto non ce ne saranno (al limite ne verrà creato uno nuovo).
Di fatto sarebbe una tabella con dati temporanei, quella in cui associ "id_prodotto" e i vari "id_ingrediente".

Non conoscendo il problema nell'insieme e l'esigenza nell'insieme, è difficile dare un parere specifico.

Mi crea qualche dubbio la tabella nella quale associ prodotti e ingredienti... se la creazione del prodotto avviene subito, perchè non crei direttamente il prodotto?
Immagino che l'applicazione (web, suppongo?) abbia un form di inserimento dati dove verrà scelto/inserito un prodotto, e poi aggiunti gli ingredienti. Non ti conviene direttamente inserirli in Prodotto, se il caso è questo?
Sarebbe diverso se non cancellassi i record di quella tabella.
 

willano

Nuovo Utente
80
3
Ok bhe, questo cambia le cose. :)

Per "distruggere l'associazione" intendevo dire: una volta che trasformi il tuo prodotto con ingredienti in un prodotto, puoi aggiungere a quest'ultimo altri ingredienti o eventualmente toglierli? Da come dici vengono cancellati subito, quindi immagino che di modifiche al prodotto non ce ne saranno (al limite ne verrà creato uno nuovo).
Di fatto sarebbe una tabella con dati temporanei, quella in cui associ "id_prodotto" e i vari "id_ingrediente".

Non conoscendo il problema nell'insieme e l'esigenza nell'insieme, è difficile dare un parere specifico.

Mi crea qualche dubbio la tabella nella quale associ prodotti e ingredienti... se la creazione del prodotto avviene subito, perchè non crei direttamente il prodotto?
Immagino che l'applicazione (web, suppongo?) abbia un form di inserimento dati dove verrà scelto/inserito un prodotto, e poi aggiunti gli ingredienti. Non ti conviene direttamente inserirli in Prodotto, se il caso è questo?
Sarebbe diverso se non cancellassi i record di quella tabella.
E' un'applicazione per il mio lido.
Ho un pannello amministrazione dove inserisco i miei articoli, modifico, ecc.
Poi c'è la parte che vedrà il cliente (lista di prodotti suddivisa per categorie)

Per questo io non ho bisogno di ingredienti. Mi creo direttamente il prodotto con la descrizione e poi nel caso in cui non è presente lo disabilito. Fin qua funziona tutto (riesco a prendere le ordinazioni, ecc).
Mio padre vuole che inserisco la possibilità di creare appunto sti prodotti personalizzati. Per questo quindi devo distinguere tra un prodotto normale e un prodotto personalizzato (perchè i prodotti normale me li creo io. Gestire il tutto con gli ingredienti è un casino perchè dovrei avere sotto controllo se finisce un ingrediente e così via.
Se volessi usare gli ingredienti, ma devo distinguere il prezzo in base se è un prodotto componibile o meno, come faccio ad associare un prezzo fisso per un prodotto con una lista di ingredienti?

Ma ci sei su telegram? magari ti faccio vedere al volo com'è strutturato (se hai voglia).
 

DispatchCode

Utente Attivo
1,168
771
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
HDD
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
GPU
Nvidia Geforce GTX 960M, 4GB
Audio
Realtek
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
Se devi distinguere perchè hai le due tipologie, puoi aggiungere un attributo alla tabella dei prodotti (personalizzato si/no); se lo è usi la tabella esterna che dicevi sopra per prenderne gli ingredienti.
Ovviamente puoi anche cercare direttamente l'id del prodotto nella tabella in cui fai l'associazione, e se non trovi risultati è perchè non ha ingredienti.

Si, ho Telegram. Se mi vuoi mandare degli screen va bene, quando riesco guardo, comunque era solo per avere un quadro un pò più completo.
 

willano

Nuovo Utente
80
3
Se devi distinguere perchè hai le due tipologie, puoi aggiungere un attributo alla tabella dei prodotti (personalizzato si/no); se lo è usi la tabella esterna che dicevi sopra per prenderne gli ingredienti.
Ovviamente puoi anche cercare direttamente l'id del prodotto nella tabella in cui fai l'associazione, e se non trovi risultati è perchè non ha ingredienti.

Si, ho Telegram. Se mi vuoi mandare degli screen va bene, quando riesco guardo, comunque era solo per avere un quadro un pò più completo.
I prodotti componibili non li creo io, ma gli utenti. (mi ero dimenticato di specificare questa cosa).
Io voglio fare tipo justEat che permette di creare delle categorie con prodotti fissi (descrizione immagino perchè non penso che nei prodotti standard che ci sono ti fa aggiungere un ingrediente per volta), e poi ti permette anche di avere delle categorie personalizzate per creare il tuo cibo. Queste categorie hanno un ingrediente fisso e un prezzo di partenza e poi puoi aggiungere un insieme di ingredienti.
Per questo ho messo il campo descrizione come testo.

Quindi a me servirebbe impostare ad una categoria componibile (non standard) un prezzo fisso con un ingrediente di base e poi poter creare il mio prodotto.

La form che ho attualmente per inserire un prodotto è scegliere se la categoria è di tipo ristorante o bar, scegliere la categoria, inserire il nome del prodotto, descrizione e prezzo.

Devo aggiungere un campo alla categoria per settare un prezzo fisso nel caso è componibile?
Come setto poi l'ingrediente base? Devo inserire un campo nella tabella ingredienti in cui indico se deve essere di base per quella categoria?
Poi, scelti gli ingredienti lato client, mi faccio inviare il JSON con la lista degli ingredienti ed infine mi creo il prodotto standard in cui nel campo descrizione metto la lista degli ingredienti scelti.
Una volta che l'ordine è stato evaso, cancello i prodotti componibili per quell'ordine
 

DispatchCode

Utente Attivo
1,168
771
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
HDD
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
GPU
Nvidia Geforce GTX 960M, 4GB
Audio
Realtek
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
Quindi a me servirebbe impostare ad una categoria componibile (non standard) un prezzo fisso con un ingrediente di base e poi poter creare il mio prodotto.

La form che ho attualmente per inserire un prodotto è scegliere se la categoria è di tipo ristorante o bar, scegliere la categoria, inserire il nome del prodotto, descrizione e prezzo.

Devo aggiungere un campo alla categoria per settare un prezzo fisso nel caso è componibile?
Come setto poi l'ingrediente base? Devo inserire un campo nella tabella ingredienti in cui indico se deve essere di base per quella categoria?

Se non erro Justeat ti consente di selezionare i prodotti dalle categorie, ma non gli ingredienti (potrei sbagliare, non sono ben informato in merito).

Comunque se la categoria componibile è fissa e il prezzo non può variare, allora si, secondo me.

Secondo me non puoi aggiungere quel campo alla tabella Ingredienti, poichè un'altra categoria può avere quell'ingrediente come base. Dovresti dare alla Categoria l'Ingrediente base (quindi avere una chiave esterna sulla categoria).
In questo modo puoi avere lo stesso ingrediente base associato a più categorie.

Lo so che insisto su questo punto ma...
Ti precludi delle possibilià se cancelli il prodotto e non tieni traccia degli ingredienti: non sai ad esempio cosa viene scelto maggiormente, ad esempio; questo implica il non poter mostrare questo ingrediente (o prodotto), magari, in cima alla lista.
Ma sono solo idee che ti metto li, deviazione professionale... :D
 

willano

Nuovo Utente
80
3
Lo so che insisto su questo punto ma...
Ti precludi delle possibilià se cancelli il prodotto e non tieni traccia degli ingredienti: non sai ad esempio cosa viene scelto maggiormente, ad esempio; questo implica il non poter mostrare questo ingrediente (o prodotto), magari, in cima alla lista.
Ma sono solo idee che ti metto li, deviazione professionale.

Si, ma come ho detto, io non ho bisogno di ingredienti (in generale) perchè la maggior parte dei prodotti hanno una descrizione (che sarebbe la lista degli ingredienti). Se aggiungessi gli ingredienti dovrei inserire a mano ogni volta un ingrediente ed è una sfacchinata. Ad esempio, per gli antipasti, come gestisco gli ingredienti? Per questo ho inserito quel campo descrizione.
JustEat permette di inserire la descrizione del prodotto (almeno penso sia così)
 

DispatchCode

Utente Attivo
1,168
771
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
HDD
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
GPU
Nvidia Geforce GTX 960M, 4GB
Audio
Realtek
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
Si, ma come ho detto, io non ho bisogno di ingredienti (in generale) perchè la maggior parte dei prodotti hanno una descrizione (che sarebbe la lista degli ingredienti). Se aggiungessi gli ingredienti dovrei inserire a mano ogni volta un ingrediente ed è una sfacchinata. Ad esempio, per gli antipasti, come gestisco gli ingredienti? Per questo ho inserito quel campo descrizione.
JustEat permette di inserire la descrizione del prodotto (almeno penso sia così)

Non mi riferisco a quelli che "non hanno ingredienti"; ma a quelli che li hanno, e che fai comporre.
E' come se avessi due tipologie distinte: con e senza ingredienti.

Poi si torna a quanto detto sopra... se nel tuo caso non ti serve e pensi che in futuro non ti servirà, allora va bene così.
 

willano

Nuovo Utente
80
3
Non mi riferisco a quelli che "non hanno ingredienti"; ma a quelli che li hanno, e che fai comporre.
E' come se avessi due tipologie distinte: con e senza ingredienti.

Si lo so. Si può fare che per i prodotti non componibili, inserisco io la descrizione e non per forza gli ingredienti?
Così, posso adattare la struttura del DB che ho attualmente con i prodotti componibili (inserendo un flag nella tabella prodotti che mi indica se è componibile o meno). Il campo descrizione potrà essere inserito o manualmente (per i prodotti non componibili) oppure viene generato facendo un parse di tutti gli ingredienti scelti. Che ne pensi?

L'unico mio dubbio è che questi prodotti componibili, vengono composti solamente dai clienti (non da me), quindi mi servono in memoria solamente per tenere traccia dell'ordine. Evaso l'ordine, non mi occorrono più. Dici che va bene lo stesso inserirli nella tabella prodotto e poi eliminarli quando viene evaso l'ordine?
 

Entra

oppure Accedi utilizzando

Hot: E3 2021, chi ti è piaciuto di più?

  • Ubisoft

    Voti: 36 22.8%
  • Gearbox

    Voti: 3 1.9%
  • Xbox & Bethesda

    Voti: 101 63.9%
  • Square Enix

    Voti: 13 8.2%
  • Capcom

    Voti: 7 4.4%
  • Nintendo

    Voti: 21 13.3%
  • Altro (Specificare)

    Voti: 15 9.5%

Discussioni Simili