webForumDet fria alternativet

Använda databas till detta eller är det bara prestandakrävande?

PHP

17 svar · 1 390 visningar · startad av bassebhu

Medlem sedan nov. 20016 480 inlägg
Frågan#1

Hej!

Jag har byggt en registreringsfunktion där medlemmar sparas i en tabell och användaruppgifter i en annan.

Hur ska man tänka för att få det så smidigt och prestandasnällt som möjligt?
Ska jag se till att alla inlägg kan hämtas utan att behöva koppla till användartabellen också? D v s. jag sparar namn, ort, epost även i inläggen. Om vi tänker stora volymer av poster i databasen. Vad går snabbast. Att hämta ut 200 av 20 000 poster där man bara hämtar från en tabell eller lika många poster där man hämtar användaruppgifterna från tabell 2? Tror ni förstår hur jag menar... hehe. det blir mindre data i databasen när man slipper spara användarfält i inläggstabellen, men å andra sidan blir det två tabeller den måste leta reda på om man väljer att relatera med id tabellerna emellan...

Fråga nummer 2: När man registrerar sig så får man fylla i län och kommun. Jag har fört in alla kommuner i databasen med kommun-id och län-id.
Just nu gör jag så att när man registrerar sig så sparas kommun-id i användarposten. Det betyder att när jag sedan ska skriva ut den posten så måste jag hämta kommun-namnet från kommuntabellen som relaterar till kommun-id't.

Är det bättre att bara spara kommun-namnet direkt i ett kommun-fält i användartabellen? Dvs skippa hela kommuntabellen och spara namnet direkt i användarfältet..?

Och om jag sedan vill ha en sökfunktion, är en php-sökning så pass säker att jag hittar lika bra om jag söker på kommunnamnet (t ex "Upplands Väsby") som om jag söker på upplands väsbys kommun-id? om den letar efter ett id-nummer vet jag ju att den kommer hitta det. men som sagt, hur är det med att söka på fraser som innehåller mellanslag och åäö och sånt..?

Visserligen är kommunfältet ingenting som klienten får fylla i fritt så det komemr att vara låsta val vilket som...

Ursäkta mina dåiga förklaringar men ni förstår säkert mina funderingar. Jag tänker stort nu alltså. Om man skulle ha 10 000 besökare samtidigt eller nåt :P

Tack!

Medlem sedan jan. 20023 327 inlägg
#2

Re: Använda databas till detta eller är det bara prestandakrävande?

bassebhu skrev:

Är det bättre att bara spara kommun-namnet direkt i ett kommun-fält i användartabellen? Dvs skippa hela kommuntabellen och spara namnet direkt i användarfältet..?

Att lägga in kommunen i användartabellen låter som en mycket dum idé då detta kommer att innebära rendundans så det skriker om det. Varför inte sätta kommunnamnet som primärnyckel i tabellen kommun och sedan ha det som en foreign key i användartabellen?

Medlem sedan nov. 20016 480 inlägg
#3

ok. först har jag inte en aning om vad rendundans så det skriker om det innebär..? :)

att sätta kommunnamnet som primärnyckel gör jag genom att klicka i nyckelsymbolen i phpmyadmin? :)
och detta med foreign key innebär? att jag bara tar med det som en join? eller måste göra något ytterligare..?

tack för svar

Medlem sedan nov. 20016 480 inlägg
#4

i så fall, är det samma med användarens namn, epost och ort m.m som man då inte borde spara i varje inlägg...? jag tycker att det borde bli slöare att hämta info från två tabeller om man har typ 20 000 poster. :)

Medlem sedan apr. 2002830 inlägg
#5

Jag skulle lagra användarinformationen i en tabell. När användaren postar ett inlägg så sparas enbart användar-idet i inläggstabellen.

