Keittiökalustekanta, SQL harjoitteluun

Taulun nimeä näpäyttämällä saat esiin uuteen ikkunaan taulun sisällön.
/* 
Taulu ptype esittelee yrityksen tuotevalikoimaan kuuluvat tuotetyypit 
*/ 

create table ptype ( 
ptypeid varchar(8) not null primary key,  // tuotetyypin tunnus
productname varchar(40)                   // tuotetyypin nimi
);

/* 
Taulussa Model esitellään mallisarjat. 
Samaa tuotetta voidaan valmistaa useassa eri sarjassa. 
*/ 

create table model ( 
modelid varchar(12) not null primary key,  // mallisarjan tunnus
modelname varchar(30) );                   // mallisarjan nimi

/* 
Taulussa unit määritellään tarjolla olevat perustuotteet.
Näistä voidaan koota isompia kokonaisuuksia. 
Samaa tuotetta voi olla saatavissa useina eri malli- ja
värivaihtoehtoina. Sarake producttypeid yhdistää tuotteen ja sen
tyyppiin. Sarake unitid yksilöi tuotteen. Tällä hetkellä
tuotetunnuksesta selviää tuotteen tyyppi ja erilaista mittatietoa, 
mutta näin ei välttämättä ole jatkossa. Tuotetiedoissa kerrotaan 
lähinnä tuotteiden mittoja. Mittoja voi puuttua. 
*/ 

create table unit ( 
  unitid varchar(30) not null primary key, // tuotteen tunnus
  producttypeid varchar(12),               // tuotteen tuotetyypin tunnus
  unitname varchar(40),                    // tuotteen nimi
  height decimal(6,2),                     // mittoja, korkeus cm 
  width decimal(6,2),                      // leveys cm
  depth decimal(6,2),                      // syvyys cm
  foreign key (producttypeid) references ptype 
);
 
/* 
Tuoteen valmistukseen käytetty materiaali riippuu tuotetyypista ja 
mallisarjasta. Taulussa modelmaterial voidaan tuotetyyppi, malli -yhdistelmälle
määritellä yksi materiaali. 
*/

create table modelmaterial (
  producttypeid varchar(12) not null,      // tuoteen tyyppitunnus
  modelid varchar(12) not null,            // mallisarjan tunnus
  material varchar(24) not null,           // valmistusmateriaali
  primary key (producttypeid, modelid),
  foreign key (modelid) references model,
  foreign key (producttypeid) references ptype
);

/* 
Tuotteiden värivaihtoehdot on määritelty malliriippuvina. Kaikkia mallin
tuotteita saa kaikissa mallikohtaisesti kiinnitetyissä väreissä. 
*/ 

create table coloring ( 
 modelid varchar(12) not null,            // mallisarjan tunnus 
 color varchar(24) not null,              // värin nimi englanniksi
 primary key (modelid,color), 
 foreign key (modelid) references model
);
 
/* 
Taulussa unitprice määritellään perustuotteiden hinnat yleisimmin kysytyille
tuotteille. Muitakin voi saada tilauksesta. Hinnat riippuvat tuotteesta ja 
mallisarjasta. 
/* 
 
create table unitprice ( 
  unitid varchar(12) not null,            // tuotteen tunnus
  modelid varchar(12) not null,           // mallisarjan tunnus
  price integer not null,                 // hinta euroina (huom kokonaisluku)
  primary key (unitid, modelid),
  foreign key (unitid) references unit, 
  foreign key (modelid) references model 
); 

/* 
Perustuotteita voidaan yhdistää yhdistelmakalusteeksi. Taulussa composition
määritellään joukko valmiita yhdistelmiä. Yhdistelmiin kuuluu lähinnä runkoja,
hyllyjä ja vetolaatikoita. Niihin ei kuulu jalkoja eikä kahvoja. 
Kullakin yhdistelmällä on tunnus ja nimi. 
*/ 

create table composition ( 
  compositionid varchar(12) not null primary key,  // yhdistelmän tunnus
  compositionname varchar(80)                      // nimi
);
 
/* 
Taulussa partof määritellään miten yhdistelmät koostuvat perusosista.
Samaa perusosaa voi olla yhdistelmässä useita kappaleita. 
Sarake partcount ilmoittaa kuinka monta. Yhtä yhdistelmää 
kohden taulussa on useita rivejä.
*/ 

