sql >> Database >  >> RDS >> Database

Database-ontwerp 101

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 de purchase 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!


  1. Dynamische kolom in SELECT-instructie postgres

  2. Wat is het verschil tussen utf8_general_ci en utf8_unicode_ci?

  3. sqlite geretourneerd:foutcode =1, msg =geen dergelijke kolom:keuken1

  4. Python:mysqldb gebruiken om een ​​MySQL-tabel als woordenboek te importeren?