[MYSQL] Database design - 5 records per categorie

Pagina: 1
Acties:

  • Chrissie
  • Registratie: December 2001
  • Laatst online: 07-12-2021
Ik heb een opzetje gemaakt voor een database. Screenshot van de tabel opbouw is hieronder te vinden. Wat ik probeer voor elkaar te krijgen, is de 5 nieuwste artikelen van elke Categorie te selecteren.

Zou iemand een hand kunnen toe rijken hoe ik dit met 1 query kan bewerkstellingen. Het is natuurlijk mogelijk om 1 query te doen om alle categorien te krijgen en dan met een aparte query per categorie de 5 nieuwste artikelen eruit halen. Echter als er straks meer dan 20 categorien zijn levert dit gelijk 20 query's (+1 voor de categorie) wat waarschijnlijk onnodig is.

Afbeeldingslocatie: http://www.fifabenelux.com/screenshots/database_design.gif


code:
1
2
3
4
5
6
7
8
SELECT categorie.categorie,
       artikel.soort,
       artikel.omschrijving,
       artikel.prijs
FROM artikel
   INNER JOIN subcategorie ON (artikel.subcat_id = subcategorie.id)
   INNER JOIN categorie ON (subcategorie.cat_id = categorie.id)
ORDER BY artikel.id DESC

  • js303
  • Registratie: April 2003
  • Laatst online: 01-08 22:19
id, is dat een auto_increment veld of bereken je die zelf? ik zou nl. aanraden om een aparte kolom voor de datum aan te maken en die te gebruiken voor het selecteren / sorteren op datum. er staat me iets bij dat je er niet blind op kan vertrouwen dat de hoogste ID ook de meest recent ingevoerde kaart is.

  • Chrissie
  • Registratie: December 2001
  • Laatst online: 07-12-2021
Ja...is een auto increment veld. Screenshot is niet helemaal compleet..ik heb de artikel tabel er niet helemaal op te staan...ik heb inderdaad ook een datum veld.

Lost echter mijn probleempje nog niet op...of ik nu doe
ORDER BY artikel.id DESC
of
ORDER BY artikel.datum DESC
maakt geen verschil

Wel goede opmerking bedankt.

  • OkkE
  • Registratie: Oktober 2000
  • Laatst online: 10-11-2025

OkkE

CSS influencer :+

Lijkt mij inderdaad ook veel beter om een datum veld te maken. Dat kan echt een type DATE zijn, of TIME, maar ook gewoon een VARCHAR met een timestamp er in. Kan nooit kwaad een datum in je DB te hebben lijkt me. :)

______
EDIT: * OkkE is spuit 11.

[ Voor 8% gewijzigd door OkkE op 11-07-2003 15:39 ]

“The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer.”
QA Engineer walks into a bar. Orders a beer. Orders 0 beers. Orders 999999999 beers. Orders a lizard. Orders -1 beers.


  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

Waarom een tabel subcategorie. Je kan in de tabel categorie toch ook een veld maken parent_cat_id. Dan ben je ook weer flexibeler als je categorieen in een categorie wilt zetten. Snappie. Dan wordt je querie ook weer een stuk makkelijker.

Systeem | Strava


  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 21-08 18:29
Wat Bartje zegt is inderdaad heel erg belangrijk. Je zult eerst de database helemaal goed moeten normaliseren voor je verder kunt.
Wel mooie visualisatie van je tabellen btw. :)

  • Chrissie
  • Registratie: December 2001
  • Laatst online: 07-12-2021
Dat wat Bartje zegt slaat volgens mij nergens op...op deze manier ben ik flexibeler...
Stel dat ik de naam van Categorie1 wil veranderen...dan zou ik op Bartjes manier al mijn records moeten aanpassen...nu hoef ik dit alleen in de Categorie tabel te doen...

[ Voor 12% gewijzigd door Chrissie op 11-07-2003 15:45 ]


  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

Chrissie schreef op 11 July 2003 @ 15:42:
Dat wat Bartje zegt slaat volgens mij nergens op...op deze manier ben ik flexibeler...
Stel dat ik de naam van Categorie1 wil veranderen...dan zou ik op Bartjes manier al mijn records moeten aanpassen...nu hoef ik dit alleen in de Categorie tabel te doen...

In mijn geval is Categorie de Parent...en Subcategorie Child..
Volgens mij volg je me niet helemaal. Een subcategorie verschilt in feite niets van een gewone categorie. Het is daarom onzin om hiervoor 2 tabellen aan te maken.

Door middel van het maken van een veld parent_cat_id in je categorieen tabel kan je aangeven wat de subcategorieen van een categorie zijn.

