webForumDet fria alternativet

Databasuppbyggnad, hjälp!

ASP

9 svar · 190 visningar · startad av Harback

Medlem sedan juni 2001206 inlägg
Frågan#1

Hejsan.

Har gjort ett quiz-liknande system där besökaren svarar på några frågor.
Alla frågor ligger i en tabell och alla svar i en annan.
Hur ska jag koppla ihop frågorna med svaren om jag vill att alla svar för varje gång ska ligga som en ny post i svartabellen? Jag vill göra detta för att kunna veta vilka svar som tillhör vilka andra svar, om ni förstår? Det kanske finns något bättre sätt?

Kanske svårt att förstå men jag visar här hur jag gjort hittills så ni kanske förstår bättre:

tblFraga
--ID - räknare
--fldFrageID - frågeid
--fldFraga - frågan

tblSvar
--ID - räknare
--fldUserID - användarens id
--fldsvar1 - svar till fråga 1 (fldfrageid = 1)
--fldsvar2 - svar till fråga 2 (fldfrageid = 2)
--fldsvar3 osv...
--fldDatum - datum

Hur ska jag kunna koppla ihop svaren med frågorna, ifall jag vill kolla på en av användarens svar på alla frågor (inte alla gånger användaren svarat)? Finns det kanske något bättre sätt?

Jättetacksam ifall någon kan hjälpa mig, har fastnat...

------------------
mvh
Harback

Medlem sedan dec. 200012 464 inlägg
#2

tblFraga
--fldFrageID - frågeid
--fldFraga - frågan

tblAnv
-- fldUserID
-- fldUserName
-- fldDatum

tblSvar
--fldUserID - användarens id
--fldFrageID - foreign key till tblFraga
--fldsvar - svar

alltså en rad för varje svar och användare.

T.ex. alla svar för en viss användare, dom frågor han inte svarat på kommer upp som null.

select * 
 from tblFraga F left join 
      tblSvar S 
  on f.fldFrageID = S.fldFrageID 
 and s.fldUserID = 4711

------------------
essentitia preter non sans multiplicandum

Medlem sedan juni 2001206 inlägg
#3

Men problemet var ju att användarna kommer att svara flera gånger och hur ska man då veta vilka svar som tillhör vilka andra svar för varje gång denne har svarat?

T.ex. hur ska man veta att fråga 1 tillhör en viss fråga 2, fråga 3 etc?

------------------
mvh
Harback

Medlem sedan dec. 200012 464 inlägg
#4

Om du har en timestamp-kolumn med i svarstabellen då.

------------------
essentitia preter non sans multiplicandum

Medlem sedan juni 2001206 inlägg
#5

Menar du att man ska datummärka alla svaren?
Kom och tänka på det att det blir ju en massa poster eftersom det är 25 frågor som ska besvaras och om varje användare svarar så blir det ju en sjuhelsikes massa poster efter att ett par användare svarat, eller hur? Det var därför jag tänkte göra så som jag tänkt i början med alla svaren i en post men jag kom inte på hur jag skulle relatera svaren till frågorna.
Går det eller är ditt sätt det enda möjliga i mitt fall?

------------------
mvh
Harback

Medlem sedan dec. 200012 464 inlägg
#6

Jo, ett datum eller något sekvensnummer behövs det. Att ha en kolumn för varje svar är inte speciellt flexibelt. T.ex. om du lägger till en ny fråga så måste du ändra tabelldefinitionen.

Hur många användare blir det?

1000 som svarar 10 gånger på alla frågor?

= 250000 poster. Låter inte speciellt mycket.

I svarstabellen skulle då

flduserid,fldSekno,fldFrageID

utgöra primärnyckel.
------------------
essentitia preter non sans multiplicandum

[Redigerat av LarsG den 01 nov 2001]

Medlem sedan juni 2001206 inlägg
#7

Okej, men sen blir det förmodligen ett problem till.
Eftersom jag ska lägga till alla svar i databasen när sista frågan är slut, blir det inte 25 SQL-satser att exekvera? Det borde väl ta ganska lång tid (använder access 2000)?

Frågorna kommer alltid vara samma så att det behövs för den delen inte göras någon ändring i designen för tabellerna vid ett senare tillfälle. Om det går att lösa det med en post istället för 25 så borde det väl gå ganska mycket snabbare att dels lägga till svaren och även hämta svaren? Men det kanske inte är möjligt att relatera svaren med frågorna sen?

------------------
mvh
Harback

Medlem sedan dec. 200012 464 inlägg
#8

Visst det tar lite längre tid att lagra svaren, men om du använder ett commandobject med parametrar så borde inte det vara så farligt.

När du hämtar data så förlorar du på att det lagras som en post. (Om du joinar tabellerna så får du alla svar för alla frågor, dvs det blir mer data att hämta.)

------------------
essentitia preter non sans multiplicandum

Medlem sedan juni 2001206 inlägg
#9

Hej igen.

Okej, det får bli ditt förslag på postlagringen.

"... men om du använder ett commandobject med parametrar så borde inte det vara så farligt. "

Du kan möjligtvis inte visa ett exempel på hur man kan göra, eller någon guide? Är inte så säker på commandobjektet...

------------------
mvh
Harback

Medlem sedan dec. 200012 464 inlägg
#10

Ett exempel med CMD (kräver adovbs.inc)


<%
Option Explicit

dim connect,cmd,sql,i
set connect = server.createobject("adodb.connection")
set cmd = server.createobject("adodb.command")
connect.open "dsn"

sql = "INSERT INTO ParamTest(fname,lname,adress) VALUES (?,?,?)"
Set cmd.ActiveConnection = connect
cmd.CommandText = sql
cmd.CommandType = adCmdText
With cmd
    .Parameters.Append .CreateParameter("FNAME", adVarChar, adParamInput, 30, "")
    .Parameters.Append .CreateParameter("LNAME", adVarChar, adParamInput, 30, "")
    .Parameters.Append .CreateParameter("ADRESS", adVarChar, adParamInput, 30, "")
end with 

connect.begintrans
for i = 1 to request.form("lname").count
  cmd("FNAME") = request.form("lname")(i)
  cmd("LNAME") = request.form("fname")(i)
  cmd("ADRESS") = request.form("adress")(i)
  cmd.Execute 
next
connect.commit
%>

red: lade till transaktionshantering

------------------
essentitia preter non sans multiplicandum

[Redigerat av LarsG den 03 nov 2001]

266 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)
130 ms — ändringar (db)