Permalänk

Databasdesign

Tjosan!

Jag sitter och funderar på att koda en ehandelslösning. Ett gammalt system på jobbet kommer framöver att behöva bytas efter att ha fulhackats på i 6-7 år av tre generationer sysadmins, och jag tycker dessutom att det vore kul att ha som litet hobbyprojekt att sitta och hacka på utanför arbetstid. Eftersom jag dock även arbetar som konsult då och då, och gärna skulle använda frukten av mitt arbete hos flera kunder om det blir aktuellt, så önskar jag förstås göra hela designen från början så flexibel och utbyggbar som möjligt. Att bygga en webb-bokhandel för att matcha det nuvarande systemet vore hyfsat trivialt - min ambition är att bygga en generell e-handel där alla möjliga typer av produkter skulle kunna säljas.

Kodbiten är jag säker på, har arbetat med programmering länge och väl. Det som jag är lite mer osäker på är bra databasdesign. Det skulle därför vara toppen med lite input på hur ni skulle ha gått tillväga för att implementera följande beskrivning i ett schema, i enlighet med normaliseringsregler och god databasdesign;

1) Det finns ett antal artiklar i systemet
2) Varje artikel tillhör en kategori, och varje kategori kan ha en eller flera artiklar
3) Vilka egenskaper som skall lagras för artiklarna avgörs av vilken kategori de tillhör (ex: "Bilar" har egenskaperna färg, regnr, motorstorlek, "cd-skivor" har egenskaperna artist, genre, årtal).
4) Varje kategori har en egenskap "parent" som avgör överordnad kategori, så att någon form av hierarkisk trädstruktur uppstår.

Ett problem jag ser framför mig är att om egenskaperna knytes till produktkategorierna, och värdena matchande dessa egenskaper knytes till de enskilda artiklarna, hur tusan gör man för att få det att bli rätt? Kategorin "bok" kanske har egenskapen "isbn", men värdet "9125-3467-33" måste ju tillhöra en enskild artikel som i sin tur har kategorin "bok". Hur är relationen mellan artikel och egenskap och egenskaps värde?

Alla med åsikter och kunskaper är supervälkomna att ge sina tips och idéer. Jag kan ha tänkt fel från början, lätt hänt när man försöker applicera objektorienterad design på relationsdatabaser..

W

Permalänk

Den gröna sommaren av Apan
id
isbn_id
kategori_id
övriga_egenskaper

------------------------------
Är det så du menar? För isåfall är det ju bara att berätta vilket 'id' den ska hämta information ifrån. Det borde fungera :0

Visa signatur

Ruby (on rails) är fint!

Permalänk
Medlem

ett alternativ är ju att du har en tabell som bara innehåller egenskaper för rubriker.

kategorin bil har id1
kategorin skiva har id2

då har du en tabell för egenskaper såhär:

id, namn, kategoriid
---------------
1, årsmodell, 1
2, färg, 1
3, regnr, 1
4, år, 2
5, titel, 2
6, artist, 2

då kan du ju lägga till egenskaper till kategorin helt fritt.

Samma sak gör du då också med artiklarna.
Artikelid berättar vilken artikel vi pratar om.
egenskapid berättar vilken egenskap detta värde definierar.

Artikel 1 är en bil
Artikel 2 är en cd
(återanvänder data från tabellen ovanför)

artikelid, egenskapid, värde
------------------------
1, 1, 1996
1, 2, "grön"
1, 3, abc123
2, 4, 2004
2, 5 "en dag på sweclockers"
2, 6, "Totoo"

Detta system förutsätter däremot att alla värden lagras lika, t.ex. en sträng på 60 tecken. Detta passar däremot knappast allt (tunga beskrivningar), så antingen gör du ett eget fält för längre texter, t.ex. att varje produkt har dessa "korta beskrivnignar" samt en egen tabell med långa beskrivningar.

Så skulle jag ha gjort.

Permalänk
Medlem

Databasen med arv

Jag skulle nog lösa det med arv för få mer kontroll över vilka olika egenskapern som varje kategori har.

Fördelarna blir att du kan ha kontroll på vilka värden som måste vara satta för varje kategori. Du kan även lägga till nya fält för varje kategori om det visar sig att det behövs. Du behöver inte heller fundera på parsning av egenskaper.
Och inte minst så kan du lägga till hur många kategorier som du vill utan att behöva ändra i någon annan tabell.

Nackdelen är att du måste göra en ny tabell för varje kategori som du vill skapa. Det är dock inget stort jobb enligt mig. Insättningarna till databasen bör göras med stored procedures för att det gör utvecklingen av klienten mycket lättare.

Jag antar att du kan lite sql så ja skriver koden direkt.
Skrivet för MS SQL Server:

create table vara ( kId int identity(1,1), kSubkat varchar(20) not null check( kSubkat <> ''), PRIMARY KEY(kId) ); create table bil ( kId int, bId int identity(1,1), --massa olika --saker man vill ha --som beskriver en bil foreign key(kId) references kategori(kId), primary key(bId, kId) );

"vara" är tabellen där alla varor ligger. Där kan man lägga till fler gemensamma egenskaper som tex Artikelnummer etc. kSubkat-kolumnen är tänkt att innehålla namnet på den "child"-tabell som informationen om själva varan ligger i, tex "bil"

I "bil"-tabellen finns alla fält som beskriver en bil.
När en ny kategori skall läggas till kan denna tabell användas som template.

Nu kan man köra "SELECT * FROM bil" och få fram alla bilar med alla deras attribut.

Permalänk
Inaktiv

Denna artikel är bra http://www.phlonx.com/resources/nf3

Tar upp hur normalisering fungerar.

Sen har du http://en.wikipedia.org/wiki/Database_normalization

Permalänk

Tack för alla bra tips och hintar - jag hinner inte just nu utveckla eventuella kommentarer/frågor/funderingar, men ska ta till mig av råden och skriver lite senare ikväll eller imorgon när jag tänkt igenom saker och ting.

/W