Systeem | Strava


  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 21-08 18:29
edit:damn: te laat, Bartje was me voor

Nope, als je iets goed normaliseerd komt het probleem dat jij schetst nooit te nimmer voor. Tenzij je teveel in de 5e normaalvorm doet, maar dan normaliseer je eigenlijk ook al weer verkeerd. Beetje dubbelzinnig dit 8)7

Je kunt jouw probleem op de volgende manier omschrijven:
Ieder artikel behoort tot 1 (één) categorie. Die categorie kan eventueel, dat hoeft dus niet ook nog een parent id hebben, anders is deze 0.

Is dit wat je bedoeld?

Als dit zo is, wil je dan van iedere hoofdcategorie de 5 hebben, of van alle subcategoriën of van alle hoofd en sub-categoriën?

[ Voor 4% gewijzigd door djluc op 11-07-2003 15:46 ]


Verwijderd

De link vanuit subcategorie naar categorie is verkeerd. Subcategorie en Categorie dienen beiden via een primairy key aan Artikel gelinkt worden. Op de manier zoals jij dat voorstelt creeer je overhead én een verkeerde link van tabel naar tabel.

Dus:

tabel 1:

ARTIKEL_ID
CAT_ID
SUBCAT_ID
ARTIKEL_PRIJS
ARTIKEL_SOORT
ARTIKEL_OMSCHRIJVING
ARTIKEL_TEKST
ARTIKEL_PRIJS

Tabel 2:
CATEGORIE_ID
CATEGORIE_OMSCHR

Tabel 3
SUBCAT_ID
SUBCAT_OMSCHR.

Btw, wat is het verschil tussen Artikel_Tekst en Artikel_Omschr? Als daar regelmatig veel tekst in komt zou ik er een Memo veld van maken. Je moet ook overwegen om Artikel_soort ook in een aparte tabel te zetten. Hierdoor verminder je de redundantie in je tabellen, en verhoog je de eenduidigheid.

  • Chrissie
  • Registratie: December 2001
  • Laatst online: 07-12-2021
Ah Ok...
Nu snap ik wat jullie bedoelen...en als het dus een hoofdcategorie is dan is het parent_cat_id veld leeg.

Ik wil in eerste instantie van alle hoofd-categoriën er 5 hebben...en daarna inprincipe in een nieuwe pagina en nieuwe query waarvan je dan van alle sub-categoriën de top 5 krijgt.

Edit: Snadert
artikel.soort is gewoon een enum met daarin Aangeboden / Te Koop.
doet er verder even niet toe wat voor velden er zijn..ik heb ook helemaal niet aangeven welke data-typen ze zijn.

[ Voor 25% gewijzigd door Chrissie op 11-07-2003 15:57 ]


  • OkkE
  • Registratie: Oktober 2000
  • Laatst online: 10-11-2025

OkkE

CSS influencer :+

Lamaar..

[ Voor 98% gewijzigd door OkkE op 11-07-2003 15:54 ]

“The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer.”
QA Engineer walks into a bar. Orders a beer. Orders 0 beers. Orders 999999999 beers. Orders a lizard. Orders -1 beers.


Verwijderd

Wél je tabelstructuur aanpassen... op deze manier krijg je problemen....

Verwijderd

Categorie en sub-categorie zijn aparte entiteiten, niet aan elkaar knopen. De link moet lopen vanuit Artikel.

  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

Verwijderd schreef op 11 July 2003 @ 15:55:
Categorie en sub-categorie zijn aparte entiteiten, niet aan elkaar knopen. De link moet lopen vanuit Artikel.
Subcategorie hoeft toch niet eens te bestaan zoals eerder gezegd?

Systeem | Strava


Verwijderd

Ja... klopt, voor zijn doelstellingen hoeft het niet. Het ging mij even om het normaliseren van de hier getekende tabellen......

  • Chrissie
  • Registratie: December 2001
  • Laatst online: 07-12-2021
Als ik het goed heb willen jullie dat het er zo uit ziet...
Afbeeldingslocatie: http://www.fifabenelux.com/screenshots/database_design2.gif


Dan komt nu de vraag weer...Hoe pak ik van elk Categorie maar 5 artikelen..

  • Feyd-Rautha
  • Registratie: November 2001
  • Laatst online: 02-08-2025
Om zoiets te willen realiseren zul je gebruik moeten maken van procedurele statements in uw SQL. Iets dus zoals Transact SQL (voor SQL server) en PL/SQL voor Oracle gebruik je daarvoor dus het best.

