Avatar billede JJK1988 Nybegynder
27. oktober 2014 - 10:24 Der er 9 kommentarer og
1 løsning

SQL, server 2008, konstruktion af DB

Hej

Jeg sidder lidt med noget jeg tro der er noget bøvl - Det handler om  relations regler ift. når man opretter en Database(er stadigvæk studerende) altså nå man skal omdanne de her multipliciteter til en relationel model

Spørgsmål:

Jeg sidder med en database, hvor nogle af tabellerne skal have muligheden for at skrive en kommentar, MEN det der er min største hovedepine er om jeg har gjort det korrekt - eller om der er en bedre måde ift. normalisering.

Forklaring:

jeg har følgende tabeller [Sample], [SubSample], [afdeling1], [afdeling2]
alle disse skal have mulighed for at skrive en kommentar til, men det er ikke kun en 1 til 1 relation, det er en 1 til mange relation; altså [Sample] kan have 1 til mange kommentar og lige så med de efterfølgende.

Hvordan skal jeg, på bedst muligvis gør det i min Database?
-- pt er min løsning( som nok er langt fra den bedste, at lave 1 samlet tabel [Commentary] også lavet samlingstabeller for de 4 tidligere nævnte.

-- Er der en bedre måde at gør dette på?

Tak fordi du gad læse mit spg.
Avatar billede JJK1988 Nybegynder
27. oktober 2014 - 10:45 #1
EDIT: 1.0
En af mine tanker var som følgende

Simpelthen tage ID fra de enkelte tabeller og sætte på som FK i [Commentary] - Men det vil jo skabe en helt masse null værdier i [Commentary] tabellen, så den hoppede jeg fra igen.

EDIT: 1.1
Når det så er lavet som det er med samlingstabeller mellem [Commentary] og de 4 før nævnte tabeller [Sample], [SubSample], [afdeling1], [afdeling2]
Så er jeg meget i tvivl om hvordan jeg skal gør i min kode (C#).

Hvis jeg skal indsætte en ny sample med en kommentar.

så skal jeg jo vel reelt have fat i alle 3 tabeller, når jeg konstruere mit insert statement?
Avatar billede softspot Forsker
27. oktober 2014 - 11:37 #2
Jeg ville umiddelbart bruge en uniqueidentifier (uid) som fremmednøgle i kommentar-tabellen (dvs. sample, subsample, afdeling1 og afdeling2 skal have uid som primærnøgle).

Når så f.eks. sample skal hentes med kommentarer, kunne der laves et opslag på sample med uid og samtidig (måske endda parallelt) et opslag i kommentar-tabellen på samme uid. Altså ingen relationstabeller mellem kommentar-tabellen og de 4 primærtabeller.

Det er givetvis ikke en relationel normaliseringsmæssig optimal løsning, men jeg synes den er praktisk.

Dog skal du selv sørge for, at der bliver ryddet op i kommentar-tabellen, når rækker slettes i de 4 primærtabeller, da databasens indbyggede relationelle integritetsmekanisme ikke kan gøre dette automatisk med denne konstruktion.
Avatar billede arne_v Ekspert
28. oktober 2014 - 03:07 #3
Der maa vaere flere muligheder.

Lad mig for nemheds skyld kalde de 4 tabeller for x, y, z, w.

A) En kommentar tabel per tabel.

x(PK xid,...)
y(PK yid,...)
z(PK zid,...)
w(PK wid,...)
cx(PK cxid,FK xid->x.xid,...)
cy(PK cyid,FK yid->y.yid,...)
cz(PK czid,FK zid->z.zid,...)
cw(PK cwid,FK wid->w.wid,...)

SELECT * FROM x JOIN cx ON x.xid = cx.xid

B) En enkelt kommentar tabel med et type felt:

x(PK xid,...)
y(PK yid,...)
z(PK zid,...)
w(PK wid,...)
c(PK cid,typ,FK rid->x.xid/y.yid/z.zid/w.wid,...)

SELECT * FROM x JOIN c ON x.xid = c.rid AND c.typ='x'

C) En enkelt kommentar tabel of samme id i alle 4 tabeller

