sql >> Databasteknik >  >> RDS >> Database

Databasdesign 101

En bra datamodelleringsövning för nybörjare är att skapa en datamodell för en onlinebutik . Varje gång jag ger den här övningen till mina elever blir jag förvånad över hur svårt det är för dem.

Hitta koncepten...

Låt oss se hur det kan göras. Vi vet att vi måste skapa en tabell för varje koncept inom domänen. Tänk på substantiven och substantivfraser du skulle använda för att beskriva domänen. I stort sett är varje substantiv antingen ett begrepp, ett attribut för ett begrepp eller ett exempel . Vilka är de grundläggande begreppen i en webbutik? Två ord dyker genast upp:

  • kunder – människor som köper saker i vår butik, och
  • produkter – varor folk köper i vår butik.

Varje kund har en grundläggande uppsättning data som beskriver dem:id (du behöver vanligtvis ett id-attribut i din tabell), namn, e-postadress och lösenord. På samma sätt har en produkt ett id och ett namn. Vi skulle kunna lägga till fler attribut för kunder och produkter, men för det här exemplets skull kommer dessa att duga. Vi lägger till de två tabellerna i vår modell.

... Liksom de abstrakta begreppen

Det här är en butik, så uppenbarligen vill vi veta vad beställdes och av vem . "Order" är ett nyckelord i de flesta databaser, så vi bör inte använda det för ett tabellnamn. Istället använder vi namnet purchase för det tredje bordet i vår modell. Tabellen måste på något sätt vara kopplad till customer och till product . Till att börja med, låt oss bara rita en referens mellan purchase och customer , och mellan purchase och product .

customer-purchase referensen är OK. Varje köp görs av en kund; varje kund kan göra flera köp. Denna referens är här för att stanna.

Det är dock något fel med purchase-product referens. Flera produkter kan köpas i ett köp; flera köp kan innehålla samma produkt. Men vår referens tillåter bara en produkt att köpas i ett enda köp. Låt oss ta bort referensen och fundera på ett annat sätt att modellera den.

Ett stort textfält för alla köpta produkter?

Vad sägs om att vi lägger till ett stort textfält som kan lagra namn eller ID för köpta produkter? Nu kan vi köpa flera produkter i ett köp. Det finns dock några problem här:

  • För det första är det svårt att kontrollera att produkten i purchased_items fältet är verkligen i databasen.
  • För det andra, om du vill ändra namnet på produkten (eftersom du har stavat det fel) måste du uppdatera alla purchased_items fältinstanser i purchase tabell.
  • Slutligen är det svårt att analysera data i databasen. Om du till exempel vill ta reda på vilken produkt som köps oftast måste du använda en textsubstringsoperation. Och det är aldrig särskilt effektivt.

Flera produktkolumner i inköpstabellen?

Vad finns det för andra alternativ? Vi vill att ett köp ska kopplas till flera produkter så vi kanske borde lägga till flera purchase_item kolumner i en inköpstabell? Tja, det är tröttsamt (jag lade bara till 5 kolumner och blev trött) och skapar en konstgjord och dum gräns för antalet köpta produkter.

Använd en mellantabell!

Den fåniga lösningen antyder rätt lösning. Vi vill ha en obegränsad antal produkter kopplade till köpet. Det enda sättet är att ha en mellanliggande anslutningstabell . Låt oss kalla det purchase_item . purchase_item tabellen är kopplad till purchase och product . Nu kan ett köp innehålla så många produkter vi vill. Som en bonus kan vi lägga till ytterligare data i tabellen:antal köpta gånger, totalpris för denna artikel och så vidare.


Slutsatser:

  • Tabellerna i modellen kan representera inte bara fysiska objekt som kund eller produkt. Tabeller kan representera mer abstrakta begrepp som ett köp. Andra exempel kan vara en bokning i ett hotellbokningssystem, ett book_loan i en modell för bibliotek, en tid i ett system för läkare etc.
  • När du modellerar en transaktion (d.v.s. köper eller säljer många saker) behöver du vanligtvis tre tabeller :en för transaktionen (köp eller bokning i ett hotellbokningssystem), en för saker som köpts/säljs i en transaktion (produkt, hotellrum), och en för transaktionsartiklar (purchase_item, booking_item). Du kan lägga till ytterligare information i mellantabellen om du behöver.

Skapa din egen butiksdatabasmodell med Vertabelo!


  1. Linq to Entities Group By (OUTTER APPLY) oracle 11.2.0.3.0 stöder inte applicera

  2. Skapa en kall standby för PostgreSQL med Amazon AWS

  3. Typkonvertering. Vad gör jag med ett PostgreSQL OID-värde i libpq i C?

  4. Använda Working Folder till Source Control Database