Maar mySQL ondersteunt zoiets niet dacht ik...

[ Voor 16% gewijzigd door Feyd-Rautha op 11-07-2003 17:26 ]

I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. Where the fear has gone there will be nothing. Only I will remain.


  • whoami
  • Registratie: December 2000
  • Laatst online: 21-08 22:54
Dat zal je niet kunnen met 1 SQL statement.

Je zou kunnen een Stored procedure schrijven die voor iedere opgehaalde categorie 5 artikelen ophaalt enzo, maar MySQL ondersteunt afaik geen SP's. Je zal het dus in je PHP/whatever code moeten doen.

https://fgheysels.github.io/


Verwijderd

Afhankelijk van de grootte is het dan misschien toch te overwegen om een loopje met daarin queries neer te zetten. Gezien het allemaal queries zijn die toch een heel kleine tijd in beslag nemen, en 'licht' zijn voor het dbms. Bij MySQL zul je echter genoodzaakt hiertoe zijn gezien deze database geen procedure-taal bevat zoals hierboven beschreven word.

Wanneer je systeem/ website dermate veel bezoekers heeft die een zeer groot aantal transacties op de database uitvoeren, dat dit echt invloed heeft op de snelheid van de afhandeling, is het misschien te overwegen om een Cronjob te gebruiken die bijvoorbeeld om de 5 minuten een script draait waarin alles gegevens naar een vaste tabel worden geschreven. Deze is dan wel in 1 query te raadplegen.

  • Chrissie
  • Registratie: December 2001
  • Laatst online: 07-12-2021
Ja...aan een dergelijke oplossing heb ik ook gedacht..het zou ook mogelijk zijn om tijdens het invoegen van een nieuw artikel een tijdelijke tabel te hebben waarin de categorie wordt weggeschreven..het oudste artikel in de desbetreffende categorie vervalt dan...

Welke optie verdient de voorkeur?
- Cronjob update
- Update bij INSERT
- Loop

  • CyberSnooP
  • Registratie: Augustus 2000
  • Laatst online: 31-03 16:47

CyberSnooP

^^^^ schrijft --->

Een van de eerste twee opties.
De eerste is aantrekkelijk bij veel inserts, die 2e in andere gevallen.

|_____vakje______|


Verwijderd

de 'update bij INSERT'-optie is op zich wel een mogelijkheid en lijkt op het eerste gezicht eenvoudig. Dat zal echter tegen gaan vallen kijkend naar bijvoorbeeld een situatie waarbij er een artikel verwijderd wordt. Deze moet dan ook verwijderd worden uit de 'temp'-tabel en vervolgens moet heb je in die tabel van die subcategorie nog maar 4 artikelen dus moet er opnieuw een insert plaatsvinden van een oud artikel.

  • Brothar
  • Registratie: Oktober 2000
  • Laatst online: 04-02 09:14

Brothar

meester

nog simpeler (?): maak een aparte tabel, nieuwste artikelen, aan.
Eens per weer,per dag, etc. vul je deze tabel opnieuw aan met alle dan nieuwe artikelen.
Daarna zet je daar een middels een procedure een teller in elk record, die telt per categorie/subcategorie.
De artikelen zonder teller (1 t/m 5) delete je dan uit de tabel.

Edit: Ik zie nu dat dit al was bedacht.

[ Voor 7% gewijzigd door Brothar op 12-07-2003 17:56 ]

eagle


Verwijderd

Waarom staat er in Categorie een veld Parent_Cat_ID? De link naar Artikel bestaat toch al via de key ID? Even off topic: benoem velden altijd uniek. CAT_ID is iets anders dan ART_ID. Nu heten ze alletwee ID.

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 10:45

mulder

ik spuug op het trottoir

Als ik over LIMIT begin praat ik dan poep?

oogjes open, snaveltjes dicht


  • Chrissie
  • Registratie: December 2001
  • Laatst online: 07-12-2021
Verwijderd schreef op 12 July 2003 @ 20:59:
Waarom staat er in Categorie een veld Parent_Cat_ID? De link naar Artikel bestaat toch al via de key ID? Even off topic: benoem velden altijd uniek. CAT_ID is iets anders dan ART_ID. Nu heten ze alletwee ID.
parent_cat_id is om aan te geven welke wat de parent categorie is...
id|categorie|parent_cat_id
1|Auto|NULL
2|Mercedes|1
3|Toyota|1


LIMIT kan in dit geval niet de oplossing brengen...daarmee kan ik toch alleen het aantal recordsets limiteren. Ik kan daarbij niet van elke categorie er maar 5 pakken.
Pagina: 1