Avatar billede Smitche Praktikant
09. januar 2013 - 20:36 Der er 6 kommentarer og
1 løsning

Hvad er relations tabbellerne i dette tilfælde? (MySQL)

Jeg har fire tabeller i en MySQL database og schema


1 user_tbl(username, password)

2 news_tbl (news_id, username_fk, headline, bodytext )

3 comments_tbl (comments_id, comment)

4 news_comments_tbl (news_comments_id, news_id_fk, comments_id_fk)


news_comments_tbl indeholder to fremmednøgler der hver relaterer til news_id i news_tbl og comments_id til comments_tbl

Er det korrekt at news_comments_tbl er en relationstabel fordi den relaterer til to andre tabeller gennem fremmednøglerne?


news_tbl indeholder en fremmednøgle der relaterer til username i user_tbl

Er det korrekt at news_tbl er en relationstabel fordi den har en fremmednøgle der relaterer til username i user_tbl?


Jeg spørger fordi jeg mener her der er to relationstabeller, men er blevet fortalt det modsatte, og er nu meget i tvivl.
Avatar billede claes57 Ekspert
09. januar 2013 - 20:43 #1
helt hardcore, så er en relationstabel en tabel uden egne data, men kun link til at par andre tabeller.
Avatar billede arne_v Ekspert
09. januar 2013 - 21:10 #2
Jeg ville undgaa at bruge termen relationstabel.

Men hvis man vaelger at oversaette relationship table til relationstabel saa er det en tabel repraesenterer en M:M relation (og dermed har du kun en!).
09. januar 2013 - 21:38 #3
Jeg ville gætte på, at en 'news' kan have mange 'comments', men en 'comment' kan kun være til en 'news'.  I så fald ville jeg foreslå at give comments tabellen et news_id_fk felt og droppe news_comments tabellen. 

Hvis på den anden side en bruger kan gå ind og vælge for eksempel fem nyheder og rette en enkelt kommentar til disse fem nyheder, så er der en mange til mange relation mellem news og comments, og så har du ret i at du skal have en news_comments tabel med fk til news og til comments.

Ordet relationstabel bruges somme tider som synonym for mange-til-mange tabeller.  Det er ikke udelukket, at sådanne tabeller kan have data ud over linkene.  Hvis for eksempel det er således at en comment kan knyttes til flere news, således at du har brug for en news_comments tabel, så kunne du måske ønske at fastlægge hvilken dato en comment blev knyttet til en news.  I så fald ville tabellen, ud over id og de to fk's, også have et felt for dato.

Men jeg ville ikke kalde news_tbl for en relationstabel, uanset at den beskriver en relation mellem to tabeller. 

To kommentarer mere: 

1.  Din tabelstruktur forudsætter, at users er de der opretter nyheder, ikke de der kommenterer på nyheder.  Hvis du også vil holde styr på hvilke users der har kommenteret kunne du give give comments tabellen et username_fk felt.  Hvis du også har givet comments tabellen et news_id_fk felt vil tabellen således få to fk's, men det gør den ikke til en mange-til-mange eller en relations tabel.

2.  Du synes at bruge username som 'key' til user tabellen.  Det er måske ikke så praktisk i et land som Danmark, hvor der kan være mange users der hedder Hans Jensen eller Peter Andersen.  Der ville jeg foreslå at give hver user en id og oprette et user_id felt i user tabellen og bruge user_id_fk i stedet for user_name_fk i de tabeller der relaterer til user.
09. januar 2013 - 21:40 #4
Så langsom som jeg er så jeg ikke #2 før jeg affyrede #3, men vi synes at være nogenlunde enige.
Avatar billede Smitche Praktikant
14. januar 2013 - 15:42 #5
Mange tak for jeres svar.

Hvis jeg forstår det korrekt så bruges en relationstabel kun hvis der er en N:M kardinalitet. Det er i mit eksempel overflødigt at oprette en relationstabel, og burde i stedet give comments et news_id_fk og dermed linke dem sammen.

Men derimod hvis
"Hvis på den anden side en bruger kan gå ind og vælge for eksempel fem nyheder og rette en enkelt kommentar til disse fem nyheder, så er der en mange til mange relation mellem news og comments, og så har du ret i at du skal have en news_comments tabel med fk til news og til comments. "

Hvis jeg forstår det korrekt er det kun hvis en bruger kan rette andres eller sin egen kommentar? Eller er det kun hvis man kan rette sin egen kommentar?

Men Christian_Belgien hvis du smider et svar kan jeg give poitene efter dit svar og gode råd. Det har været en stor hjælp til at forstå dette, plus gode råd til fremtiden.

Mange tak! :)
14. januar 2013 - 19:38 #6
Smitche, kardinalitet i en relationel database er simpelt hen en betegnelse for hvordan tabellerne hænger sammen.  Du sætter en database op for at hjælpe med at løse et problem i et 'domaine,' et begrænset udsnit af virkelighedens verden (eller en fantasi verden).  Hvis du definerer et domaine der består af de tre 'entiteter' users, news, og comments på en sådan måde, at en news altid er skrevet af en bestemt user (altså ingen kollektivt forfatterskab) og at en kommentar altid er rettet til en bestemt news, så har du defineret to en-til-mange relationer eller 1-n kardinaliteter.

Lad os så antage, at du udvider dit domaine til også at inkludere nyheds kategorier.  Hvis du vil klassificere nyheder så hver nyhed hører til en kategori, så har du defineret endnu en 1-n kardinalitet.  Hvis du i stedet tillader, at en nyhed kan tilhøre flere kategorier (for eksempel en nyhed om ungdomsarbejdsløshed på Bornholm hører til kategorierne ungdom, beskæftigelse, og Bornholm) har du defineret en mange-til-mange eller n-m kardinalitet.  For at holde styr på en sådan n-m kardinalitet skal du bruge en relationstabel.

Somme tider kan et billed sige mere end mange ord.  Jeg har lavet dette billed http://christianjorgensen.be/Billeder/Smitche.PNG .  Det viser tre forskellige database design.  Øverst til venstre viser jeg den simple situation med users, news, og comments.  Nederst til venstre tilføjer jeg categories hvor hver nyhed hører til en bestemt kategori.  Til højre viser jeg hvordan det ser ud, hvis hver nyhed kan tilhøre flere kategorier.

Jeg studser over, at du synes at gå så højt, næsten videnskabeligt, op i kardinaliteter.  Det er simpelt hen et fremmedord for hvordan du vælger at lade dataerne hænge sammen i det domaine du definerer.

For at forvirre dig endnu mere, hvis du tillader at der kan være flere forfattere til en news (eller til videnskabelige artikler der tit har flere forfattere) så er du nødt til at modellere det som en n-m kardinalitet.  Forfatter A kan have deltaget i news nummer 17, 23, og 47, og artikel 17 kan have A, C, og Q som forfattere.  Så skal du have en relationstabel med to fremmednøgler, til forfatter og news, hvor du nu kan nøjes med en fremmednøgle til user i news tabellen.
Avatar billede Smitche Praktikant
15. januar 2013 - 17:13 #7
Mange tak for din hjælp og dine gode svar. Billedet giver en rigtig god forståelse for det. Fedt at du gider bruge tid på det.
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