21. januar 2003 - 10:40Der er
43 kommentarer og 1 løsning
E-Shop / Varesystem
Hejsa...
Der findes jo utallinge e-shoppe efterhånden, så nu ville jeg se om jeg kunne lave noget ala det, sådan bare for sportens skyld! :)
Men mit spørgsmål er, hvordan man bygger det rent database mæssigt? Jeg har hørt om 2 muligheder...
1: Man laver en table med alle varegrupperne og giver dem et nr. Så laver man en table med alle varerne som så får en id som passer til det varegruppe nummer, som varen er.
Men sådan en database må da, hvis man nu ex har 2500 forskellige vare, tage lang tid at søge i og hente fra? God nok skal de kun tage en række ud, hvor id'en er den varegruppe, men alligevel skal den jo tjekke hele db'en?
2: Man opretter en table per varegruppe. Men så kan man ende med en masse varegrupper? Men det må da give de hurtigste svar tider?
Nogen idéer derude? Er jeg helt galt på den? Skal man gøre det må en 3. måde?
Jeg lavde en gang en webshop som eksamens projekt i programering og IT på HTX, den var vist nok lavede sådan her:
jeg havde lavet et system hvor alle varene havde en vare_id, navn, info, indkøbespris, udsalgspris og kategori. en anden database som havde indkøbes kurv, den havde vare_id og session nummer (som var styreet af PHP) jeg kan ikke huske om der også var en id på indkøbskurven.så var der en database med købte vare, der havde id, vare_id, navn, addresse og dato
tablerne var linket sammen sådan her: vare_id i tablen vare til vare_id i indkøbskurv vare_id i tablen vare til vare_id i solgt vare
Der kunne godt laves med en varegrupper, men da alle vare har en vare gruppe, vil det nok ikke vare nogle vildt stor fordel, måske hvis der er VILDT mange vare, og tabellerne dermed bliver mindre, men jeg tror ikke det er nødvendig i langt de fleste tilfælde.
Jeg havde forresten nogle flere felter i vare: Et binær felt til foto Et felt til at markere om vare var på udsalg, hvilket var en fordel, når forsiden skulle laves og slagtilbud vises. Et felt med antal vare på lagere Et felt med det antal vare, som betød at man skulle bestille flere hjem, en fordel, da ikke alle vare er nødvendig at havde ligemange hjemme af.
grunden til 3 og 4 er splittet op er, at ikke alle køber lige mange vare og det vil være spild af plads, af alle slogt vare skulle indeholde alle informationerne om den der havde købt den
i tabel 1. er det også en god ide at have "bestil_antal" som kan bruges til at lave bestillings lister til leverandøren, da du jo gerne vil bestille nye vare hjem inden du løber tør, men ikke alle vare har den samme grænse, du vil jo nok ikke havde 100 50ports switche hjemme, men gerne 100 fx CD cover eller 50 5meters netværkskabler ;-)
i table 2. vare_id og session nummer ikke kunde_id, da det ikke kommer i spil før kunde tjekker ud. Session nummeret styrede jeg via PHP sessions.
Til et af dine første spørgsmål. "Skal den jo tjekke hele db'en?": En database indekserer dine data så den ikke skal løbe hele datasættet igennem for at finde en indgang. Derfor skal du ikke regne med at det tager ret lang tid at finde den indgang du søger. Slet ikke hvis du laver en søgning på en key. Database har en træstryktur til deres data. Jeres layout virker fint nok men det skal dog lige overvejes om der er nogle data som er tilknyttet kategorien ud over navnet. Det kunne være en forklaring på kataegorien, en fragtpris for varer i kategorien. Hvis dette er tilfældet ville det være smartest at lave en tabel til kategorierne alene med disse data i men hvis dette ikke er tilfældet er det i foreslår det bedste.
Er jeg helt ude og sk***... ? :) (se bort fra int og varchar, dem retter jeg senere)
CREATE TABLE shop_products ( id varchar(32) NOT NULL default '', name varchar(128) NOT NULL, descript varchar(128) NOT NULL, in_price int(16) NOT NULL, out_price int(16) NOT NULL, group int(4) NOT NULL, photo binary( hvad skal der så stå her) NOT NULL, offer boolan( hvad skal der så stp her) NOT NULL, store int(16) NOT NULL, PRIMARY KEY (id) ) TYPE=MyISAM;
CREATE TABLE shop_basket ( session_id varchar(32) NOT NULL default '',
er lidt lost her
PRIMARY KEY (id) ) TYPE=MyISAM;
CREATE TABLE shop_customer ( customer_id varchar(32) NOT NULL default '', f_name varchar(128) NOT NULL, l_name varchar(128) NOT NULL, address1 varchar(128) NOT NULL, address2 varchar(128) NOT NULL, zipcide int(4) NOT NULL, town varchar(128) NOT NULL, phone int(11) NOT NULL, cellphone int(11) NOT NULL, PRIMARY KEY (id) ) TYPE=MyISAM;
CREATE TABLE shop_orders ( vare_id varchar(32) NOT NULL default '', customer_id varchar(128) NOT NULL, date int(12) NOT NULL, id int(12) NOT NULL, PRIMARY KEY (id) ) TYPE=MyISAM;
haestrup >> selvom databasen er indelseret og ikke alt skal løbes igennem, skal tabellen stadig inlæses, hvilket betyder at størrelse har betydning, men først når de bliver MEGET store. alternativ til at lave kategorier ville være at lave et felt med vægt og en anden med fragt priser for diveres vægtklasser
shadowsurfer >> I havde vel ikke tænkt jer at vise hele tabellen i jeres program hver gang i skal vise jeres varer? For så kan I lige så godt ligge dataen i XML filer.
haestrup >> Det er LANG tid siden jeg lavde det ;-) Jeg vist kun kategorierne. også dem der var tilbud på, på forsiden.
Jeg kender desvære ikke noget til XML, men database elsker som jeg er, kan jeg godt lig at bruge MySQL.... men det er nok ved at være på tide at lære XML ;-)
min pointe var at hvis man har noget data som hører til kategorien så skal man helst lave en kategori tabel for sig så man i fremtiden ikke skal ændre en masse steder men kun i denne tabel og kun ved den ene indgang som har den kategori. Det er simpelthen for at undgå redundans.
din shopping basket skal jo have en liste af ID som er de varer som man vil købe. Det ville nok være bedste hvis du enten ligger den i en cookie eller ligger den på harddisken på din server. Det er nok lidt kluntet at ligge det i databasen.
Jeg havde photone i databasen, det var lettet, men man kunne lige så godt skrive addressen på dem også ligge dem i et dir. smags sag, jeg vil gerne havde tingene samlet ;-) andre en lille hurtig database ;-)
tingene kunne sikket godt ligges i en session. det kunne jeg ikke finde ud af da jeg lavde den (og har sådan set ikke læst op på de siden). min tabel 2 havde: vare_id, session_id (lavet via php)
som sagt kan jeg godt lig at havde tingene samlet, men det er en smags sag, men det er måske smartere at ligge det hele i en sesssion!
Hver bruger får en session_id som han så gennem hele hans interaktion med dit site. Du gemmer altså en kurv for hver session_id. Så skal du selvfølgelig have noget med timeout sat op så dine sessions bliver slettet igen efter noget tid men det gør php vist for dig. Det er lang tid siden jeg har brugt php ;-)
Hvis PHP virker som andre scriptsprog så vil den forsøge at gemme session data i en cookie, URL encoded eller på disken på serveren. Når man så tilgår din side får man et session_id som følger en ved hver transaktion. Derfor ved PHP hvilke data der hører til hvilke sessions.
Ja men så kommer det egentlige problem. Forskellige leverandører har de samme produkter men hvordan afgør man om to produkter er ens hvis man ikke selv skal sidde og sige god for dem allesammen?
# # Sådan som jeg (husker) lavde shop_basket på dennemåde # CREATE TABLE `shop_basket`( `id` INT NOT NULL , `session_id` VARCHAR( 32 ) NOT NULL , `product_id` INT NOT NULL , PRIMARY KEY (id) ) TYPE=MyISAM;
# # Sådan som jeg (husker) laved shop_products på dennemåde: # CREATE TABLE `shop_products` ( `product_id` INT NOT NULL , `name` VARCHAR( 15 ) NOT NULL , `descript` TEXT NOT NULL , `in_price` MEDIUMINT( 16 ) NOT NULL , `out_price` VARCHAR( 16 ) NOT NULL , `group` VARCHAR( 10 ) NOT NULL , `photo` BLOB NOT NULL , `sale` ENUM( 'Y', 'N' ) NOT NULL , `store` SMALLINT NOT NULL , PRIMARY KEY ( `product_id` ) )TYPE=MyISAM;
# # Sådan som jeg (husker) laved shop_products på dennemåde: # CREATE TABLE `shop_products` ( `product_id` INT NOT NULL , `name` VARCHAR( 15 ) NOT NULL , `descript` TEXT NOT NULL , `in_price` MEDIUMINT( 16 ) NOT NULL , `out_price` VARCHAR( 16 ) NOT NULL , `group` VARCHAR( 10 ) NOT NULL , `photo` BLOB NOT NULL , `sale` ENUM( 'Y', 'N' ) NOT NULL , `store` SMALLINT NOT NULL , `ordermore` SMALLINT NOT NULL , `primary_dealer` VARCHAR( 10 ) NOT NULL , # Denne skal være smallint hvis du laver en dealer database PRIMARY KEY ( `product_id` ) )TYPE=MyISAM;
ok.. Der er lige en ID som jeg ikke lige hvad den laver... Ser i nogle fejl så må i life sige til...
CREATE TABLE shop_products ( product_id INT (16) NOT NULL , name VARCHAR (15) NOT NULL , descript TEXT NOT NULL , in_price MEDIUMINT (16) NOT NULL , out_price MEDIUMINT (16) NOT NULL , group VARCHAR (10) NOT NULL , photo BLOB NOT NULL , sale ENUM ('Y','N') NOT NULL , store SMALLINT NOT NULL , ordermore SMALLINT NOT NULL , primary_dealer SMALLINT (8) NOT NULL , PRIMARY KEY (product_id) ) TYPE=MyISAM;
CREATE TABLE shop_basket( id INT NOT NULL , session_id VARCHAR (32) NOT NULL , product_id INT NOT NULL , PRIMARY KEY (id) ) TYPE=MyISAM;
CREATE TABLE shop_orders ( vare_id VARCHAR (32) NOT NULL default '', customer_id VARCHAR (128) NOT NULL, date INT (12) NOT NULL, id INT (12) NOT NULL, # Hvad er det for en ID?? PRIMARY KEY (vare_id) ) TYPE=MyISAM;
CREATE TABLE shop_customer ( customer_id VARCHAR (32) NOT NULL default '', f_name VARCHAR (128) NOT NULL, l_name VARCHAR (128) NOT NULL, address1 VARCHAR (128) NOT NULL, address2 VARCHAR (128) NOT NULL, zipcide INT (4) NOT NULL, town VARCHAR (128) NOT NULL, phone INT (11) NOT NULL, cellphone INT (11) NOT NULL, PRIMARY KEY (customer_id) ) TYPE=MyISAM;
CREATE TABLE shop_dealer ( dealer_id SMALLINT (8) NOT NULL default '', f_name VARCHAR (128) NOT NULL, l_name VARCHAR (128) NOT NULL, address1 VARCHAR (128) NOT NULL, address2 VARCHAR (128) NOT NULL, zipcide INT (4) NOT NULL, town VARCHAR (128) NOT NULL, phone INT (11) NOT NULL, cellphone INT (11) NOT NULL, PRIMARY KEY (dealer_id) ) TYPE=MyISAM;
Der var en id, for at hvade en uniq, i såfald ville den se sådan her ud:
CREATE TABLE shop_orders ( vare_id VARCHAR (32) NOT NULL default '', customer_id VARCHAR (128) NOT NULL, date INT (12) NOT NULL, id INT (12) NOT NULL, PRIMARY KEY (id) ) TYPE=MyISAM;
Men det kan også godt laves, hvor allesammen til sammen er uniq: CREATE TABLE shop_orders ( vare_id VARCHAR (32) NOT NULL default '', customer_id VARCHAR (128) NOT NULL, date INT (12) NOT NULL, PRIMARY KEY ( `vare_id` , `customer_id` , `date` ) ) TYPE=MyISAM;
så er din primary en kombination af alle sammen. Den øvereste er nok den lettet og arbejde med, mens den nedereste er den smarteste
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.