Avatar billede califfo Nybegynder
11. december 2006 - 13:03 Der er 38 kommentarer og
1 løsning

DB-design

Hej gutter

Jeg har gang i et lille projekt. Jeg er ved at designe en DB. Da jeg ikke er så skarp i det, håber jeg at I vil guide mig lidt i den rigtige retning.

Jeg har sammen med nogle venner startet en fodboldklub. Næsten som en tradition er der ved afslutningen af hver sæson, mange spillere der vil gøre krav på titlen som årets topscorer. Ved at nedskrive målscorere og andre oplysninger for hver kamp vi spiller, kan man regne sig frem til dette, men det kunne da være sjovere, og nok også nemmere hvis jeg fik en database til at klare det for mig. Jeg har tænkt mig at lave en DB der indeholder flere data og vil nu se hvordan dette gøres optimalt.

Her er en beskrivelse af de data jeg forventer at DB’en skal indeholde.

SpillerInfo. Indeholder specifikke data om spilleren.
-Unikt spillerID – Hver gang en ny spiller oprettes i DB’en, skal -der oprettes et unikt ID.
-Fornavn
-Efternavn
-Email-adresse
-Brugerlogin
-Password

KampData. Indeholder data om alle kampe.
-KampID – unikt ID som der kan refereres til.
-Dato – for hvornår kampen bliver/blev spillet
-Resultat – Vi vil jo gerne vide hvad kampen endte.

MaalData. Data om hvert enkelt mål.
-Maal_ID – ID som senere kan bruges i referenceøjemed.
-Tidspunkt – Efter hvor mange minutter blev dette mål scoret?

AddresseData.
-Vejnavn
-Husnummer

PostnrBy.
-Postnr
-By

Jeg vil nu prøve at beskrive relationerne mellem tabellerne.

For hver kamp skal der være en række i tabellen KampData. Resultatet kan selvfølgelig først skrives ind når kampen er slut. Rækkerne i MaalData repræsenterer hvert mål der bliver scoret og refererer til KampID. Alle mål der bliver scoret har en reference til den spiller der scorer der pågældende mål. Referencen er SpillerID. Alle kampe bliver spillet på en lokation med en adresse. Alle spillere har en adresse. Adresser kan indtastes i AdresseData. AdresseData har også en reference til PostnrBy da man både kan finde frem til by via postnr, men også til postnr hvis man kender bynavnet.

Jeg har uploadet et ER-diagram som gerne skulle beskrive ovenstående.

http://califfo.dk/img/ER_diagram.jpg

Er jeg helt galt på den med det jeg har lavet indtil nu eller mangler der bare lidt rettelser?
Avatar billede teepee Nybegynder
11. december 2006 - 13:44 #1
Umiddelbart ville jeg nok sige at en kamp foregår mellem to Hold, som hver har en hjemmeadresse tilknyttet. Kunne måske bare udvidde Adresse til Hold. Dit nuværende diagram viser en mange-til-mange mellem kamp og adresse, men en kamp foregår da vist kun ét sted ad gangen ;-)
Avatar billede califfo Nybegynder
11. december 2006 - 13:51 #2
Hmmm,... det lyder korrekt. Hvad synes du ellers om designet? Jeg har ikke så høje tanker om mine egne evner på dette område, så det vil da overraske mig meget hvis der ikke skal rettes mere.
Avatar billede teepee Nybegynder
11. december 2006 - 15:08 #3
Der er intet i vejen for at du starter med en simpel datamodel som kan det meste. Hvis du selv synes at du har fået det hele med, så ville jeg starte med at implementere dette. Jeg kan ikke slev lige se om der skulle mangle noget...
Avatar billede califfo Nybegynder
11. december 2006 - 15:22 #4
Cool. Jeg prøver at implementere det. Du er sikret dine point, men jeg håber du stadig bliver hængene,...
Avatar billede teepee Nybegynder
11. december 2006 - 15:25 #5
Du spørger bare løs...
Avatar billede califfo Nybegynder
13. december 2006 - 08:01 #6
Hej igen

Jeg har nu lavet tabellerne i min Oracle SQL editor, men jeg får nogle underlige fejlmeddelelser som jeg ikke kan tyde.

____

INSERT INTO "XXXX"."POSTNRBY" (BY, POSTNR) VALUES ('Herlev', '2730')
INSERT INTO "XXXX"."POSTNRBY" (BY, POSTNR) VALUES ('Vanløse', '2720')

