Avatar billede Nojsa Juniormester
27. februar 2019 - 13:42 Der er 13 kommentarer og
1 løsning

Design af database

Hej eksperter!

Er i gang med at lave et faktura system hvor jeg i databasen har 3 tabeller. En der hedder products og en der hedder orders og den sidste som hedder customers. Spørgsmålet er så at jeg nogle gange gerne vil printe en faktura-kopi som skal hente oplysninger på fra de tre tabeller som omtalt. MEN hvis nu at jeg ændrer customers oplysninger feks. adresse så kommer det også til at ændre kopien. Hvad er så det smarteste for at man kan forhindre det? Har overvejet at indsætte alle oplysninger ind i orders tabellen, men syntes dog at den er meget stor, som jeg har lært ikke altid er en god idé?

Skal jeg i stedet så lave nogle andre tabeller som indeholder de gamle oplysninger, hvad syntes i?

Hilsen Jonas
Avatar billede Slater Ekspert
27. februar 2019 - 13:53 #1
Hvis du gerne vil have at adresser hører til ordrer og ikke til kunder, så er det den eneste måde at putte informationen ind i ordre-tabellen. Eller, naturligvis, at lave en separat tabel som er 1-1 koblet til ordrer, hvilket sådan set er det samme, i hvert fald konceptuelt - den eneste grund til at gøre det, er for at mikrooptimere performance.

Det er da korrekt hvad du har hørt, at det er en dårlig ting bare at udvide en tabel til det ekstreme - men her har du jo brug for informationen, og den hører hjemme der. Oven i købet er det ikke fordi du spilder plads med en masse tomme rækker, for alle ordrer vil jo have en adresse tilknyttet.
Det er en lige så dårlig ting at være så bange for at udvide tabellen, at du ender med ikke at have de ting du skal bruge. Intet galt med det her.
Avatar billede Nojsa Juniormester
27. februar 2019 - 14:03 #2
Hvis jeg så vælger at lave en tabel der hedder customersOld som så indeholder alle oplysninger om den enkelte kunde. Skal jeg så lave en ny customersOld id med de samme oplysninger hver gang jeg laver en ny faktura? Eller kan man lave det på en smartere måde, hvor man måske genbruger den samme id fra customersOld?
Avatar billede Slater Ekspert
27. februar 2019 - 14:11 #3
Nu er jeg ikke med, hvad skal du med en ny kundetabel og hvorfor skal den hedde Old hvis den skal bruges? Adresserne hørte til ordrer, ikke kunder, efter hvad du sagde.
Avatar billede Nojsa Juniormester
27. februar 2019 - 14:19 #4
Det er nok formuleringen :-) men hvis jeg skulle have en customers hvor jeg evt lavede en address om, så ville den så også lave adressen om på evt en faktura kopi. Men hvis jeg så lavede en ny tabel med oplysninger om den enkelte kunde som jeg så tilknytter til en faktura i orders tabellen. Vil det så sige at jeg skal lave en "ny" kunde i den nye tabel som er tilknyttet til orders? Eller skal man genbruge de samme oplysninger fra den samme id i den nye tabel hvis og såfremt at der ikke er ændret noget i customers? Håber du forstår hvad jeg mener. Har måske lidt svært ved at formulere mig? :p
Avatar billede Slater Ekspert
27. februar 2019 - 14:27 #5
Som jeg forstår det er det bare ekstra info om en ordre.

Altså, hvis Hans Jensen køber noget mens han bor på Gadevej 1, og så senere flytter til Vejgade 40 og ændrer sin adresse i kundetabellen, så skal den oprindelige faktura stadig have hans adresse stående som Gadevej 1, for det var hvad han boede på dengang.

Det giver mening - men i så fald er det bare at udvide fakturatabellen til at have adresse og evt. andre oplysninger der skal gemmes også, og så skrive de data fra kundetabellen.

Det er rigtigt nok, at i de 99% af tilfældene hvor folk ikke flytter, der vil du have duplikeret data flere steder. Men det er stadig den nemmeste måde at holde styr på det og forhindre fejl, og når det kun drejer sig om et par VARCHARs eller lignende, så betyder det ikke ret meget.

Alternativet ville være, at hver gang data i kundetabellen ændrede sig, lavede du en ny række i den og markerede den som aktiv og den gamle som inaktiv, mens rækken i fakturatabellen pegede på id'et fra den gamle. Det er også en mulig, men den er mere kompleks og har lettere ved at gå i stykker - og igen, det er ikke nødvendigt for de små mængder data du skal bruge. Jeg ville ikke gøre det.
Avatar billede Nojsa Juniormester
27. februar 2019 - 14:32 #6
Okay. Jamen så er det jeg har gjort og vil fortsætte med. Tusind tak for dit input, så jeg kan komme videre og lave den smarteste løsning! :-)

Du må have en god dag!

Jonas
Avatar billede arne_v Ekspert
04. marts 2019 - 04:32 #7
At duplikere oplysningerne er nok den pragmatiske loesning.

Hvis du vil have en mere puristisk men ikke noedvendigvis praktisk loesning saa lav en adresse tabel med kunde id og start og slut tid (plsu eventuelt med et revisions nummer for at daa lidt nemmere SQL) - saa kan du finde kundens adresse paa et givet tidspunkt (eller revision).
Avatar billede Nojsa Juniormester
20. marts 2019 - 15:24 #8
hehe har først set din kommentar nu.

men hvad du siger er at jeg skal lave en kunderegister som først bliver opdateret når jeg nu laver en update på en bestemt kunde? Og så sammenligner jeg så min orders tabel med den id der matcher den enkelte kunde fra mit kunderegister?
Avatar billede arne_v Ekspert
20. marts 2019 - 15:46 #9
Forslaget er noget a la:

customers

cust_id rev name address start_date end_date

1          1    'Fup A/S' 'Svindelvej 1' 1-Jan-2013 31-Dec-2016
1          2    'Fup A/S' 'Fidusvej 1' 1-Jan-2017 NULL

orders

... cust_id rev

... 1 1
... 1 2

(eventuelt split customer op i customer og address)
Avatar billede Nojsa Juniormester
20. marts 2019 - 15:50 #10
ååh ja det kunne man gøre. Så når jeg så 'redigerer' en kunde så vil den smide en end-dato ind på den forrige kunde og lave en ny?
Avatar billede arne_v Ekspert
20. marts 2019 - 16:20 #11
Ja.

Og fordi order refererer til kunden paa et bestemt tidspunkt (revision) vil en genudskrivning have adressen fra det paagaeldende tidspunkt.
Avatar billede Nojsa Juniormester
20. marts 2019 - 16:23 #12
ja det virker rigtig fornuftigt i mine ører også!
Avatar billede arne_v Ekspert
20. marts 2019 - 16:45 #13
Ja. Men simpel data duplikering i orders er nemmere.

:-)
Avatar billede Nojsa Juniormester
20. marts 2019 - 16:47 #14
Det er nemlig lige det, men syntes egentlig også selv at duplikere en data 1000 gange, hvis man nu har lavet 1000 fakturas til en bestemt kunde virker en lille smule skørt :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

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