Avatar billede fixxxer Nybegynder
26. juli 2004 - 10:42 Der er 20 kommentarer og
1 løsning

Design af database

Jeg har et lille relationsdatabaseproblem, jeg håber der er nogle dygtige database-folk som har en idé til at få løst.

Jeg skal lave et meget dynamisk pris-system. Jeg prøver at illustrere det med tegn:

|----------|--------|---------|---------|
| -------- |  Tog  |  Bus  |  Fly  |
| 11/01-04 | 999 kr |  900 kr | 1100 kr |
| 18/01-04 | 950 kr |  800 kr | 1000 kr |
|----------|--------|---------|---------|

Hver pris har en dato og en måde at rejse på. Både dato og rejsemåde er variabler, der kunne være hvad som helst.

Indtil videre har jeg lavet det som 3 tabeller. En til datoer, en til rejsemåder og en til priser. De kædes sammen af en 4. tabel vi kan kalde "rejsemål", der har en ID-værdi der fortæller hvilke datoer, rejsemåder og priser den skal hænge sammen med.

Men som det er her får jeg et hav af rækker i hhv. datoer og rejsemåder, selvom der reelt set kun er behov for brøkdel, da der unægteligt vil opstå gentagende datoer/rejsemåder.

Så mit spørgsmål lyder: Er der en smart måde at lave denne type relationsdatabase, som fylder mindre end min nuværende. Hvis ja, hvordan og hvis nej, hvorfor ikke?
Avatar billede overchord Nybegynder
26. juli 2004 - 10:59 #1
Hvordan kaeder du tabellerne sammen nu?
For mig at se vil de nemmeste vaere 1 tabel med
Dato, Rejsemaade, Pris

Herefter kan du samle og gruppere med queries.
Avatar billede arne_v Ekspert
26. juli 2004 - 11:05 #2
Det er stort set irrelevant hvor meget data fylder.

Det vigtigste er:
  konsistente data
  anvendelighed

Umiddelbart tror jeg at en af følgende tabeller er det du leder efter:

  rejsemål (delt primær nøgle)
  rejsemåde (delt primær nøgle)
  dato (delt primær nøgle)
  pris

  id (primær nøgle)
  rejsemål
  rejsemåde
  dato
  pris


  rejsemål (delt primær nøgle)
  rejsemåde (delt primær nøgle)
  startdato (delt primær nøgle)
  slutdato
  pris

  id (primær nøgle)
  rejsemål
  rejsemåde
  startdato
  slutdato
  pris
Avatar billede arne_v Ekspert
26. juli 2004 - 11:06 #3
Hvor de 2 åbne spørgsmål er:

* vil du have et it felt som primær nøgle eller have en delt primær nøgle ?

* vil du have en record for hver dato eller vil du have start og slut dato ?
Avatar billede fixxxer Nybegynder
26. juli 2004 - 11:23 #4
Jeg har ikke tænkt på muligheden at lave det i een tabel. Umiddelbart ville jeg synes at det er svært at bygge et interface over data fra een tabel, men måske ser jeg det bare forkert an?

Start og slut dato ville være en oplagt mulighed, så det er nok den model jeg vil bruge. Og så må du forklare mig hvad jeg opnår ved at bruge de delte primærere nøgler frem for primærere nøgler - og omvendt.


Pt kæder jeg sammen med nogle id-værdier til de forskellige tabeller, og den rækker jeg skal bruge, ved ikke om det gør dig klogere på hvad jeg vil frem til.
Avatar billede fixxxer Nybegynder
26. juli 2004 - 11:48 #5
Nu har jeg flettet noget sammen, som jeg tror at er det du (arne_v) vil frem til

http://eks.subwww.dk/data.htm
Avatar billede fixxxer Nybegynder
26. juli 2004 - 11:50 #6
Hvis jeg ellers har gjort det korrekt, så kommer det store spørgsmål, hvordan behandles det således at jeg får vist det som min illustration, med ASP?
Avatar billede arne_v Ekspert
26. juli 2004 - 11:58 #7
Er det ikke en helt standard udfør SELECT og vis result ste i HTML table ?
Avatar billede arne_v Ekspert
26. juli 2004 - 11:58 #8
result set
Avatar billede fixxxer Nybegynder
26. juli 2004 - 12:04 #9
Joh med det er jo noget løkke haløj?
Avatar billede arne_v Ekspert
26. juli 2004 - 12:17 #10
Ja.

Noget a la:

<%
Set con = Server.CreateObject("ADODB.Connection")
con.Open "en eller anden connection string"
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open "SELECT * FROM tabel",con
%>
<table border>
<%
Do While Not rs.EOF
%>
<tr>
<td>
<%=rs("felt1")%>
</td>
...
<td>
<%=rs("felt5")%>
</td>
</tr>
<%
rs.MoveNext
Loop
%>
</table>
<%
Set rs = Nothing
Set con = Nothing
%>
Avatar billede fixxxer Nybegynder
27. juli 2004 - 15:27 #11
Ikke at jeg tvivler på dine evner i ASP, men vil overstående koder returnere rækker i dette format?

