Avatar billede mousedreamer Nybegynder
26. februar 2011 - 16:38 Der er 9 kommentarer og
1 løsning

Samtidig import af kunder uden fejl

Hej,

mine brugere importerer løbende store kunder lister til en database, og hver kunde skal oprettes med det autoincrement nyoprettede id i en anden tabel umiddelbart efter. Jeg kunne forestille mig at nogen ville sige man skulle lave en LOCK på kundetabellen for at undgå rod hvis nogen importerer samtidigt.

Men det holder ikke. Jeg har en bedre løsning, tror jeg.

Opret istedet et helt unikt id til hver kunde ved indsættelsen, og hent dem ud igen med dette id. Aflæs så det id som databasen har oprettet og opret kunderne i den anden tabel med det korrekte id.

Hvis man kan lave et 100% unikt ID for hvert emne ved indsættelsen, mener jeg denne model holder. Korrekt ??

Man kunne også bruge udelukkende det unikke ID man selv opretter, men jeg tror at hvis tabellen bliver meget stor, så bør id erne være autoincrement oprettede for at holde søgetider nede.
Avatar billede erikjacobsen Ekspert
26. februar 2011 - 19:05 #1
Prøv at kigge på GUID, som en del databasesystemer understøtter.
Avatar billede arne_v Ekspert
26. februar 2011 - 19:13 #2
Jeg vil antage at din database har support for at referere til det genererede id.

SQLServer:

INSERT tabel_1 VALUES (...)
INSERT tabel_2 VALUES (SCOPE_IDENTITY(), ...)

MySQL:

INSERT tabel_1 VALUES (...)
INSERT tabel_2 VALUES (LAST_INSERT_ID(), ...)
Avatar billede arne_v Ekspert
26. februar 2011 - 19:13 #3
Jeg kan iøvrigt ikke se nogen grund til at en auto increment id skulle være hurtigere end din egen id.
Avatar billede mousedreamer Nybegynder
26. februar 2011 - 19:33 #4
Godt med lidt feedback. GUID ser fint ud til at lave unikke id'er.

LAST_INSERT_ID() har et par problemer:
1. Måske kan en anden bruger indsætte en record inden jeg får læst LAST_INSERT_ID() hvis mange importerer samtidig.
2. Import bliver langsom, fordi jeg ikke kan lave en kæmpe lang insert into table med alle værdierne. Jeg er nødt til at have en insert for hver række fordi det er skiftevis den ene og den anden tabel.

Tager det ikke længere tid at finde et id hvis det er på 50 cifre istedet for på 10 ?

Hvis ikke, er der så ikke nogen andre problemer i at bruge lange id'er i en db på flere millioner records?
Avatar billede arne_v Ekspert
26. februar 2011 - 19:53 #5
re 1)

LAST_INSERT_ID er per connection, så der er ikke noget problem med flere samtidige brugere.

re 2)

Hvis du kan holde al information i memory, så bør du også kunne løse det performance problem ved multiple statements.
Avatar billede arne_v Ekspert
26. februar 2011 - 19:55 #6
Der er et eller andet sted mellem lidt og noget langsommere at bruge VARCHAR(50) fremfor INTEGER.

Men hvis en INTEGER kan være unik, så behøver du vel ikke lave din egen unikke id så lang?
Avatar billede mousedreamer Nybegynder
26. februar 2011 - 20:39 #7
GUID er på 40 cifre. Problemet er vel, at den ikke er unik, kun tilnærmelsesvis unik. Det samme med et integer id jeg laver.

Det er nok kun med last_insert_id jeg ikke behøver bekymre mig om unikke id'er.........

Men hvordan får jeg indsat en stor mængde emner ved at holde al information i memory? ved ikke helt hvordan jeg skal omsætte det i mysql....
Avatar billede arne_v Ekspert
26. februar 2011 - 22:15 #8
Hvis data mængden er så lille at den kan holdes i memeory bør performance slet ikke være et problem.

Hvis data er store, så skriv dem men hvis du bruger MyISAM tabeller så sæt:
  DELAY_KEY_WRITE=1
Avatar billede mousedreamer Nybegynder
23. marts 2011 - 06:20 #9
Arne, du skal have point for dine svar her. Det fungerer strålende med last_insert_id
Avatar billede arne_v Ekspert
23. marts 2011 - 14:10 #10
svar
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