Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: vesterna12 01. 05. 2023, 15:30:52
-
Zdravim,
potrebuji navrhnout tridu Produkt, ktera obsahuje tridu (Array)Moznosti ktera obsahuje (Array)MoznostiHodnota.
Trida Produkty by tak mela ulozit "Zidli" s moznosti "Barva" a MoznostiHodnota "cervena, oraznova, modra...".
V tabulce s Moznosti a MoznostiHodnota se vlastnosti nesmi opakovat.
Aktualne instacuji produkt nasledovne
Produkt produkt1 = new Produkt("testovaciProdukt");
Moznosti moznosti1 = new Moznosti("Barva");
MoznostiHodnota moznostiHodnota1 = new MoznostiHodnota("cervena");
moznosti1.pridatMoznostHodnota(moznostiHodnota1);
produkt1.pridatMoznost(moznosti1);
produktInterface.save(produkt1);
coz vyrobi nasledujici DB:
Produkt |Produkt_id | Jmeno
|1 | Produkt1
Moznosti |Moznosti_id| Hodnota
|1 | Barva
MoznostiHodnota |MoznostiHodnota_id| Hodnota
|1 | Cervena
|2 | Oranzova
Vazebni tabulky:
Produkt_moznosti |Id| Produkt_id | Moznost_id
| 1 | 1 | 1
Moznosti_MoznostiHodnota
|Id| Moznost_id | MoznostiHodnota_id
| 1 | 1 | 1
| 2 | 1 | 2
Pokud ma dalsi produkt moznost_id 1, dostane vsechny "MoznostiHodnota", protoze vazebni tabulka neobsahuje id produktu.
Pro reseni me napadlo pridat id produktu do konstruktoru MoznostiHodnota, ale mozna se to da zvladnout lepe? Nebo na to jdu uplne blbe?
-
je to stejny pripad jako s normalizaci databazovych tabulek a taky vhodneho nazvoslovi.
produkt ma spise vlastnosti, nazev moznosti mi pripada nevhodne zvoleny.
tabulka/objekt produkt ma mit polozky id, nazev.
tabulka/objekt vlastnost polozky id, nazev_klice.
tabulka/objekt produkt_vlastnost ma svoje id, cizi klic je id z tabulky vlastnost, cizi klic je id z tabulky produkt a hodnotu.
v produktech budou treba zaznamy:
1, zidle.
2, pohovka.
3. stul.
v tabulce vlastnost jsou zaznamy:
1,barva.
2,material.
3,cena.
4,doba_vyroby.
propojovaci tabulka produkt_vlastnost ma hodnoty (id, produkt id, vlastnost id, hodnota):
1,1,1,zelena.
2,1,2,drevo.
3,1,3,2000kc.
4,2,1,bila.
5,2,2,zelezo.
6,2,3,5000kc.
7,2,4,3tydny.
atd.
-
jeste otazka zda ma smysl katalogizovat hodnoty vlastnosti?!
vlastnosti samostatne katalogizovat smysl ma jako napr. barva, cena, material, delka, sirka, vyska....
ale v databazi klic-hodnota, bych myslel, ze hodnoty jsou volne hodnoty, ktere katalogizovat smysl nema.
-
Diky to je rozhodne vhodnejsi reseni.
Da se ve Springu tabulka produkt_vlastnost vytvorit pomoci nejake specialni anotace nebo toho lze dosahnout jen pomoci nove entity, ktera to bude vsechno propojovat?
-
se springem neporadim, snad jini.
ja jsem na to sel pres tabulky (db+sql).
ja jsem c++ a javu znam jen starou :-)
-
Pokud platí, že pro jednu vlastnot může mít jeden produkt jen jednu hodnotu (tj v "propojovací tabulce" nebude 2x řádek se stejnou dvojicí produkt id, vlastnost id), použil bych spíš složený primární klíč (produkt id, vlastnost id) místo generovaného umělého id.
"Propojovací tabulku" bych realizoval jako samostatnou entitu.
Příklad implementace ve spring boot/JPA tady: https://stackoverflow.com/questions/23837561/jpa-2-0-many-to-many-with-extra-column/32920550#32920550
-
Off-topic: pokud se nemusíš a nechceš mořit s JPA, tak je ještě možnost zkusit třeba jOOQ - v podstatě type-safe tenký obaleč nad SQL.