|----------|--------|---------|---------|
| -------- |  Tog  |  Bus    |  Fly    |
| 11/01-04 | 999 kr |  900 kr | 1100 kr |
| 18/01-04 | 950 kr |  800 kr | 1000 kr |
|----------|--------|---------|---------|
Avatar billede fixxxer Nybegynder
27. juli 2004 - 15:29 #12
Avatar billede arne_v Ekspert
27. juli 2004 - 15:47 #13
Ovenstående returnerer data i en HTML table. Du skal rette tabelnavn og feltnavne.
Samt tilføje overskrifterne.
Avatar billede fixxxer Nybegynder
27. juli 2004 - 15:56 #14
Overskrifterne er en del af dynamikken i mit udtræk, og derfor at jeg vil have dem med i databasen. Da jeg havde de 3 typer data i hver sin tabel, kunne jeg lave en løkke med udtræk af rejsemåde, inde i den en løkke med datoer og priser. Og så få overnævnte format.

Derfor er det som jeg ser det med en tabel, dælme svært at få data ud på den måde jeg godt vil have det.

Ellers skal jeg lave et udtræk hvor jeg gruppere datoerne, løkke; gruppere rejsemåder, løkke; og så på en smart måde trække priserne ud i deres respektive data/rejsemåde.
Avatar billede fixxxer Nybegynder
27. juli 2004 - 16:00 #15
Sådan ser mit "gamle" system ud, den looper gennem de 3 tabeller og danner en tabel jeg efterspørger:

<table border="0" width="550" cellpadding="0" cellspacing="0">
    <tr>
    <% set prisgrupperRS = Conn.Execute("SELECT * FROM prisgrupper WHERE prisChild = " & clid("childID"))
      if not prisgrupperRS.eof then %>
      <td>&nbsp;</td>
      <% end if
      do while not prisgrupperRS.eof %>
      <td align="center"><b><%=prisgrupperRS("prisNavn")%></b></td>
      <% prisgrupperRS.MoveNext
      loop %>
    </tr>

    <%
      SQL = "SELECT * FROM prisperioder WHERE prisChild = " & clid("childID") & " AND prisShow = 'True' ORDER BY prisPeriode ASC"
      set pristypeRS = Conn.Execute(SQL)
      do while not pristypeRS.Eof
        PT = PT +1
        if PT mod 2 = 0 then
          rowColor = "#E4E4E4"
        else
          rowColor = ""
        end if
    %>
    <tr bgcolor="<%=rowColor%>"><td><b><%=pristypeRS("prisType")%></b></td>
    <%
      SQL = "SELECT * FROM prisgrupper WHERE prisChild = " & clid("childID") & " ORDER BY prisGruppeID ASC"
      set prisgrupperRS = Conn.Execute(SQL)
      do while not prisgrupperRS.eof
        set prispriserRS = Conn.Execute("SELECT * FROM prispriser WHERE prisPeriode = " & pristypeRS("prisPeriode") & " AND prisGruppe = " & prisgrupperRS("prisGruppeID"))
        do while not prispriserRS.eof %>
          <td align="center"><% if prispriserRS("prisValue") <> 0 then Response.Write prispriserRS("prisValue") & ",-" end if %></td>
    <%
          prispriserRS.MoveNext
        loop
      prisgrupperRS.MoveNext
    loop
    %>
    </tr>
    <%
        pristypeRS.MoveNext
      loop %>
</table>
Avatar billede arne_v Ekspert
27. juli 2004 - 16:07 #16
OK

Du har altså ikke brug for at få at vide hvordan man laver en HTML table
udfra database data.

Mit bud på det var helt generelt og ikke relateret til den specifikke
database struktur jeg foreslog.
Avatar billede fixxxer Nybegynder
27. juli 2004 - 16:10 #17
OK det er jeg ked af, så vil jeg tro at der ikke er nogen anden løsning end den jeg selv er kommet op med?
Avatar billede arne_v Ekspert
27. juli 2004 - 16:13 #18
Udtrækket tror jeg at du skal lave som:

SELECT rejseMåde,rejseStart,rejsePris
FROM tabelnavn
WHERE rejsemål='xxxx'
ORDER BY rejseStart,rejseMåde

og så læser du records og fylder ind i tabellen.
Avatar billede arne_v Ekspert
08. august 2004 - 22:14 #19
OK ?
Avatar billede fixxxer Nybegynder
02. september 2004 - 08:17 #20
Nej ikke OK.

Jeg synes ikke det løser mit problem. Hvis jeg skal bruge det til noget, skal jeg have et mere konkret eksempel.
Avatar billede fixxxer Nybegynder
24. oktober 2004 - 20:16 #21
Jeg tænker stadig på hvordan det kan løses..
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