Ciao a tutti! e buon anno 2011!!!

Vorrei chiedere una questione legata alle relazioni tra tabelle in sql server 2008 r2 (Management studio). In sostanza ho 3 tabelle composte cosi:

Tabella Destinazioni:
-id_destinazione (tipo int, PK, non ammette valori Null, è di tipo contatore)
-NomeDestinazione (tipo nchar(10), non ammette valori Null)
-utente (nchar(10), non ammette valori Null)
-id_struttura (nchar(10), non ammette valori Null)
-id_catalogo (nchar(10), non ammette valori Null)


Tabella Strutture:
-id_struttura (tipo int, PK, non ammette valori Null, è di tipo contatore)
-id_catalogo (nchar(10), non ammette valori Null)
-NomeStruttura (nchar(10), non ammette valori Null)
-id_destinazione (nchar(10), non ammette valori Null)


Tabella Cataloghi:
-id (tipo int, PK, non ammette valori Null, è di tipo contatore)
-NomeCatalogo (nchar(10), non ammette valori Null)
-PercorsoFile (nchar(10), non ammette valori Null)
-Visibile (bit, non ammette valori Null) questo deve restituire un valore "true/false"
-DataCaricamento (datetime, non ammette valori Null)
-id_destinazione (nchar(10), non ammette valori Null)
-Utente (nchar(10), non ammette valori Null)
-DataViaggio (datetime, non ammette valori Null)
-prezzo (nchar(10), non ammette valori Null)
-id_struttura (nchar(10), non ammette valori Null)

Ora le tabelle dovrebbero essere relazionate in questo modo:

Nella tabella destinazioni ci sono tutte le destinazioni (appunto). Per ogni destinazione ci sono una o piu strutture. Per ogni struttura ci sono uno o piu cataloghi.

Quindi le relazioni sono di uno-a-molti. Il problema è che non riesco a stabilire le relazioni, credo di sbagliare qualcosa in alcuni tipi di campi ma non so bene cosa, non essendo proprio un esperto in sql server (prima usavo access)

Secondo voi dove sbaglio? Inoltre nel diagramma delle relazioni noto che tutte le relazioni hanno le chiavi agli estremi, quando dovrei trovare invece da una parte la chiave mentre dall'altra il simbolo "infinito"....


Attendo intrepido i vostri suggerimenti....e auguri ancora!

Creazione Siti Vicenza
Posizionamento Siti - SEO
-id_destinazione (nchar(10), non ammette valori Null)
-id_struttura (nchar(10), non ammette valori Null)

perchè questi non sono int come nelle relative tabelle???

Non hai veramente capito qualcosa fino a quando non sei in grado di spiegarlo a tua nonna.
-Albert Einstein-
fileman ha scritto:
-id_destinazione (nchar(10), non ammette valori Null)
-id_struttura (nchar(10), non ammette valori Null)

perchè questi non sono int come nelle relative tabelle???

mah a dire il vero erano int ma il problema c'era lo stesso, avevo poi cambiato per vedere se succedeva qualcosa... ma niente

Creazione Siti Vicenza
Posizionamento Siti - SEO
60 messaggi dal 30 dicembre 2006
ciao, ti posso chiedere di scrivere in T-SQL, visto che esiste? sai ci risparmierebbe un po' di lavoro, e a te serve comunque ...
per quanto riguarda i problemi, beh ... il primo credo sia un discorso di tipi di dato differenti, come ti ha già fatto notare fileman: usa int per tutti quegli "id_".
ma il secondo, molto più importante io credo, riguarda la struttura della base dati: ho la sensazione che tu debba rivederla profondamente, ma magari mi sbaglio.
saluti.
ps: chiedo scusa fin d'ora se ho espresso la mia opinione in modo un po' brusco ;)
hai provato a crea le relazioni dal diagram designer di Sql Studio? trascini la chiave primaria di una tabella sul campo corrispondente nell'altra così ti dovrebbe creare una ForeignKey 1:N

Non hai veramente capito qualcosa fino a quando non sei in grado di spiegarlo a tua nonna.
-Albert Einstein-
fileman ha scritto:
hai provato a crea le relazioni dal diagram designer di Sql Studio? trascini la chiave primaria di una tabella sul campo corrispondente nell'altra così ti dovrebbe creare una ForeignKey 1:N

