Kezdőoldal » Számítástechnika » Programozás » Erre mi lehet a jó megoldás...

Erre mi lehet a jó megoldás SQL-ben?

Figyelt kérdés

Egy webshop adatbázisában szerepel két tábla:

-termekek(id,nev,leiras)

-tulajdonsagok(termek_id,tulajdonsag)


Kereső mezőbe ha beír a felhasználó egy kifejezést, akkor dobja fel azokat a termékeket amik tartalmazzák az adott kifejezést bármelyik mezőben.

Én így csináltam: SELECT * FROM termekek INNER JOIN tulajdonsagok ON termekek.id = tulajdonsagok.termek_id WHERE termekek.nev = "kifejezés" OR termekek.leiras = "kifejezés" OR tulajdonsagok.tulajdonsag = "kifejezés"

Működik is, viszont ha az adott kifejezés szerepel a leírásban, akkor annyiszor felhozza rekordként az adott terméket ahány tulajdonság hozzá van rendelve a másik táblában.

Mi lehet erre a jó megoldás?



2023. jan. 23. 15:18
1 2
 1/12 anonim ***** válasza:
100%
2023. jan. 23. 15:29
Hasznos számodra ez a válasz?
 2/12 anonim ***** válasza:
8%

termekek.id = tulajdonsagok.termek_id


Ez egy explosion-t eredményez. Annyi sort fog visszaadni, ahány tulajdonsága van a terméknek.

2023. jan. 23. 15:40
Hasznos számodra ez a válasz?
 3/12 anonim ***** válasza:
82%

Ilyenkor a legszebb megoldás az lenne, ha 3 külön táblád lenne:

- Termékek: id, név, leírás, amit akarsz.

- Tulajdonságok: id, leírás, stb.

- És egy tábla (kapcsolótábla), ami összekapcsolja a termékeket és a hozzá kapcsolódó tulajdonságokat. Így nem kellene minden tulajdonsághoz egyből rögzíteni egy terméket is.


Tehát ha mondjuk van egy olyan terméket, hogy Pulcsi (id = 1), meg olyan tulajdonságod, hogy Puha (id= 1), akkor a kapcsolótáblában az szerepelne, hogy TermekId: 1, TulajdonsagId: 1.

Aztán ha később lenne egy olyan terméked, hogy Zokni (id = 2), akkor a kapcsolótáblában lenne egy olyan sor, hogy TermekId: 2, TulajdonsagId: 1.

Ha bejönne egy új tulajdonság, mégpedig az hogy Kék és a Pulcsi is kék, akkor megjelenne a kapcsolótáblában egy új sor: TermekId: 1, TulajdonsagId: 2.


Azt, hogy a joinok ne többszörözzék a találataidat, a DISTINCT használatával lehet elérni.


Tehát ennek valahogy így kéne kinéznie:


SELECT DISTINCT TE.*

FROM Termekek TE

INNER JOIN TermekTulajdonsag TT ON TT.TermekId = TE.Id

INNER JOIN Tulajdonsag TU ON TT.TulajdonsagId = TU.Id

WHERE TE.Nev LIKE '%kifejezés%'

OR TE.Leiras LIKE '%kifejezés%'

OR TU.Leiras LIKE '%kifejezés%'


A "SELECT DISTINCT TE.*" azt jelenti, hogy a Termekek táblából válassza ki, a teljesen különböző sorokat.

A szűrési feltételeknél pedig a LIKE '%kifejezés%' nem pontos egyezést vizsgál, hanem azt, hogy tartalmazza-e a mező az adott kifejezést. Tehát ha az a kifejezés, hogy "uh" akkor a "puha" is stimmelni fog rá.

2023. jan. 23. 15:40
Hasznos számodra ez a válasz?
 4/12 A kérdező kommentje:

Köszi az eddigieket! Végül úgy néz ki így sikerült:

SELECT * FROM termekek WHERE termekek.nev LIKE 'kifejezés' OR termekek.leiras LIKE 'kifejezés' OR termekek.id IN (SELECT tulajdonsagok.termek_id FROM tulajdonsagok WHERE tulajdonsagok.tulajdonsag LIKE 'kifejezés')

2023. jan. 23. 16:37
 5/12 anonim ***** válasza:
100%
Hát egy ilyen inner selectet nem túl szép dolog írni, főleg ha egy Distinct-el önmagában megoldhatod.
2023. jan. 23. 17:28
Hasznos számodra ez a válasz?
 6/12 A kérdező kommentje:
Az alap SQL a distinct-el ott az volt a baj, ha valamelyik termékhez nem tartozott egy tulajdonság sem akkor nem hozta a rekordot.
2023. jan. 23. 17:31
 7/12 anonim ***** válasza:
66%

Én csak annyit írnék, hogy #3 válasza nagyon szakmabeli és soknak hangzik elsőre, de ha cégnél lennél akkor egy nagyobb tapasztalattal rendelkező fejlesztő ezt a megoldást választaná.

Persze ez rengeteg dologtól függ, teljesen elképzelhető, hogy a te megoldásod is jó, de #3 válasza szokott lenni általában a megoldás ilyen jellegű problémákra.

2023. jan. 23. 18:19
Hasznos számodra ez a válasz?
 8/12 anonim ***** válasza:
32%
#7 egy nagyobb tapasztalattal rendelkezo fejleszto inverted indexet valasztana.
2023. jan. 23. 18:23
Hasznos számodra ez a válasz?
 9/12 anonim ***** válasza:
100%

#7 vagyok.


A miértet kifelejtettem:D

Programozás területén a jó megoldás azt jelenti, hogy

-más programozó könnyen tudja olvasni a kódodat (ez mindig elsődleges szempont, a bonyolult megoldás nem szép, mindig az egyszerűségre kell törekedni)

-általában nagyon fontos, hogy könnyen lehessen új funkcionalitást adni az adott kódnak

-könnyen lehessen karbantartani, szóval ha van egy borzasztóan bonyolult lekérdezésed, azt fejfájás debugolni és sok idő lehet átírni, ez ugye programozóknál kifejezetten drága mulatság, mert magas az órabérünk, meg termék függvényében fontos a gyorsaság is, hogy tartsuk a lépést a konkurenciával és a user experience is jó legyen


Tehát ezért használjuk nagyon sok esetben #3 válaszát:D természetesen van, hogy csak eléggé komplex lekérdezéssel célszerűbb valamit megvalósítani, ez sem elképzelhetetlen, szerintem aki komolyabban foglalkozik adatbázisokkal, az találkozott már szörnyeteg querykkel:D

2023. jan. 23. 18:29
Hasznos számodra ez a válasz?
 10/12 anonim ***** válasza:
0%

“ #7 egy nagyobb tapasztalattal rendelkezo fejleszto inverted indexet valasztana.”


De a kérdező láthatóan az adatbázis építés és a lekérdezés írás alapjaival foglalkozik, szóval semmi értelme már most indexeket keverni ide, főleg egy olyan speciális fajtát amit nagyon ritkán kell használni és szerintem itt sem indokolt. Nem mellesleg nem tudom, hogy mit segítene a rossz táblaszerkezeten vagy magán a lekérdezés megírásán egy index jelen esetben.

2023. jan. 23. 18:53
Hasznos számodra ez a válasz?
1 2

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!