Avatar billede wessydk Nybegynder
08. november 2007 - 09:28 Der er 6 kommentarer

relations database har brug for hjælp.

Jeg er i gang med at lave en spil database. Til dette formål bruger jeg Microsoft SQL server 2005.

Jeg har fået lavet tabellerne men har problemer med at få lavet relationer mellem de forskellige tabeller. Jeg har 6 tabeller disse kan ses i den vedlagte kode. Det er første gang jeg arbejder med relationsdatabaser så jeg er lidt forvirret har dog læst om det, men mit problem er nok mere forståelsen af hvordan jeg skal skrive det i kode.

Hvis der er en der kan forklare/vise mig hvordan det hele hænger sammen ville jeg være lykkelig jeg har lagt den kode som jeg har nederst i denne tråd.

Tabellerne:

Tabel forhandler:
forID
for_navn
spilID
adrID

Tabel producent:
proID
pro_navn
adrID

Tabel genre:
genID

Tabel information:
infID
beskrivelse
rating
billede

Tabel adresse:
adrID
city
post-nr
region

Tabel spil:
spilID
spil_navn
proID
infID

Det burde være muligt at se hvilken tabeller jeg havde tænkt mig at lave relationer imellem hvis man ser på de ID der er i de forskellige tabeller. Ved godt det kan virke lidt forvirrende.


Min SQL kode.
-------------------------------------------------------------------------------------------------------------------

    drop table forhandler
    drop table producent
    drop table genre
    drop table adresse
    drop table information
    drop table spil

    create table forhandler
(

    forID int, -- forhandler ID
    for_navn varchar(50),
    adrID int,
    spilID int,

    constraint forhandler_forID_pk primary key (forID),
    --constraint forhandler_adrID_fk foreign key (adrID) references adresse (adrID),
   
)
    go

    create table producent
(   

    proID int, -- producent ID
    pro_navn varchar(50),
    adrID int,

    constraint producent_proID_pk primary key (proID),   
)
    go

    create table genre

(
    genID int, -- genre ID
    gen_navn varchar(50),
    fps varchar(50),
    mmorpg varchar(50),
    sport varchar(50),
    platform varchar(50),

    constraint genre_genID_pk primary key (genID),
)
    go
   
    create table adresse
(
    adrID int,    -- Adresse ID
    vej varchar(50),
    hus_nr int,
    sal int,
    city varchar(50),
    post_nr int,
    region varchar(50),

    constraint adresse_adrID_pk primary key (adrID),
)
    go
   
    create table information
(
    infID int,            -- Information ID
    beskrivelse varchar(250),
    rating varchar(10),
    billede varchar(500),

    constraint information_infID_pk primary key (infID),
)    
    go

    create table spil
(
    spilID int,                -- Spil ID
    spil_navn varchar(50),               
    proID int,
    infID int,

    constraint spil_spilID_pk primary key (spilID),
   
    constraint spil_proID_fk foreign key (proID) references producent (proID),
    constraint spil_infID_fk foreign key (infID) references information (infID),   
)

    select * from forhandler
    select * from producent
    select * from genre
    select * from adresse
    select * from information
    select * from spil
Avatar billede hrc Mester
08. november 2007 - 10:08 #1
Du mangler en relation mellem spil og forhandler. En forhandler kan godt sælge flere spil.

Det er dumt at have en adresse-tabel som man refererer til. Flyt det ud i forhandler og producent-tabellerne. Sandsynligheden taler også for at de to slet ikke bliver ens, da producenterne tit bor udenlands, mens forhandlerne er danske.

Dit "billede"-felt er enten misvisende eller af forkert type. Der findes en type "image" der kan gemme billeder. Vil du kun gemme ét billede pr. spil?

Genre-tabellen mangler et navn og en reference fra spil-tabllen.

Din spiltabel bør indeholde beskrivelsen. Du kan droppe information-tabellen.

Ang. rating. Er det ikke smartere med et heltal der angiver karakteren?

Du behøver ikke give din primær nøgle et navn der indeholder tabellens navn. Det ved vi godt.

