Avatar billede webcreator Nybegynder
20. juli 2003 - 14:38 Der er 17 kommentarer og
2 løsninger

ID, points og uendeligt antal kommentare. Hvordan?

Hej.

Jeg skal til at lave et system, hvor mine brugere kan give en post points samt en kommentar. Jeg havde forestillet mig et ID-felt, hvor ID'et til den pågældende post blev indsat. Det næste felt skulle være "points", som angivet karakteren af posten. Nu mangler jeg så kun kommentarene. Men hvordan skal det laves ? Jeg kan kun se ulemper ved, at have det liggende vandret i tabellen.

Håber på, at nogen kan give mig et råd
Avatar billede arne_v Ekspert
20. juli 2003 - 14:43 #1
Hvis databasen skal være normaliseret skal du vel have en tabel-struktur som:

post
----

postid (PK)
point
xxxx

kommentar
---------

kommnetarid (PK)
post (FK)
tekst
yyyy
Avatar billede squashguy Nybegynder
20. juli 2003 - 14:44 #2
jeg ville ligge kommentarene i en tabel for sig selv. du laver så et id som relaterer til posten.
Avatar billede arne_v Ekspert
20. juli 2003 - 14:45 #3
Eller hvis du vil beholde muligheden for at se hvem der har givet
hvor mange point:

post
----

postid (PK)
xxxx

kommentar
---------

kommnetarid (PK)
post (FK)
point
tekst
yyyy

[xxxx og yyyy repræsenterer bare 0-mange øvrige felter du måtte have brug for]
Avatar billede webcreator Nybegynder
20. juli 2003 - 14:50 #4
Jamen selv om jeg smider kommentare i en anden tabel, så vil disse jo stadig ligge "vandret" i databasen. Og da jeg ikke kan gætte mig til, hvor mange kommentare der bliver skrevet, er dette heller ikke smart.

Jeg har overvejet, om det kunne laves som lodret i stedet. Hvor feltets navn blot bliver ID'et til den aktuelle post - og nedenfor kommer alle kommentarene så. Nogen ulemper ved dette ?
Avatar billede arne_v Ekspert
20. juli 2003 - 14:52 #5
Den tabel-strukturjeg har angiver er "lodret".

kommentarid er unik.

Men der kan godt være flere records med samme postid i kommentar tabellen.
Avatar billede webcreator Nybegynder
20. juli 2003 - 15:03 #6
"Men der kan godt være flere records med samme postid i kommentar tabellen."
Forstod jeg ikke helt. Der er jo ikke 2 poster som har samme ID.

Problemet med modellen, der benytter lodret struktur er, at jeg igen ikke ved hvor mange poster der vil blive lavet. Så enten skal der automatisk blive lavet et felt i kommentar-tabellen, når en post oprettes, eller også skal feltet først oprettes, når den første kommentar "kommer ind".

Ville sidstnævnte ikke være smartest ? Hvordan tjekker man i givet fald, om et felt eksistere ?
Avatar billede arne_v Ekspert
20. juli 2003 - 15:06 #7
Jo 1 record i post tabellen vil svare til 0-mange records i kommentartabellen.

Der skal tilføjes en ny record til kommentar tabellen hver gang der laves en kommentar
med henvisbing til den rigtige record i post tabellen.
Avatar billede webcreator Nybegynder
20. juli 2003 - 15:10 #8
Ok, jeg forstår ikke hvad du mener. Men kan flg. bruges :

Post-tabel (har et ID nr. for hver post - ingen gengangere)

Point-tabel (Feltet ID får samme værdi som en aktuel post, feltet points indeholder karakteren)

Kommentar-tabel (Har et primary ID felt (skal egentlig ikke bruges til noget, men kan blive brugbart senere. Når en kommentar skrives, oprettes et felt automatisk med samme ID nr. som posten har. Herunder lægges alle kommentarer)
Avatar billede squashguy Nybegynder
20. juli 2003 - 15:10 #9
et lille eksempel:

poster:
    postid = 1
    text = "hello world"


kommentarer:
    id = [autonummering]
    postid = 1
    text = "test"

    id = [autonummering]
    postid = 1
    text = "test 2"


dette giver 2 kommentarer til posten med postid=1
Avatar billede webcreator Nybegynder
20. juli 2003 - 15:14 #10
Aah, IC. Du opretter altså en ny vandret række for hver kommentar.
Avatar billede webcreator Nybegynder
20. juli 2003 - 15:15 #11
Det kan jeg godt se det smarte i. Så får man ikke 9000 kommentare vandret.
Avatar billede squashguy Nybegynder
20. juli 2003 - 15:23 #12
Dette er -måden- at gøre det på. I hvert fald, som arne siger, hvis databasen skal være normaliseret.
Avatar billede webcreator Nybegynder
20. juli 2003 - 15:25 #13
IC.

Men er min løsning ikke "hurtigere" ?
Nu skal den jo hen og finde/søge de poster, som har IDet X. Ved min løsning kan man blot lave en "direkte" select - hvis i forstår
Avatar billede arne_v Ekspert
20. juli 2003 - 18:17 #14
Ja sommetider kan det være lidt hurtigere med en unormaliseret
database.

Men hvis du husker at lave INDEX på postid feltet i kommentar
tabellen, så burde det ikke være noget problem i dette tilfælde.

(men uden INDEX så vil det tage lidt tid)
Avatar billede webcreator Nybegynder
20. juli 2003 - 18:20 #15
Hvad vil det sige at lave Index på feltet ?
Avatar billede arne_v Ekspert
20. juli 2003 - 18:24 #16
Syntax:

CREATE INDEX kommentar_post_ix ON kommentar (postid);

og den gør at MySQL laver et index således at den lynhurtigt kan
finde alle records i kommentar med postid=27 i stedetfor at skulle
lede hele tabellen igennem efter records med postid=27.
Avatar billede webcreator Nybegynder
20. juli 2003 - 18:25 #17
Det var smart. Det må jeg forske i lidt senere :)
Et sådan index laves blot efter, at tabellen er oprettet, ikke sandt ?
Avatar billede arne_v Ekspert
20. juli 2003 - 18:28 #18
Ja.

(du behøver ikke oprette index på primær nøgler - det sker automatisk, men
felter du bruger til join og where betingelser som ikke er primær-nøgler
er det ofte en god eide at sætte index på)
Avatar billede webcreator Nybegynder
20. juli 2003 - 18:29 #19
IC. Jamen mange tak for hjælpen så :-D
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