2 errors saving changes to table "K02618"."POSTNRBY":
Row 1: ORA-06550: linje 1, kolonne 40:
PL/SQL: ORA-00928: manglende SELECT-nøgleord
ORA-06550: linje 1, kolonne 7:
PL/SQL: SQL Statement ignored
Row 2: ORA-06550: linje 1, kolonne 40:
PL/SQL: ORA-00928: manglende SELECT-nøgleord
ORA-06550: linje 1, kolonne 7:
PL/SQL: SQL Statement ignored

____

Hvad gør jeg galt?
Avatar billede califfo Nybegynder
13. december 2006 - 08:01 #7
...Det sker kun i denne tabel. De andre er der ingen problemer med.
Avatar billede califfo Nybegynder
13. december 2006 - 09:01 #8
Damn,... Det er sværere at arbejde med editoren end jeg troede. Jeg kan ikke få lov til at lave fremmednøgler. Lortelort!
Avatar billede teepee Nybegynder
13. december 2006 - 10:34 #9
Prøv lige at fjerne dine dobbeltplinger omkring schemae og tabelnavn. Afslut med semikolon (;) Hvis det ikke virker, så lave lige en describe af tabellen (desc xxxx.postnrby;)
Avatar billede califfo Nybegynder
13. december 2006 - 11:37 #10
Jep. Det hjalp.

Jeg startede forfra og skriver nu alle kommandoerne i hånden og tester på en online SQL-server og kaster bare kommandoerne i fjæset på den. Det virker fint indtil videre.
Avatar billede califfo Nybegynder
13. december 2006 - 11:40 #11
Så er den gal igen. Jeg laver følgende input

INSERT INTO spillerinfo (spillerid, f_navn, e_navn, bruger_login, passw, email)
VALUES (1, xxx, xxx, xx, xx, xx@xxx.dk);

Fejlbeskeden lyder:

"FEJL i linie 2:
ORA-02019: forbindelsesbeskrivelse for ekstern database er ikke fundet "

Der er en * under sidste felt med email-adressen.
Avatar billede califfo Nybegynder
13. december 2006 - 13:29 #12
Her går det også galt:

INSERT INTO postnrby (postnr, bydel) VALUES (2730, Herlev);

"FEJL i linie 1:
ORA-00984: kolonne er ikke tilladt her"

Der er en * under sidste felt hvor der står "Herlev"
Avatar billede teepee Nybegynder
13. december 2006 - 13:56 #13
Du skal lige skrive Herlev i enkeltplinger: 'Herlev' og postnummer med mindre at det er et number felt.
Avatar billede califfo Nybegynder
13. december 2006 - 14:03 #14
Tak.

Begynderfejl!!!
Avatar billede califfo Nybegynder
13. december 2006 - 14:14 #15
Og denneher?

FEJL i linie 1:
ORA-00932: inkonsistente datatyper: forventede DATE fik NUMBER

INSERT INTO kampdata (kampid, resultat, dato) VALUES (1, 4-4, 2006-06-16)



... Tabellen ser således ud:

CREATE TABLE kampdata
(kampid CHAR,
resultat CHAR(5),
dato DATE
);
Avatar billede teepee Nybegynder
13. december 2006 - 14:41 #16
Du kan ikke parse det som en date med midre du bruger session variable eller formaterer:
INSERT INTO kampdata (kampid, resultat, dato) VALUES ('1', '4-4', to_date('2006-06-16','YYYY-MM-DD'));
Avatar billede califfo Nybegynder
13. december 2006 - 15:00 #17
Ahhh,... tak!
Avatar billede califfo Nybegynder
15. december 2006 - 11:58 #18
Hej igen

Jeg har nu ændret lidt i ER-diagrammet og tilføjet en beskrivelse af det. Jeg vil sætte stor pris på det, hvis der er nogen som vil kigge på det og kommentere på det.