Linker lige det script jeg fik genereret da jeg oprettede tabellerne (tænkte at det var lettest den vej)

if exists (select * from dbo.sysobjects where id = object_id(N'[genre]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [genre]
GO

CREATE TABLE [genre] (
    [ID] [int] NOT NULL ,
    [Navn] [varchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
    CONSTRAINT [PK_genre] PRIMARY KEY  CLUSTERED
    (
        [ID]
    )  ON [PRIMARY]
) ON [PRIMARY]
GO



if exists (select * from dbo.sysobjects where id = object_id(N'[information]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [information]
GO

CREATE TABLE [information] (
    [ID] [int] IDENTITY (1, 1) NOT NULL ,
    [beskrivelse] [text] COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
    [rating] [int] NULL ,
    [billede] [image] NULL ,
    CONSTRAINT [PK_information] PRIMARY KEY  CLUSTERED
    (
        [ID]
    )  ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO



if exists (select * from dbo.sysobjects where id = object_id(N'[postnr]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [postnr]
GO

CREATE TABLE [postnr] (
    [ID] [int] IDENTITY (1, 1) NOT NULL ,
    [postnr] [varchar] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
    [postby] [varchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
    CONSTRAINT [PK_postnr] PRIMARY KEY  CLUSTERED
    (
        [ID]
    )  ON [PRIMARY]
) ON [PRIMARY]
GO



if exists (select * from dbo.sysobjects where id = object_id(N'[adresse]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [adresse]
GO

CREATE TABLE [adresse] (
    [ID] [int] IDENTITY (1, 1) NOT NULL ,
    [adresse1] [varchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
    [adresse2] [varchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
    [post_ID] [int] NULL ,
    [region] [varchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
    CONSTRAINT [PK_adresse] PRIMARY KEY  CLUSTERED
    (
        [ID]
    )  ON [PRIMARY] ,
    CONSTRAINT [FK_adresse_postnr] FOREIGN KEY
    (
        [post_ID]
    ) REFERENCES [postnr] (
        [ID]
    ) ON DELETE CASCADE  ON UPDATE CASCADE  NOT FOR REPLICATION
) ON [PRIMARY]
GO



if exists (select * from dbo.sysobjects where id = object_id(N'[forhandler]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [forhandler]
GO

CREATE TABLE [forhandler] (
    [ID] [int] IDENTITY (1, 1) NOT NULL ,
    [adresse_ID] [int] NULL ,
    [navn] [varchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
    CONSTRAINT [PK_forhandler] PRIMARY KEY  CLUSTERED
    (
        [ID]
    )  ON [PRIMARY] ,
    CONSTRAINT [FK_forhandler_adresse] FOREIGN KEY
    (
        [adresse_ID]
    ) REFERENCES [adresse] (
        [ID]
    ) NOT FOR REPLICATION
) ON [PRIMARY]
GO



if exists (select * from dbo.sysobjects where id = object_id(N'[producent]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [producent]
GO

CREATE TABLE [producent] (
    [ID] [int] NOT NULL ,
    [navn] [varchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
    [adresse_ID] [int] NOT NULL ,
    CONSTRAINT [PK_producent] PRIMARY KEY  CLUSTERED
    (
        [ID]
    )  ON [PRIMARY] ,
    CONSTRAINT [FK_producent_adresse] FOREIGN KEY
    (
        [adresse_ID]
    ) REFERENCES [adresse] (
        [ID]
    ) ON DELETE CASCADE  ON UPDATE CASCADE  NOT FOR REPLICATION
) ON [PRIMARY]
GO



if exists (select * from dbo.sysobjects where id = object_id(N'[spil]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [spil]
GO

CREATE TABLE [spil] (
    [ID] [int] IDENTITY (1, 1) NOT NULL ,
    [producent_ID] [int] NULL ,
    [information_ID] [int] NULL ,
    [genre_ID] [int] NULL ,
    [navn] [varchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
    CONSTRAINT [PK_spil] PRIMARY KEY  CLUSTERED
    (
        [ID]
    )  ON [PRIMARY] ,
    CONSTRAINT [FK_spil_genre] FOREIGN KEY
    (
        [genre_ID]
    ) REFERENCES [genre] (
        [ID]
    ) ON DELETE CASCADE  ON UPDATE CASCADE  NOT FOR REPLICATION ,
    CONSTRAINT [FK_spil_information] FOREIGN KEY
    (
        [information_ID]
    ) REFERENCES [information] (
        [ID]
    ) ON DELETE CASCADE  ON UPDATE CASCADE  NOT FOR REPLICATION ,
    CONSTRAINT [FK_spil_producent] FOREIGN KEY
    (
        [producent_ID]
    ) REFERENCES [producent] (
        [ID]
    ) ON DELETE CASCADE  ON UPDATE CASCADE  NOT FOR REPLICATION
) ON [PRIMARY]
GO



if exists (select * from dbo.sysobjects where id = object_id(N'[forhandlerspil]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [forhandlerspil]
GO

CREATE TABLE [forhandlerspil] (
    [forhandler_ID] [int] NOT NULL ,
    [spil_ID] [int] NOT NULL ,
    CONSTRAINT [FK_forhandlerspil_forhandler] FOREIGN KEY
    (
        [forhandler_ID]
    ) REFERENCES [forhandler] (
        [ID]
    ) ON DELETE CASCADE  ON UPDATE CASCADE  NOT FOR REPLICATION ,
    CONSTRAINT [FK_forhandlerspil_spil] FOREIGN KEY
    (
        [spil_ID]
    ) REFERENCES [spil] (
        [ID]
    ) ON DELETE CASCADE  ON UPDATE CASCADE  NOT FOR REPLICATION
) ON [PRIMARY]
GO
Avatar billede wessydk Nybegynder
08. november 2007 - 11:19 #2
Kan godt se der mangler en tabel mellem forhandler og spil. Men jeg må indrømme det virker ikke ret overskueligt det script som du viser her. Det jeg kan se at jeg mangler i min egen SQL kode er en ekstra tabel.

Jeg har ikke brugt noget til at generere et script da jeg selv har skrevet kode men jeg er kommet til et punkt hvor jeg ikke ved er hvordan kode som skal bruges til at binde de forskellige tabeller sammen skal se ud. Jeg har prøvet mellem spil og information men det virker ikke optimalt.
Avatar billede hrc Mester
08. november 2007 - 12:39 #3
Jeg ved godt der kommer meget i sådan et autogeneret script, men kigger du hvad der står og abstraherer fra []'erne så er det nu ret simpelt:

1. Først tjekkes der i sysobject-tabellem om den allerede er oprettet. Hvis den er bliver den slettet

2. Dernæst oprettes tabellen og der laves constraints. Jeg benytter caskade flaget, der betyder at sletter du en producent bliver dens produkter også slettet. Er dog ikke sikker på det er lavet helt korrekt.

Dette gentages for hver tabel.

Hvis du vil oprette tabellerne kopierer du scriptet over i et SQL-vindue og kører det.
Avatar billede hrc Mester
08. november 2007 - 12:41 #4
Hvis du ikke vil oprette tabellerne forfra, selvom noget kunne tyde på du ikke er så langt, skal du bruge

alter table forhandler add CONSTRAINT [FK_forhandlerspil_forhandler] FOREIGN KEY
    (
        [forhandler_ID]
    ) REFERENCES [forhandler] (
        [ID]
    ) ON DELETE CASCADE  ON UPDATE CASCADE  NOT FOR REPLICATION

.. sådan som der står i førnævnte script.
Avatar billede wessydk Nybegynder
08. november 2007 - 13:30 #5
Jeg har smidt det ind i i en Query og kørt koden uden held. Men som sagt jeg er ny i det her og det script gør ikke meget for min forståelse. Jeg prøver et andet sted eller venter på en anden men tak fordi du forsøgte.
Avatar billede hrc Mester
08. november 2007 - 17:46 #6
Jeg vil lige poientere at mit script virker; det er dig der gør en fejl - når der ikke kommer flere oplysninger, kan jeg ikke hjælpe mere.
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