Newsgroup: it.comp.www.php
Titolo: Memorizzare ricette, materie prime e magazzino di un ristorante

Salve,
 
sto facendo alcuni test per non lasciare nel dimenticatoio gli studi su 
php, MySQL, etc. non ho velleità da programmatore ma semplicemente la 
logica di come creare DB devo dire che aiuta molto anche 
nell'organizzazione del lavoro in generale!
 
L'esempio a cui mi sto dedicando è quello di un ristorante, nella prima 
tabella ipotizzo di inserire il materiale che si utilizza:
 
CREATE TABLE items
(
item_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(30) NOT NULL,
language_id SMALLINT(5) UNSIGNED NOT NULL,
brand VARCHAR(30) DEFAULT NULL,
barcode CHAR(15) DEFAULT NULL,
item ENUM ("Food","Drink","Thing"),
expiration ENUM ("Yes","No"),
PRIMARY KEY (item_id),
INDEX (language_id),
FOREIGN KEY (language_id) REFERENCES languages (language_id)
)
ENGINE=INNODB;
 
Nella seconda tabella creo delle sotto categorie tipo se memorizzo nella 
prima pasta in questa seguente scriverò spaghetti, tagliatelle, etc. 
oppure se nella prima memorizzo latte in questa seconda inserirò latte 
di mucca, pecora etc.
 
CREATE TABLE subitems
(
subitem_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
language_id SMALLINT(5) UNSIGNED NOT NULL,
item_id INT(10) UNSIGNED NOT NULL,
rawmaterial ENUM ("Yes","No"),
PRIMARY KEY (subitem_id),
INDEX (language_id),
FOREIGN KEY (language_id) REFERENCES languages (language_id),
INDEX (language_id),
FOREIGN KEY (item_id) REFERENCES items (item_id)
)
ENGINE=INNODB;
 
Ora vado a creare la tabella del magazzino che linkerò a subitems perché 
mi occorre sapere quanti spaghetti ho in casa e non genericamente quanta 
pasta:
 
CREATE TABLE warehouses
(
warehouse_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
item_id  INT(10) UNSIGNED NOT NULL,
userdetail_id INT(10) UNSIGNED NOT NULL,
day DATE DEFAULT NULL,
expirationdate DATE DEFAULT NULL,
quantity INT(10) NOT NULL,
minimumquantity INT(10) NOT NULL,
weight DECIMAL (9,4) DEFAULT NULL,
minimumweight DECIMAL (9,4) DEFAULT NULL,
PRIMARY KEY (warehouse_id),
INDEX (item_id),
FOREIGN KEY (item_id) REFERENCES items (item_id),
INDEX (userdetail_id),
FOREIGN KEY (userdetail_id) REFERENCES userdetails (warehouse_id)
)
ENGINE=INNODB;
 
Infine la tabella legata alle ricette in cui inserire gli ingredienti 
specifici legata a subitems ma legata anche a wharehouses perché "in 
automatico" vorrei scalare la quantità ma a questo punto dovrei inserire 
dei campi quantità per cui se per fare 1 carbonara ci vogliono 2 etti di 
spaghetti dev'esserci una query che mi verifichi la giacenza...
 
CREATE TABLE recipeingredients
(
recipe_id INT(10) UNSIGNED NOT NULL,
subitem_id INT(10) UNSIGNED NOT NULL,
keepingredient ENUM ("Show","Hide"),
warehouse_id INT(10) UNSIGNED,
PRIMARY KEY (recipe_id, subfoodgroup_id),
INDEX (warehouseitem_id),
FOREIGN KEY (warehouse_id) REFERENCES warehouses (warehouse_id),
INDEX (recipe_id),
FOREIGN KEY (recipe_id) REFERENCES recipes (recipe_id),
INDEX (subitem_id),
FOREIGN KEY (subitem_id) REFERENCES subitems (subitem_id),
INDEX (warehouse_id),
FOREIGN KEY (warehouse_id) REFERENCES warehouses (warehouse_id)
)
ENGINE=INNODB;
 
Il discorso è complesso ma interessante per questo gli sto dedicando del 
tempo nel ragionarci dietro! :)
 
Saluti.
^Bart

 ^Bart
 

 i dati che servono a fare la ricetta 
 
pensi di dover gestire anche ricette con ingredienti ripetuti o 
sottoricette?
 
esempio: lasagne
 
la farina serve per fare la pasta ma anche la besciamella (che potrebbe 
essere una ricetta a parte), o le uova in una torta che fanno parte 
dell'impasto ma anche di una possibile guarnizione allo zabaglione (che 
potrebbe essere una ricetta a parte, come la besciamella)
 
