Een goede oefening voor gegevensmodellering voor beginners is het maken van een gegevensmodel van een online winkel . Elke keer als ik deze oefening aan mijn leerlingen geef, sta ik er versteld van hoe moeilijk het voor hen is.
Vind de concepten...
Laten we eens kijken hoe het kan. We weten dat we voor elk concept in het domein een tabel moeten maken. Denk aan de zelfstandige naamwoorden en zelfstandige naamwoorden u zou gebruiken om het domein te beschrijven. Ruwweg is elk zelfstandig naamwoord ofwel een concept, een attribuut van een concept, of een voorbeeld . Wat zijn de basisconcepten in een online winkel? Er komen meteen twee woorden bij me op:
- klanten – mensen die dingen in onze winkel kopen, en
- producten – artikelen die mensen in onze winkel kopen.
Elke klant heeft een basisset met gegevens die hem beschrijven:id (meestal heeft u een id-attribuut nodig in uw tabel), naam, e-mailadres en wachtwoord. Evenzo heeft een product een id en een naam. We zouden meer kenmerken voor klanten en producten kunnen toevoegen, maar voor dit voorbeeld zijn deze voldoende. We voegen de twee tabellen toe aan ons model.
... Evenals de abstracte concepten
Dit is een winkel, dus het is duidelijk dat we willen weten wat is besteld en door wie . "Order" is een sleutelwoord in de meeste databases, dus we moeten het niet gebruiken voor een tabelnaam. In plaats daarvan gebruiken we de naam purchase
voor de derde tafel in ons model. De tafel moet op de een of andere manier verbonden zijn met de customer
en naar het product
. Laten we om te beginnen een verwijzing tekenen tussen purchase
en customer
, en tussen purchase
en product
.
De customer-purchase
referentie is in orde. Elke aankoop wordt gedaan door één klant; elke klant kan meerdere aankopen doen. Deze referentie is een blijvertje.
Er is echter iets mis met het purchase-product
verwijzing. In één aankoop kunnen meerdere producten worden gekocht; meerdere aankopen kunnen hetzelfde product bevatten. Maar onze referentie staat slechts één product toe om in een enkele aankoop te worden gekocht. Laten we de referentie verwijderen en een andere manier bedenken om het te modelleren.
Eén groot tekstveld voor alle gekochte producten?
Wat als we een groot tekstveld toevoegen waarin de namen of id's van gekochte producten kunnen worden opgeslagen? Nu kunnen we meerdere producten in één aankoop kopen. Er zijn hier echter enkele problemen:
- Ten eerste is het moeilijk om te controleren of het product in de
purchased_items
veld staat echt in de database. - Ten tweede, als je de naam van het product wilt wijzigen (omdat je het verkeerd hebt gespeld), moet je alle
purchased_items
bijwerken veldinstanties in depurchase
tafel. - Ten slotte is het moeilijk om gegevens in de database te analyseren. Als u bijvoorbeeld wilt weten welk product het vaakst wordt gekocht, moet u een tekstsubstringbewerking gebruiken. En dat is nooit erg efficiënt.
Verschillende productkolommen in de inkooptabel?
Wat zijn enkele andere opties? We willen dat een aankoop wordt gekoppeld aan verschillende producten, dus misschien moeten we meerdere purchase_item
toevoegen kolommen in een inkooptabel? Nou, dat is vermoeiend (ik heb maar 5 kolommen toegevoegd en werd moe) en creëert een kunstmatig en stom limiet op het aantal gekochte producten.
Gebruik een tussentabel!
De dwaze oplossing verwijst naar de juiste oplossing. We willen een onbeperkte aantal producten verbonden aan de aankoop. De enige manier is om een tussenliggende verbindingstabel . te hebben . Laten we het purchase_item
noemen . Het purchase_item
tafel is verbonden met purchase
en product
. Nu kan een aankoop zoveel producten bevatten als we willen. Als bonus kunnen we extra gegevens in de tabel toevoegen:aantal keer gekocht, totale prijs voor dit artikel, enzovoort.
Conclusies:
- Tabellen in het model kunnen niet alleen fysieke objecten vertegenwoordigen zoals klant of product. Tabellen kunnen meer abstracte concepten vertegenwoordigen als een aankoop. Andere voorbeelden zijn een boeking in een hotelreserveringssysteem, een book_lening in een model voor bibliotheek, een afspraak in een systeem voor artsen, etc.
- Als je een transactie modelleert (d.w.z. het kopen of verkopen van veel dingen), heb je meestal drie tabellen nodig :één voor de transactie (aankoop of boeking in een hotelreserveringssysteem), één voor dingen die in een transactie zijn gekocht/verkocht (product, hotelkamer) en één voor transactie-items (aankoop_item, boekingsitem). U kunt indien nodig aanvullende informatie toevoegen aan de tussentijdse tabel.
Maak uw eigen winkeldatabasemodel met Vertabelo!