Si, ho provato cosi in effetti ora le relazioni sono ok, solo che ora ho provato a fare un inserimento in ogni tabella, con questo risultato:

Tabella Destinazioni tutto ok,

Tabella Strutture mi ha generato questo errore:

< L'istruzione INSERT in conflitto con il vincolo FOREIGN KEY "FK_tblStrutture2_tblDestinazioni2". Il conflitto si verificato nella tabella "dbo.tblDestinazioni2", column 'id_destinazione' del database "DbCataloghi2". >



mentre per la tabella cataloghi da quest'errore:

< I dati di tipo string o binary verrebbero troncati. >

ma qui penso sia dovuto a che non ci sono dati nella tabella strutture (casomai ci penso dopo)

Nel diagramma delle relazioni ho tutte le relazioni ok, nel senso che partendo da sinistra mi trovo:

TblDestinazioni -- uno-a-molti --> TblStrutture -- uno-a-molti --> TblCataloghi

i campi sono (Destinazioni)
id_destinazione
NomeDestinazione
utente
id_struttura


(strutture)
id_struttura
id_catalogo
NomeStruttura
id_destinazione

(cataloghi)
id
NomeCatalogo
PercorsoFile
Visibile
DataCaricamento
utente
DataViaggio
prezzo
id_struttura

come puoi notare ho lasciato solo i campi id comuni (per le relazioni) cancellando uno o due che erano in piu...

Creazione Siti Vicenza
Posizionamento Siti - SEO
l12345 ha scritto:
ciao, ti posso chiedere di scrivere in T-SQL, visto che esiste? sai ci risparmierebbe un po' di lavoro, e a te serve comunque ...
per quanto riguarda i problemi, beh ... il primo credo sia un discorso di tipi di dato differenti, come ti ha già fatto notare fileman: usa int per tutti quegli "id_".
ma il secondo, molto più importante io credo, riguarda la struttura della base dati: ho la sensazione che tu debba rivederla profondamente, ma magari mi sbaglio.
saluti.
ps: chiedo scusa fin d'ora se ho espresso la mia opinione in modo un po' brusco ;)

Non ti preoccupare per i modi, l'importante è restare educati (cosa che hai fatto :-) )

comunque, dato che mi sto avvicinando a sql srver da poco (prima usavo access) non so padroneggiarlo molto bene, so del T-Sql ma non so come recuperare quest'ultimo...

Creazione Siti Vicenza
Posizionamento Siti - SEO
60 messaggi dal 30 dicembre 2006
ciao, vedi la faccenda del t-sql è essenziale, se la trascuri è come pretendere di programmare solo con il drag-drop dei controlli nell'ide di vs. inoltre, nessuno sano di mente, andrebbe a costruire un db sql server "a-la-access": il motivo è che generalmente si tratta di basi di dati molto più complesse e il linguaggio di script è talmente più comodo\potente che arrivi a non volerne\poterne più fare a meno :).
comunque per rispondere alla tua domanda: per ricavare il ddl di una tabella, la selezioni dal treeview degli oggetti del tuo db --> pulsante dx --> script table as --> create to --> new query window --> e il servizievole ide ti scodella quanto ti serve.
poi, visto che siamo ancora qui l'ultimo dell'anno, ti butto giù un esempio di script:
use tempdb
go

if exists(select * from sys.tables where name='struttura')
begin
drop table dbo.[struttura]
end

if exists(select * from sys.tables where name='destinazione')
begin
drop table dbo.[destinazione]
end

create table dbo.[destinazione](id int identity(1,1) not null,
Nome nchar(10) not null,
utente nchar(10) not null,
CONSTRAINT [pkdestinazione] PRIMARY KEY CLUSTERED
(
[ID] ASC
)
)

create table dbo.[struttura](
id int identity(1,1) not null,
id_destinazione int not null,
nome nchar(10) not null,
CONSTRAINT [pkstruttura] PRIMARY KEY CLUSTERED
(
[ID] ASC
)
)

ALTER TABLE [dbo].[struttura]
WITH CHECK ADD CONSTRAINT [FK_struttura_destinazione] FOREIGN KEY([id_destinazione])
REFERENCES [dbo].[destinazione] ([id])
go

e, in ultimo, a costo di essere pedante, ti rinnovo il mio consiglio: ricontrolla la base dati. ;)
saluti

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.