Redundans innebär att du ha data i databasen som är samma på flertalet ställen. Exempelvis att du sparar ortnamnet dels i en ortstabell och att användaren skriver in sitt eget ortsnamn blir redundans... (http://www.susning.nu/Redundans och http://www.susning.nu/Normalisera#2)

I ditt fall skulle jag nog göra så att jag sparar ortsnamnet i en egen tabell, sedan koppla id-nummret till användartababellen... (och på så sätt undvika redundans i form av att X antal medlemmar skriver in Stockholm i ort-fältet)... Fast då finns det ju ingen möjlighet för folk att skriva lite lustiga saker i ortsnamnet, typ som "Mellan stol & flygel".... ;)

Det blir slöare för dig att hämta infon från två tabeller, det är sant. Men å andra sidan sparar du en massa utrymme genom att undvika rendundansen!

// Nippe

Medlem sedan nov. 20016 480 inlägg
#6

men som sagt så är mina ortsnamn låsta i select-val så användare kan inte skriva in någonting själv i det fältet. ändå smartare att hämta all den infon från medlemstabellen när man skriver ut inlägg..?

min fråga är bara för att jag vill göra rätt från början och ha det så snabbladdat som det bara går.

om jag nu går på er linje med att hämta alla användaruppgifter från medlemstabellen.. hur ska jag göra för att det ska gå snabbladdat.. en join som ser ut hur? ska jag mixa nåt med primary key eller vad det var? och ska jag ange i sql-frågan vilka fält som ska hämtas så att jag inte sätter * och får en magnifik fråga som tar 20 minuter att fixa...

tack!

Medlem sedan juni 20001 521 inlägg
#7

Om det är ett relativt litet antal olika orter skulle du kunna lagra enbart en siffra som du sedan gör om till rätt ort direkt i PHP.

username    userid    ort
Basse       15         0
Kitti       16         1
<?
# Plocka orten ur databasen
...

# Koppla ihop ortssiffran med ett ortsnamn
$ortsnamnslista = array("Fjollträsk", "Långtbortistan");
$ortsnamn = $ortsnamnslista[$ortssiffra];
?>
Medlem sedan nov. 20016 480 inlägg
#8

nej, det är samtliga kommuner i sverige så det är nog en osmidig lösning. allihop finns redan i min databas. och javascriptet är kirrat ;)

men jag gillar ditt exempel :D

Medlem sedan nov. 20016 480 inlägg
#9

bassebhu skrev:

om jag nu går på er linje med att hämta alla användaruppgifter från medlemstabellen.. hur ska jag göra för att det ska gå snabbladdat.. en join som ser ut hur? ska jag mixa nåt med primary key eller vad det var? och ska jag ange i sql-frågan vilka fält som ska hämtas så att jag inte sätter * och får en magnifik fråga som tar 20 minuter att fixa...

...? :) tacksi

Medlem sedan apr. 2002830 inlägg
#10
SELECT 
    i.inlagg,
    m.medlem_namn,
    o.ort_namn
FROM
    inlaggstabell AS i,
    medlemstabell AS m,
    ortstabell AS o
WHERE 
    i.inlagg_id = X
  AND
    i.medlem_id = m.medlem_id
  AND
    m.ort_id = o.ort_id

Så skulle jag gjort i alla fall!

Medlem sedan nov. 20016 480 inlägg
#11

ok. funkar det bättre än join? och är det snabbare om vi snackar stora volymer och många användare?

Medlem sedan nov. 20016 480 inlägg
#12

ok, min fråga kvarstår.

om jag vill spara alla inläggsdata i inläggstabellen MEN hämta bara ett fält från medlemstabellen. låt säga "namn".

tjänar jag då på att lägga till namnet i varje inlägg i stället för att hämta från två tabeller? finns det någon ungefärlig gräns vad gäller snabbladdning i förhållande till databasstorlek...?

som sagt: sparar jag kontaktuppgifter i varje inlägg så tar det mycket utrymme i databasen. hämtar jag å andra sidan kontaktuppgifter för varje inlägg från medlemstabellen så får jag två tabeller att hämta ifrån, vilket jag tycker bör vara segt. har jag fel? återigen tänker jag på hur en databas kan växa till gigantiska volymer och vill göra rätt från början...

