27. februar 2019 - 13:42Der 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?
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.
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?
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.
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
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.
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).
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?
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
Synes godt om
Ny brugerNybegynder
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.