Avatar billede ugotabe_kidding Nybegynder
08. januar 2003 - 12:46 Der er 8 kommentarer og
1 løsning

Problemer med normalisering

Jeg har følgende felter i en tabel (udsnit):

ID  Navn    Email        Kommentar
12  Jan    jan@jan.dk
732  Jan    jan@jan.dk  A
23  Jan    jan@jan.dk  C
3    Jens    jens@jens.dk B
999  Jens    jens@jens.dk C
87  John    john@john.dk A
55  Jytte  j@jytte.dk
osv.
Tabellen er sorteret på emailadresser og viser at den samme bruger eksisterer flere gange :o(
A, B og C navnene på distributionslister som modtageren er tilføjet på. Er der ingen værdi i kommentarfeltet er det fordi abonnementet er registreret i en m-m-relationstabel med BrugerID og ListeID.
Hvordan laver jeg en forespørgsel der fjerner de 2 x Jan og appender A og C til min m-m-relationstabel, knyttet til den 1. Jan?
I tilfældet med "Jens" skal kun den ene slettes og værdierne B og C skal knyttes til den andens ID i min m-m-relationstabel.

Jeg forestiller mig noget med en temp-tabel, hvor jeg lagrer de unikke brugere (Count Distinct?) og alle de mulige lister som true/false-felter og sætter værdierne true, hvis queryen støder på den samme emailadresse i den originale tabel. Men jeg er ikke sikker på fremgangsmåden..

Laaangt spørgsmål.. Håber at nogen ved hvad jeg fabler om og er i stand til at hjælpe mig :o)

/U.K.
Avatar billede arne_v Ekspert
08. januar 2003 - 18:32 #1
Godt råd:
  drop det felt og tilføj også dem der kun er på en liste
  i din M:M tabel

Ja - det løser ikke data konverterings problemet, men det
vil effektivt forhindre fremtidige problemer !
Avatar billede arne_v Ekspert
08. januar 2003 - 18:59 #2
Start med at tage en kopi af din database !!

Følgende er mine umiddelbare ideer (ikke testet):

SELECT ID AS BrugerID, Kommentar as ListeID INTO m-m-relationstabel
FROM tabel WHERE Kommentar IS NOT NULL

skulle tilføje det manglende til m-m-relationstabel

SELECT DISTINCT ID,Navn,Email INTO temp-tabel FROM tabel

henter de data der skal gemmes

DROP TABLE tabel

sletter den gamle tabel

SELECT * INTO tabel FROM temp-tabel
DROP temp-tabel

for at det sidste på plads
Avatar billede jkrons Professor
08. januar 2003 - 19:01 #3
Efter at have eksperimenteret en hel del med problemet er jeg kommet til den konklusion, at det i hvert fald ikke kan løses med forespørgsler. Det må kræve noget kodning, men hvordan den i givet fald skal se ud, kan jeg ikke lige gennemskue.

I pseudokode må det være noget i denne stil:

Hvis Jan@Jan.dk forekommer mere end en gang, skal du huske det nummer, han forekommer under første gang, men kun hvis kommentarfeltet ikke er tomt. Hvis feltet er tomt, skal du springe personen over.

Næste gang du møder Jan@Jan.dk, skal du ignorere hans ID, men du skal huske hans Bemærkning. Nu skal du finde den første forekomst af jan@jan.dk igen. Det ID der står her, skal du nu overføre til den nye tabel sammen med bemækningen for den anden forekomst. Dette skal du gentage til der ikke er flere forekomster. Derefter skal du tage fat i den næste e-mail adresse.

Hvis der findes en post, hvor bemærkningskolonnen ikke er tom i nogen af forekomsterne, skal ID for den første forekomst overføres sammen mked bemærkningen for hver af forekomsterne.

Nemt lyder det ikke.
Avatar billede jkrons Professor
08. januar 2003 - 19:03 #4
arne-v-> Jeg har allerede tidligere prøvet noget i den stil, men det giver det problem at hvis du selecter ID inds i BrugerID, at den samme person optræder under mange forskellige ID'er,men i M:N tabellen kun skal optræde under det først forekommende ID.
Avatar billede arne_v Ekspert
08. januar 2003 - 19:11 #5
Hm. Det kan jeg godt se. Jeg tænker lidt videre.
Avatar billede ugotabe_kidding Nybegynder
08. januar 2003 - 21:19 #6
Nu må jeg vist hellere blande mig i debatten.. Det lyder som om I virkelig har tænkt så det knaget :o/ - tak for det so far..
Kan man ikke lave en tempTabel, der indeholder alle felterne i den originale tabel + et felt for hver liste (hhv. A, B og C)?
Først skal alle de brugere, hvis kommentarfelt er tomt, lagres med deres ID i tempTabellen.
Når jan@jan.dk (ID 732) forekommer, skal der søges efter jan@jan.dk i tempTabellen. Da han findes, skal feltet A i tempTabellen sættes fra False til True og ID 732 skettes fra org. tabellen. Når jan@jan.dk (ID 23) findes, skal feltet C i tempTabellen sættes fra False til True og ID 23 slettes fra org. tabel. Osv. osv..
Til sidst tages alle de brugere, der ikke allerede findes i tempTabellen, f.eks. john@john.dk (ID 87) der ikke havde et tomt Kommentarfelt overhovedet, og gemmes med deres ID i temptabellen. I tilfældet med john@john.dk ID 87 sættes feltet A til True og ID 87 slettes fra org. tabellen.

Er det herefter så ikke til at tilføje linier i m-m-relationstabellen ved at løbe tempTabellen igennem og tilføje en linie i m-m for alle brugere med alle de værdier, der er True?

Men jeg har meget svært ved at forestille mig hvorledes det skal gøres rent praktisk, enten i SQL eller i VB?

Men lyder det rigtigt?
Avatar billede jkrons Professor
08. januar 2003 - 22:44 #7
Ja, det lyder rigtigt nok, men det er også præcis den praktiske implementering, der driller mig.
Avatar billede ugotabe_kidding Nybegynder
18. januar 2003 - 00:50 #8
Jeg har løst problemet på den dårligst tænkelige måde..
Jeg fik nogle assistenter til at løbe hele DBen igennem og slette de redundante modtagere...
Avatar billede ugotabe_kidding Nybegynder
18. januar 2003 - 00:50 #9
/Lukker..
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
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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