Spring boot model Produkt s možnostmi

vesterna12

  • ***
  • 124
  • byrokracie zabíjí kreativitu
    • Zobrazit profil
    • E-mail
Spring boot model Produkt s možnostmi
« kdy: 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:
Kód: [Vybrat]
Produkt           |Produkt_id | Jmeno
                  |1          | Produkt1

Moznosti          |Moznosti_id|  Hodnota
                  |1          |   Barva

MoznostiHodnota   |MoznostiHodnota_id|   Hodnota
                  |1                 |   Cervena
                  |2                 |   Oranzova

Vazebni tabulky:
Kód: [Vybrat]
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?
« Poslední změna: 01. 05. 2023, 18:37:10 od Petr Krčmář »


alex6bbc

  • *****
  • 1 638
    • Zobrazit profil
    • E-mail
Re:Spring boot model Produkt s moznosmi
« Odpověď #1 kdy: 01. 05. 2023, 16:50:16 »
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.

alex6bbc

  • *****
  • 1 638
    • Zobrazit profil
    • E-mail
Re:Spring boot model Produkt s možnostmi
« Odpověď #2 kdy: 01. 05. 2023, 18:53:05 »
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.

vesterna12

  • ***
  • 124
  • byrokracie zabíjí kreativitu
    • Zobrazit profil
    • E-mail
Re:Spring boot model Produkt s možnostmi
« Odpověď #3 kdy: 01. 05. 2023, 18:53:26 »
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?

alex6bbc

  • *****
  • 1 638
    • Zobrazit profil
    • E-mail
Re:Spring boot model Produkt s možnostmi
« Odpověď #4 kdy: 01. 05. 2023, 18:57:14 »
se springem neporadim, snad jini.
ja jsem na to sel pres tabulky (db+sql).

ja jsem c++ a javu znam jen starou :-)


Re:Spring boot model Produkt s možnostmi
« Odpověď #5 kdy: 03. 05. 2023, 10:37:34 »
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

Re:Spring boot model Produkt s možnostmi
« Odpověď #6 kdy: 04. 05. 2023, 06:18:41 »
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.