och en fråga till: bör jag spara ip i varje inlägg eller räcker det om det sparas i medlemskolumnen när medlemmen blir registrerad?

Medlem sedan nov. 20041 740 inlägg
#13

bassebhu skrev:

och en fråga till: bör jag spara ip i varje inlägg eller räcker det om det sparas i medlemskolumnen när medlemmen blir registrerad?

Du bör spara i varje inlägg. Det kan ju vara någon som råkar bli av med sitt lösenord till fel person, och då kan det vara bra att se vad som har hänt.

Jag är osäker på dina övriga frågor. Du skulle ju kunna slänga upp en testdatabas med utslumpad data och helt enkelt mäta snabbheten på de olika metoderna.

Medlem sedan nov. 20016 480 inlägg
#14

ok tack.

har php någon liten funktion för att skriva ut laddningstiden?
hur fungerar wF's:
"Servern genererade sidan på 0.2920020 sekunder (88.21% PHP - 11.79% MySQL). Antal SQL-frågor: 37"

t ex?

Medlem sedan juni 20006 031 inlägg
#15

bassebhu skrev:

ok tack.

har php någon liten funktion för att skriva ut laddningstiden?
hur fungerar wF's:
"Servern genererade sidan på 0.2920020 sekunder (88.21% PHP - 11.79% MySQL). Antal SQL-frågor: 37"

t ex?

<?php
//överst på sidan
$tid_start = microtime();
?>
Här kommer det som ska visas på sidan!
Alltså din html kod m.m
<?php
// Längst ner på sidan
$tid_slut = microtime();
$tid = $tid_slut - $tid_start;
echo "<b>Sidan laddades på: " . round($tid, 5) . " sekunder</ b>";
?>
Medlem sedan apr. 2002830 inlägg
#16

Angående dina frågor att hämta från en tabell vs. att hämta från två (eller flera). Det torde vara snabbare att hämta data från enbart en tabell.

MEN, om du nu tänker dig att din databas växer "till gigantiska volymer" så kommer du i sådanafall ha en massa data som är reduntant (som vi tidigare diskuterade). Det innebär alltså att din databas kommer att ta upp mycket mer utrymme om du väljer att lagra datan i en tabell.

-> MAO, om du lagrar 'ort' i varje rad i din medlemstabell så tar det upp mer utrymme än det skulle göra att lagra det i en egen tabell och sedan enbart ha ett ID som kopplar medlemmens ort till.

Kontanta: Det du eventuellt vinner i snabbhet på att ha allt i en tabell förlorar du i utrymme. Och en större databas borde vara långsammare att söka i än en som är bra normaliserad och därmed mindre...

Ang. IP-kollen så håller jag med övriga talare - lagre IP för varje inlägg!

// Nippe

Medlem sedan nov. 20016 480 inlägg
#17

ok, tack för synpunkterna :)

nu är jag inne på att låta vissa uppgifter sparas i inlägget eftersom jag vill att m,an ska kunna redigera endast dem. dvs medlemsinfot används bara för att hämta till förifyllda fält. hade jag inte haft det så så hade jag nog valt att hämta allt från medlemstabellen då det rörde sig om typ 5 fält.

möjligt att jag kommer att få ångra det senare, men jag vill att man ska kunna ha olika telefonnummer och sånt i olika inlägg.

ip i varje inlägg ska fixas. tack

Medlem sedan apr. 2002830 inlägg
#18

bassebhu skrev:

möjligt att jag kommer att få ångra det senare, men jag vill att man ska kunna ha olika telefonnummer och sånt i olika inlägg.

Ja, då måste du nog lösa det genom att placera informationen i inläggstabellen.

Men du skall vara medveten om att det kan ställa till problem för dig senare. Om en medlem flyttar/byter nummer så kommer ju då inaktuella uppgifter att finnas i inlägget...

Nyfiken: Vad är det du knåpar med? Mycket frågor från dig i PHP nu ;)

// Nippe

273 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
142 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)