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.
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
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
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
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.
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.
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
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.
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.
Synes godt om
Ny brugerNybegynder
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.