-- 
/-\ /\/\ /\/\ /-\ /\/\ /\/\ /-\ T /-\
-=- -=- -=- -=- -=- -=- -=- -=- - -=-
........... [ al lavoro ] ...........

Il 10/07/21 11:09, ^Bart ha scritto:

se ho capito bene da quello che scrivi, la prima tabella è una categoria 
  mentre la seconda un dettaglio della categoria.
 
se il ragionamento è questo barcode e brand non metterlo qui, ma 
utilizza una tabella separata dei "prodotti"
la "pasta sfoglia barilla" e la "pasta sfoglia buitoni" sono "prodotti" 
appartenenti alla categoria "pasta" e sottocategoria "pasta sfoglia"
e tra l'altro possono essere ancora suddivisi per specificità
come peso (500 gr o 1 kg) o contenuto (senza glutine, senza grassi 
aggiunti, ecc) e ognuno ha il suo specifico barcode.
il prodotto inteso come marca - modello - specifiche, può appartenere a 
più categoria.
 
"barilla farina tipo 0 500gr"
può appartenere a pasta come dolci come pizza e così via
 
la categoria e sottocategoria la puoi fare con un unica tabella 
(categoria) e gestire le relazioni con una altra tabella n - n
 
la categoria pasta è sia una categoria che una sottocategoria della 
categoria carboidrati.
 
a livello di separazione dei dati
ogni tabella deve contenere un set di informazioni omogenei che sono 
necessari alla parte più piccola del tuo progetto.
 
 
 
 

 potrebbe essere una ricetta a parte, come la besciamella)
 
Pensandoci bene bisognerebbe considerare la besciamella come una ricetta 
da sommare ad una ricetta già esistente senza stare ogni volta a 
riscriverla ed inserire gli ingredienti, sarebbe assurdo riscriverla 
ogni volta a questo punto però come gestirla?
 
Attualmente ho queste tabelle:
 
ITEMS
(contiene la lista del materiale presente in un ristorante con un campo 
booleano che identifica food o nofood)
 
SUBITEMS
(contiene la lista dei "sotto ingredienti" tipo se in ITEMS ho latte qui 
avrò latte di mucca, pecora etc.)
 
RECIPES
(contiene il nome della ricetta, l'immagine, il prezzo ed il giorno in 
cui disponibile tipo se a base di pesce il pesce di venerdì)
 
RECIPEINGREDIENTS
(è connessa con FK a RECIPES, ITEMS e SUBITEMS poi ho aggiunto il peso 
di ogni ingrediente e le calorie legate al peso di ogni ingrediente)
 
A questo punto dovrei fare una tabella ad hoc per le "guarnizioni" o per 
i "sughi" (devo trovare il giusto termine in inglese!) qualcosa simile a 
RECIPEINGREDIENTS da inserire in quest'ultima come FK magari di default 
null.
 
Saluti.
^Bart

 necessari alla parte più piccola del tuo progetto.
 
Ti ringrazio per tutte le dritte, ora devo cercare di metterle in 
pratica nel modo migliore! :)
 
Saluti.
^Bart

 
 
eh... 
qui si deve sentire uno "bravo", io cerco solo le possibili magagne ;)


 Ci devo ragionare non ho ben capito...
 
 
la puoi fare con una sola tabella
 
 
Categoria
----------
id_categoria
cescrizione
categoria_padre
 
 
esempio:
 
Categoria
--------
id_categoria = 1
descrizione = Pasta
categoria_padre = null
----
id_categoria = 2
descrizione = pasta sfoglia
categoria_padre = 1
 
 
la query con mysql 8
 
with recursive lista_cat (id_categoria, descrizione, categoria_padre) as (
   select     id_categoria,
              descrizione,
              categoria_padre
   from       categoria
   union all
   select     p.id_categoria,
              p.descrizione,
              p.categoria_padre
   from       categoria p
   inner join lista_cat
           on p.categoria_padre = lista_cat.id_categoria
)
select * from lista_cat;
 
 
 
 

 select * from lista_cat;
 
Mi segno comunque la query che può tornarmi utile! :)
 
Saluti.
^Bart
 

 qui si deve sentire uno "bravo", io cerco solo le possibili magagne ;)
 
Il trovare comunque le magagne implica già una certa bravura! :)
 
Ho comunque deciso di fare una tabella a parte chiamata sauces dove 
creare i vari sughi, guarnizioni, etc. perché ad esempio molti 
ristoranti lo stesso sugo te lo propongono con diversi tipi di pasta.
 
Saluti.
^Bart