mysql tábla tervezés

Üdvözlet!

Van egy mysql-5 szerver. Nekiláttam egy webes aplikáció adatbázis tervezésének. Egy ponton elakadtam és ebben kérném a segítségeteket. Van egy tábla, ami kész ételekbe való alapanyagok adatait tartalmazza (id, nev, mertekegyseg, megjegyzes). A lényeg az lenne, hogy egy php alapú adminisztrációs felületen felveszik az alapanyagokat, melyek ebben a táblában lennének letárolva. Kellene még egy tábla, amiben tárolnám az étel nevét és a hozzá tartozó alapanyagok nevét és mennyiségét. Tudnátok erre egy szép megoldást javasolni, nem kell a komplett kivitelezés, inkább ötlet, hogy hogy alakítsam ki az etel táblát, hogy azt könnyen lehessen kezelni.

Hozzászólások

Mivel ma már elég jól a betermeltem a "Félédes Vörös" névre hallgató "asztali" minőségű borból, amit felütöttem egy kis Coca Cola light-tal, annyit tudok bölcsen javasolni, hogy hozd minimum második normálformára az adatbázist, de ha van türelmed, akkor próbáld meg harmadikra hozni :)

--
trey @ gépház

etel:
id - autoincrement
etelneve - varchar
kaloria - int

alapanyag:
id - autoincrement
anyagnev - varchar
mertegys - enum(g,ml,ek,...)

mennyiseg:
id - autoincrement
etelid - int
anyagid - int
mennyi - float

igy peldaul:
etel: 1,kenyer,230
alapanyag: 1,liszt,g | 5,viz,ml | 8,so,g | 67,eleszto,g
mennyiseg: 1,1,1,1000 | 2,1,5,200 | 3,1,8,50 | 4,1,67,20

remelem ertheto :) [nagyon ne fikazzatok, nem ertek ehhez sem]

Ez egy "darabjegyzék" (dbj) típusú tábla, aminek a lényege:
Van szülő tétel és van beépülő tétel. A szülő tétel+beépülő tétel határoz meg egy egyedi kulcsot, (unique index).

Lehet pl. ilyen:
Szülő, beépülő, mennyiség
leves1, víz, 1
leves1, krumpli, 0.5
leves1, hagyma, 0.2
leves2, víz, 1.2
leves2, krumpli, 0.52
leves2, hagyma, 0.18
leves2, kolbász1, 0.4
-------, -----, ----
Kell még egy anyagtörzs tábla is amiben szerepel az összes előforduló anyag, beleértve a szülő tételt is. Itt szerepel a megnevezés, mennyiségi egység, raktárkészlet, beszerzési idő, stb...

De mi van akkor ha egy beépülő tétel kell hogy szerepeljen mint szülő?
Semmi probléma, mert ez is szerepelhet a dbj táblában:
kolbász1, hús, 1.1
kolbász1, paprika, 0.2

A feldolgozással gondok lehetnek, mert a beépülés többszintű, emiatt rekurzív eljárás kell. A levesbe beépülő kolbász lehet beszerzett anyag is, de előállított is. Ezt szintén jelölni kell az anyagtörzsben.

ELaci

Valami hasonló fele mozdultam el, annyi különbséggel, hogy egy beépülő tétel soha nem fog szerepelni, mint szülő és nem szükséges sok információ tárolása az alapanyagokról sem.
De valami még nem kerek. Így festenek a táblák:


CREATE TABLE `food_component_map`
(
        `id` INTEGER  NOT NULL AUTO_INCREMENT,
        `food_id` INTEGER  NOT NULL,
        `component_id` INTEGER  NOT NULL,
        PRIMARY KEY (`id`),
        UNIQUE KEY `map_index` (`food_id`, `component_id`),
        CONSTRAINT `food_component_map_FK_1`
                FOREIGN KEY (`food_id`)
                REFERENCES `food` (`id`),
        INDEX `food_component_map_FI_2` (`component_id`),
        CONSTRAINT `food_component_map_FK_2`
                FOREIGN KEY (`component_id`)
                REFERENCES `component` (`id`)
)Type=MyISAM;

CREATE TABLE `food`
(
        `id` INTEGER  NOT NULL AUTO_INCREMENT,
        `categories_id` INTEGER  NOT NULL,
        `nev` VARCHAR(100),
        `leiras` LONGTEXT,
        PRIMARY KEY (`id`),
        INDEX `food_FI_1` (`categories_id`),
        CONSTRAINT `food_FK_1`
                FOREIGN KEY (`categories_id`)
                REFERENCES `categories` (`id`)
)Type=MyISAM;

REATE TABLE `component`
(
        `id` INTEGER  NOT NULL AUTO_INCREMENT,
        `nev` VARCHAR(200),
        `mertekegyseg` VARCHAR(20),
        `leiras` LONGTEXT,
        PRIMARY KEY (`id`)
)Type=MyISAM;

CREATE TABLE `categories`
(
        `id` INTEGER  NOT NULL AUTO_INCREMENT,
        `nev` VARCHAR(100),
        `leiras` LONGTEXT,
        PRIMARY KEY (`id`)
)Type=MyISAM;

Egy dologgal még nem boldogulok. A mennyiségre, szóval azzal, hogy egy ételbe egy adott összetevőből mennyi kell. Ezt a food_component_map táblába kellene felvennem?
A programot a symfony keretrendszerrel csinálom, ami a propel -t használja az adatbázis séma kezeléséhez, ha ez számít.
Kaphatnék még egy kis segítséget?

_____________________________________________________________
Lógnak a pálmafán a kókuszok .... :)
http://laszlo.co.hu/

A beépülő mennyiséget mindig a szülő 1 egységnyi állapotához kell viszonyítani.
Tehát pl. így:
1 liter leveshez kell 0.3 kg hús,
1 szelet sütihez kell 0.03 g kakaó

De úgy látom hogy a javaslatomat nem fogadtad el a dbj táblát illetően, pedig ez egy több évtizedes tapasztalat és nem az én ötletem.

Szerintem próbáld meg inkább egyed-kapcsolat modellel leírni az adatbázist. Abból már könnyen létrehozható az adatbázis séma.

--
maszili

Nem direkt valasz a kerdesre, de letezik egy krecipies nevu program, ami mysqlben tarol pontosan ilyen jellegu infokat (Receptek, hozzavalok, hozzavalok osszetevoi vitaminokig, nyomelemekig lebontva, energiatartalom stb.) Lehet, hogy erdemes lenne belenezned. Egyreszt az adatbazis strukturara adhat otletet, masreszt fel van toltve millio adattal (nem kesz receptekkel, hanem elsosorban az osszetevok adataival), ami esetleg hasznos lehet.
Csaba