create table partof ( 
  compositionid varchar(12) not null,   // yhdistelmän tunnus
  partid varchar(12) not null,          // yhdistelmään kuuluvan osan tunnus
  partcount integer,                    // osien lukumäärä yhdistelmässä
  primary key (compositionid,partid),
  foreign key (compositionid) references composition, 
  foreign key (partid) references unit 
); 

/* 
Asiakkaat voivat laatia keittiösuunnitelmia suunnittelutyökalulla.
Suunnittelutyökalu kirjaa suunnitelman tauluun PLAN ja suunnitelman sisällön 
tauluun PLANELEMENT. Suunnitelma voidaan haluttaessa muuntaa tilaukseksi. 
Taulun PLAN rivi sisältää sunnitelman tunnustietojen ja erilaisten aikatietojen 
lisäksi myös asiakkaan henkilötiedot. Näitä ei ole sijoitettu omaksi taulukseen 
koska on oletettu, ettei samalla asiakkaalla ole monia suunnitelmia. 
Näin voi kuitenkin olla, jolloin asiakastiedot joudutaan toistamaan.
Tilauksen erottaa pelkästä suunnitelmasta se, että tilauspäivämäärä on 
kirjattu sarakkeeseen dateordered. Toimitetun tilauksen kohdalla on 
myös toimituspäivä kirjattuna.
*/

create table plan ( 
  plannumber integer not null primary key,  // suunnitelman numero
  customername varchar(30) not null,        // asiakkaan nimi
  customerphone varchar(20),                // asiakkaan puhelinnumero
  datemade date not null,                   // milloin suunnitelma on tehty 
  dateordered date,                         // milloin suunnitelma on muutettu 
                                            // tilaukseksi
  howtodeliver varchar(12),                 // miten pitäisi toimitta:
                                            //   home:kotiin, store: liikkeeseen
  whentodeliver date,                       // milloin toimitus halutaan
  whendelivered date,                       // milloin toimitettiin
  customeraddress varchar(64) not null,     // katuosoite
  customercity varchar(64) not null         // kaupunki
); 

/*
Taulussa PLANELEMENT esitetään suunnitelman sisältö: mitä osia 
suunnitelmaan kuuluuu. Suunnitelman osaksi voidaan ottaa joko 
yhdistelmäkalusteita tai erillisiä perustuotteita.
Jos suunniteltu osa on yhdistelmäkaluste, annetaan sen tunnus sarakkeessa 
compositionid. Jos suunniteltu osa on erillinen perustuote, annetaan
sen tunnus sarakkeessa unitid. Yhdellä PLANELEMENT rivillä voidaan 
määritellä vain yhdenlainen osa. Täten toinen sarakkeista compositionid 
tai unitid on aina tyhjä. 

Yhdistelmäkalusteet muodostuvat rungosta ja ovista tai etupaneeleista.
Niiden kohdalla annetaan rungon mallisarja ja väri (sarakkeet bodymodel 
ja bodycolor) sekä erikseen ovien mallisarja ja väri (sarakkeet fronmodel ja
frontcolor). Erillisten perustuotteiden malli ja väri annetaan sarakkeissa 
bodymodel ja bodycolor.  

Sarakkeessa amount kerrotaan montako kertaa osa toistuu suunnitelmassa.  
*/

create table planelement ( 
  plannumber integer not null,      // suunnitelman tunnus
  itemnumber integer not null,      // osan numero suunnitelmman sisällä
  compositionid varchar(12),        // yhdistelmäkalusteen tunnus, jos
                                    // suunniteltu osa on yhdistelmäkaluste,
                                    // muuten tyhjä
  unitid varchar(12),               // perustuotteen tunnus, jos suunniteltu
                                    // osa on perustuote, muuten tyhjä
  bodymodel varchar(12),            // yhdistelmän rungon malli tai
                                    // perustuotteen malli 
  bodycolor varchar(24),            // yhdistelmän rungon väri tai 
                                    // perustuotteen väri
  frontmodel varchar(12),           // yhdistelmän ovien malli
  frontcolor varchar(24),           // yhdistelmän ovien väri
  amount integer,                   // kuinka monta kappaletta
  primary key (plannumber, itemnumber), 
  foreign key (compositionid) references composition, 
  foreign key (unitid) references unit, 
  foreign key (bodymodel,bodycolor) references coloring, 
  foreign key (frontmodel,frontcolor) references coloring 
) ;