ER-diagram: www.califfo.dk/proj/ER_diagram.jpg
ER-Beskrivelse: www.califfo.dk/proj/Beskrivelse_af_ER.doc
Avatar billede teepee Nybegynder
15. december 2006 - 12:03 #19
Du kunne måske godt udvidde lide med hvem der har spillet hvornår. Man kan jo ikke se om folk har scoret 1 mål i 1 kamp, eller 1 mål i 53 kampe. Spiller I mod andre eller mellem hinanden? Vil du registrere udeholdets mål også? Måske bare lave en fiktiv "spiller" som scorer udemålene....
Avatar billede califfo Nybegynder
15. december 2006 - 12:14 #20
Mht hvem der har spillet hvornår, har jeg måske bare brug for en reference fra spiller til kampid, som så indikerer at spilleren har været på banen i den pågældende kamp. På den måde har jeg både antal kampe spilleren har spillet, hvor mange mål spilleren har scoret, samt i hvilken kamp målet/målene er scoret.

Jeg har i første omgang ikke tænkt mig at registrere modstandernes mål.

Dette er et lille skoleprojekt som desværre skal afleveres på mandag. Jeg havde i første omgang opgivet at nå at lave det færdigt, men har bestemt mig for at tage chancen.
Avatar billede califfo Nybegynder
15. december 2006 - 12:18 #21
...Har lige opdateret www.califfo.dk/proj/ER_diagram.jpg
Avatar billede teepee Nybegynder
15. december 2006 - 12:28 #22
Husk at dine mange til mange relation mellem kamp og spiller ikke kan implementeres fysisk uden en relationel tabel mellem dem. Ligesom måldata.
Avatar billede califfo Nybegynder
15. december 2006 - 12:31 #23
Hmmm,...

Jeg er ikke helt med. Som jeg ser det, kan en spiller spille n kampe. Det samme gælder for en kamp som kan have n spillere.

Hvad vil du foreslå som relationel tabel?
Avatar billede teepee Nybegynder
15. december 2006 - 12:36 #24
Hvordan vil du gemme at spiller x spillede med i kamp 1,2,3 og spiller y spillede med i 3,4,5? Det gør du ved at sætte en tabel imellem de to og have en id til kamp og til spiller. Med andre ord bliver din n-n relation til en tabel med to 1-n relationer til kamp hhv. spiller.
Avatar billede califfo Nybegynder
15. december 2006 - 12:37 #25
Ahhh,... nu er jeg med. Den skulle bare lige rotere et par gange. Opdatering følger,...
Avatar billede califfo Nybegynder
15. december 2006 - 12:42 #26
www.califfo.dk/proj/ER_diagram.jpg er opdateret. Var det sådan du mente det? Kan det så passe at attributterne i den nye tabel er primærnøglerne i "kampdata" og "spillerinfo"?
Avatar billede teepee Nybegynder
15. december 2006 - 13:30 #27
Ja, men jeg tror at dine relationer skal vende omvendt. Hvis man bruger kragetæer så skal de begge pege hen på den nye entitet. Og så synes jeg at dine betegnelse for entiteten er lidt misvisende. måske at du skal kalde den spillerkampdata el. lign.
Avatar billede califfo Nybegynder
15. december 2006 - 13:43 #28
Sådan her: www.califfo.dk/proj/ER_diagram.jpg ?

"...Hvis man bruger kragetæer så skal de begge pege hen på den nye entitet..." Det udtryk har jeg ikke hørt før i denne sammenhæng, men jeg tror jeg har forstået det nu.

Jep. Betegnelsen for entiteten var ikke så god. "spillerkampdata" er bedre.
Avatar billede teepee Nybegynder
15. december 2006 - 13:52 #29
Jeg tror at vi skal stoppe designet her, så du kan blive færdig med opgaven.
Det ser godt ud. Husk dog på at det nu er en fysisk model som du har tegnet. Før var det en logisk model. Det er meget vigtigt at du gør opmærksom på forskellen i din opgavebesvarelse. Mange-til-mange relationer må godt forekomme i den logiske model.
Avatar billede califfo Nybegynder
15. december 2006 - 13:58 #30
Ok,... tak. Jeg opretter lige DB'en med alle tabeller og vender så tilbage. Tusind tak for din hjælp indtil videre. Den er uvurderlig. Det er superfedt at få så god hjælp.
Avatar billede califfo Nybegynder
15. december 2006 - 14:22 #31
DROP TABLE spillerinfo;
DROP TABLE gruppeinfo;
DROP TABLE kampdata;
DROP TABLE maaldata;
DROP TABLE spillerkampdata;
DROP TABLE adressedata;
DROP TABLE postnrby;


