Optimera användartabeller - MySQL

Permalänk

Optimera användartabeller - MySQL

Det som händer är att vi hade en gammal lösning för användare (tabellen "Users"), den här ville kunden bygga ut så vi valde att komplimentera användarinformationen med en till tabell kallad då "Extended_Users". Samtidigt skall de ha ett invitesystem där den som är först på inviten ska få lite speciella förutsättningar (se "InviteSystem").

Nu då man registrerar en användare så innebär ju detta att det blir tre databasanrop efter varandra vilket väl kan vara dumt, eller vad säger experterna?

Går det och hur skulle jag kunna göra nedan kod mer optimerad?

// ### Vanliga användartabellen mysql_query("INSERT INTO Users VALUES ( '', '$UserName', '".sha1($Password)."', '$Email', '$Name', '$SurName', '1', '', '', '', '', '$MobileExtended', '', '', '' )") or die(mysql_error()); $used_id = mysql_insert_id(); // Senaste "UserID" // ### Extended användartabellen mysql_query("INSERT INTO Extended_Users VALUES ( '$used_id', '$InviteCode', '$Gender', '$Address', '$PostalCode', '$City', '$Country', '$MobileExtended', '$Occupation', '$HowFindUs' )") or die(mysql_error()); // ### Uppdatera inviten med ny information mysql_query("UPDATE InviteSystem SET FirstUserID=IF(FirstUserID='0','".$used_id."',FirstUserID), FirstUsed=IF(FirstUsed='0','".time()."',FirstUsed), LastUsed='".time()."', NumberUsed=NumberUsed + 1 WHERE InviteCode='$InviteCode'") or die(mysql_error());

Permalänk

Ingen som har en aning eller iaf kan skriva en kommentar? Får inte svar på något forum där jag postat detta och förstår inte varför. :S

Permalänk
Medlem

En tanke är att det skulle kanske vara lite säkrare/smidigare om du använder dig av TRANSACTION också. Då slipper du få inkonsekvent data i databasen om det skulle gå åt pipan någonstans i de 3 anropen.

Permalänk
Medlem
Skrivet av -=*ThE_cRoW*=-:

Ingen som har en aning eller iaf kan skriva en kommentar? Får inte svar på något forum där jag postat detta och förstår inte varför. :S

För att du troligtvis försöker lösa ett "problem" som inte finns.
Sen bör du definiera vilka fält du ska initiera när du kör en insert. För om du ändrar tabellstrukturen (tar bort fält eller lägger till fält) så kommer alla dina inserts att faila om du inte uppdaterar dessa.

Permalänk

guttersnipe, Hur gör jag det?

iXam, Se, det fanns ett problem. Och du kommentera det och nu är koden ännu bättre.

Permalänk
Medlem
Skrivet av -=*ThE_cRoW*=-:

guttersnipe, Hur gör jag det?

Google is your friend

Rätt ok beskrivning: http://www.linuxdig.com/news_page/1079394922.php (Se även nackdelarna som listas)

På detta sätt så kan du göra rätt enkel felhantering på serversidan. Du slipper kolla varje operation innan nästa ska utföras (transaction returnerar true/false beroende på hur det gått)

Dock som det står i länken så kostar det lite mera att göra på detta sätt än att köra direkta operationer mot db.

Permalänk
Medlem
Skrivet av -=*ThE_cRoW*=-:

iXam, Se, det fanns ett problem. Och du kommentera det och nu är koden ännu bättre.

Jopp. Men det har "inget" med optimering att göra. Men skoj att jag kunde hjälpa till mot det bättre.
Sen håller jag med om att du borde köra lite mer felhantering. Att köra transaktioner KANSKE är lite overkill men det skulle kunna vara rätt väg att gå.
Men kör du MySQL så är det ju viktigt att du kör en lagringsmotor som hanterar transaktioner vilket default (MyISAM) inte gör utan vanligast är att man kör InnoDB. Men då ska man vara vaksam på det saker som är annorlunda med innodb såsom exempelvis att autoincrementfält riskeras återanvändas.