id(PK id)
x(PK&FK id->id.id,...)
y(PK&FK id->id.id,...)
z(PK&FK id->id.id,...)
w(PK&FK id->id.id,...)
c(PK cid,FK rid->x.id/y.id/z.id/w.id,...)

SELECT * FROM x JOIN c ON x.id = c.rid

Jeg vil ikke afskrive nogen af dem paa forhaand.
Avatar billede arne_v Ekspert
28. oktober 2014 - 03:13 #4
A og B betyder 2 INSERT mens C betyder 3 INSERT, men det er ikke noget problem. Bare put alle INSERT i en enkelt transaktion.
Avatar billede arne_v Ekspert
28. oktober 2014 - 03:20 #5
Softspots UUID/GUID loesning er faktisk en optimering af C.

I stedetfor at brugen en id tabel til at generere faelles id'er saa bruger man en uuid/guid.

Der findes forskellige varianter af uuid/guid men en saakaldt type 4 som er langt den mest brugte har en meget lille sandsynlighed for at give duplikater.

http://en.wikipedia.org/wiki/Universally_unique_identifier#Random_UUID_probability_of_duplicates har udregningen.
Avatar billede JJK1988 Nybegynder
29. oktober 2014 - 10:00 #6
Hej Arne_v

Jeg valgte at køre med A, sådan at kommentar tabellen CX har en foreign key fra den tilhørende tabel X og lige så med de følgende.

Var det også sådan du havde det tænkt ?

Men efter selv at have læst angående det at ligge multiple INSERT ind i en transaction - kan kun se store fordele i at have 2 inserts i 1 transaction ift. at skal kører 2 insert seperat.

Men jeg har aldrig brugt transactions, så er i tvivl om hvordan koden skal se ud, ud fra de eksempler jeg har set, efter at have kigget på det - så det jeg er i tvivl om er hvordan det fungere og ser ud med den sqlcommandList

kigger her på:
http://stackoverflow.com/questions/17008902/sending-several-sql-commands-in-a-single-transaction
Det svar som er givet af Mohammad abumazen.
Kan ikke se hvordan den der sqlCommandList skal fremgå?

Kan ikke just sige at jeg synes at hverken den ene eller anden herunder har været til hjælp:
http://www.tutorialspoint.com/sql/sql-transactions.htm
http://msdn.microsoft.com/en-us/library/ms188929.aspx
Avatar billede arne_v Ekspert
29. oktober 2014 - 15:33 #7
Med hensyn til multiple kommentar tabeller: ja.

Men hensyn til transaktion saa er det meget simpelt.

Uden transaktion:

SqlConnection con = new SqlConnection(constr);
con.Open();
SqlCommand ins1 = new SqlCommand(inssql1, con);
ins1.ExecuteNonQuery();
SqlCommand ins2 = new SqlCommand(inssql2, con);
ins2.ExecuteNonQuery();
con.Close();

Med transaktion:

SqlConnection con = new SqlConnection(constr);
con.Open();
SqlTransaction tx = con.BeginTransaction();  // <----
SqlCommand ins1 = new SqlCommand(inssql1, con);
ins1.Transaction = tx;  // <----
ins1.ExecuteNonQuery();
SqlCommand ins2 = new SqlCommand(inssql2, con);
ins2.Transaction = tx;  // <----
ins2.ExecuteNonQuery();
tx.Commit();  // <----
con.Close();
Avatar billede JJK1988 Nybegynder
30. oktober 2014 - 09:51 #8
I din Transaktion

Så din tx fungere som din liste af sqlcommands?

hvis ja så må du gerne oprette svar
Avatar billede arne_v Ekspert
30. oktober 2014 - 14:13 #9
Begge INSERT bliver tilknyttet den samme transaktion, hvilket goer at ente saa udfoeres de begge eller saa udfoeres ingen af dem - d.v.s. du risikerer ikke at kun en af dem bliver udfoert.

Der er ikke noedvendigt med en liste for kun 2.
Avatar billede arne_v Ekspert
30. oktober 2014 - 14:13 #10
og svar
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

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