CREATE TABLE spillerinfo
(spillerid SMALLINT,
fnavn CHAR(30),
enavn CHAR(40),
brugerlogin CHAR(20),
passw CHAR(50),
email CHAR(50),
grpid SMALLINT,
CONSTRAINT 'ID' PRIMARY KEY ('spillerid') ENABLE
);

CREATE TABLE gruppeinfo
(rettigheder SMALLINT
);

CREATE TABLE kampdata
(kampid CHAR,
resultat CHAR(5),
dato DATE
CONSTRAINT 'ID' PRIMARY KEY ('kampid') ENABLE
);

CREATE TABLE maaldata
(maalid SMALLINT,
tidspunkt SMALLINT
CONSTRAINT 'ID' PRIMARY KEY ('maalid') ENABLE
);

CREATE TABLE spillerkampdata
();

CREATE TABLE postnrby
(postnr SMALLINT,
bydel CHAR(50)
);

CREATE TABLE adressedata
(vejnavn CHAR(50),
husnummer CHAR(6)
);

---------------------

Nu ser min DB således ud. Jeg får dog nogle fejl i forb. med mine primary keys. Hvad har jeg gjort forkert?

Fejlbeskederne er:


CONSTRAINT 'ID' PRIMARY KEY ('spillerid') ENABLE
          *

FEJL i linie 9:
ORA-00902: ugyldig datatype
Tabel er oprettet.

CONSTRAINT 'ID' PRIMARY KEY ('kampid') ENABLE
          *

FEJL i linie 5:
ORA-02250: manglende eller ugyldigt begrænsningsnavn

CONSTRAINT 'ID' PRIMARY KEY ('maalid') ENABLE
          *

FEJL i linie 4:
ORA-02250: manglende eller ugyldigt begrænsningsnavn
Avatar billede teepee Nybegynder
15. december 2006 - 14:33 #32
Drop plingerne ved ID ('ID') og så skal dine constraints hede noget forskelligt.
Typisk ville jeg skrive [TABELNAVN]_PK
Spillerkampdata skal indeholde kampid og spillerid med tilhørende foreign keys:

ALTER TABLE SPILLERKAMPDATA ADD (
CONSTRAINT SPILLER_FK
FOREIGN KEY (SPILLERID)
REFERENCES SPILLERINFO (SPILLERID));

Plus én mere for kamp, men opret lige to kolonner først.
Avatar billede califfo Nybegynder
15. december 2006 - 14:34 #33
Har fundet et par komma-fejl i 2 af tabellerne, men der er stadig fejl.
Avatar billede califfo Nybegynder
15. december 2006 - 14:35 #34
Ok,...
Avatar billede califfo Nybegynder
15. december 2006 - 14:55 #35
I stedet for at paste al koden ind, har jeg lagt den ud på min hjemmeside.

www.califfo.dk/proj/projekt_CreateTables.txt

Jeg får kun fejl i forbindelse med sletning og oprettelse af de 2 tabeller der har primærnøgler som er fremmednøgler i "spillerkampdata".
Avatar billede teepee Nybegynder
15. december 2006 - 14:59 #36
Du kan tilføje ON DELETE CASCADE til slutningen af dine to foreign keys. Så bliver relationen automatisk slettet hvis du sletter fra spiller eller kamptabellen
Avatar billede califfo Nybegynder
15. december 2006 - 15:04 #37
Yes! Den kommando har jeg hørt før. Tak.
Avatar billede califfo Nybegynder
15. december 2006 - 15:09 #38
Er det ikke sådan her du mener det skal se ud?

ALTER TABLE spillerkampdata ADD
(CONSTRAINT spiller_fk
FOREIGN KEY (spillerid)
REFERENCES spillerinfo (spillerid)
ON DELETE CASCADE
);

ALTER TABLE spillerkampdata ADD
(CONSTRAINT kamp_fk
FOREIGN KEY (kampid)
REFERENCES kampdata (kampid)
ON DELETE CASCADE
);

Jeg får nemlig fejl disse 2 fejl 2 gange. Når der slettes og når der oprettes.

FEJL i linie 1:
ORA-02449: entydige/primære nøgler i tabel refereres af fremmede nøgler
Tabel er droppet.

FEJL i linie 1:
ORA-00955: navn bruges allerede af et eksisterende objekt
Tabel er oprettet.
Avatar billede califfo Nybegynder
15. december 2006 - 21:51 #39
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester