[db/php] opzetten

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
dit is een oud topic, het nieuwe probleem dat is ontstaan staat verder naar beneden :) [rml]FoOL in "[ db/php] opzetten"[/rml]

Na een aantal dagen (!) nadenken (nee dat is niet fulltime ;)) post ik het nu eens hier :)

Ik moet een tool maken waarmee gegevens opgevraagd kunnen worden (ja dat is vaag maar het doet ook niet ter zake) en op het scherm getoond worden. Ik gebruik MySQL en PHP. Ik verwacht niet veel problemen tijdens het devven, het enige probleem waar ik tegenaan loop is de opzet van de db.

Stel, het gaat om persoonsgegevens.

Je zou van iemand de volgende gegevens kunnen hebben:

code:
1
2
3
4
5
6
7
8
9
10
* persoonlijk
  voornaam
  achternaam
  geboortedatum
* offline
  adres
  woonplaats
* online
  emailadres
  website url

De sterretjes duiden categorieën aan. Deze zijn variabel ( -> de user moet categorieën kunnen maken, ordenen etc.)

voor de categorieën zou ik een tabel kunnen maken:

code:
1
2
3
4
5
6
7
8
table categories

+----+---------+----------+
| id | caption | sortnmbr |
+----+---------+----------+
|  0 | offline |        1 |
|  1 |  online |        2 |
+----+---------+----------+
op deze manier dus.

Wat de andere velden betreft (ook de velden ( -> de columns in de table ) : deze zijn ook variabel. Ik stel me dus een data tabel voor waar de records in staan (dus naam, adres, geboortedatum, etc), maar daarnaast nog een tabel met meer informatie, namelijk over de eigenschappen van die velden, waaronder
  • onder welke categorie het veld valt
  • wat de titel van het veld is
  • of het een varchar / text is (meer zal niet nodig zijn)
  • het id van het veld
  • volgorde binnen categorie
code:
1
2
3
4
5
6
7
8
table column_properties

+---------+---------+----------+-------------+----------+
| colname | caption | sortnmbr | category_id | datatype |
+---------+---------+----------+-------------+----------+
| 1stname |   First |        4 |           2 |     text |
| 2ndname |    Last |        5 |           2 |     text |
+---------+---------+----------+-------------+----------+

dit idee dus.

dan nog de eigenlijke data table:

code:
1
2
3
4
5
6
+----+---------+---------+
| id | 1stname | 2ndname |
+----+---------+---------+
|  1 |    FoOL |   blaat |
|  2 |     Jan |  Jansen |
+----+---------+---------+

Nu zit ik alleen met 1 vraagstuk: hoe ga ik deze gegevens ophalen? Stel ik haal één row op uit de data tabel, hoe haal ik daar dan de eigenschappen van de velden bij? (onder welke categorie valt de voornaam, hoe heet het veld en moet ik de inhoud weergeven in een textarea of een 1regelige input?)

Misschien hebben jullie ideeën over hoe je een db als deze beter op kunt zetten, of misschien kunnen jullie aangeven hoe ik de gegevens in PHP bij elkaar kan verzamelen?

Bedankt :*

edit:

openingspost aangepast, zie de replies hieronder :)

edit2:
Ik zal het er nog even duidelijk bij zeggen: ik zit nu al dagenlang met dit probleem in m'n kop, en ik kom gewoon niet op een goede oplossing. Ik heb al met een aantal medetweakers over dit probleem gesproken, maar we komen niet op een bruikbare oplossing. Ik hoop dat jullie me een trap in de goede richting kunnen geven :)

[ Voor 25% gewijzigd door Verwijderd op 22-12-2002 11:30 ]


Acties:
  • 0 Henk 'm!

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 15-09 18:24

dusty

Celebrate Life!

Ga eerst eens de eerste versie van je eigen database model opzetten, ga die normaliseren en kom dan nog eens terug met de vraag of er wat fout is aan je database model en zo ja wat.

Dit lijkt op het moment teveel op een script request. ( ie. Dit is mijn probleem, wat kan ik het beste doen? ), eerst zelf proberen!

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Acties:
  • 0 Henk 'm!

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 15-09 18:24

dusty

Celebrate Life!

Weer open. :)

foOl heeft beloofd om zijn openings post aan te passen..

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Acties:
  • 0 Henk 'm!

Verwijderd

Probeer eens een tekening te maken van je datastructuur en de onderlinge relaties:
n:1, 1:1 en n:m. Dit is dus een onderdeel van het normaliseren.
n:m relaties zijn bijvoorbeeld wanneer 'n' personen tot 'm' categorien tegelijk kunnen behoren.
Voor n:m relaties kun je een koppel-tabel gebruiken en voor de queries zijn joins je vriend.

Have fun :)

Acties:
  • 0 Henk 'm!

  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 17-09 07:55

thomaske

» » » » » »

Het is m.i. nog mooier als je het helemaal generiek zou oplossen, dus dat je de persoons-gegevens meteen koppelt aan je column-proprties table. Zo kan je dynamisch je beschikbare velden aanpassen.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
table column_properties

+-----+---------+---------+----------+-------------+----------+
| id  | colname | caption | sortnmbr | category_id | datatype |
+-----+---------+---------+----------+-------------+----------+
| 1   | 1stname |   First |        4 |           2 |     text |
| 2   | 2ndname |    Last |        5 |           2 |     text |
+-----+---------+---------+----------+-------------+----------+


table column_data

+----------+----------+-----------+
| prop_id  | user_id  | col_value |
+----------+----------+-----------+
| 1        | 1        | Jan       |
| 2        | 1        | Janssens  |
| 1        | 2        | Piet      |
| 2        | 2        | Pietersen |
+----------+----------+-----------+


zoiets :)

Als dan bijvoorbeeld blijkt dat mensen ook graag hun icq nummer erbij willen opslaan, voeg je alleen een regel toe in je colum_properties tabel!

[ Voor 9% gewijzigd door thomaske op 03-12-2002 09:50 ]

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
thomaske: dat is een aanpak waar ik nog geen moment aan gedacht had, ik zit het nu allemaal even uit te tekenen en ik geloof dat het een handige aanpak is die ik in geen tijden bedacht zou hebben.

Het idee spreekt me erg aan, ik ga even een testdb opzetten om te kijken hoe ik een en ander moet uitwerken, bedankt :)

ik zie graag dat deze thread nog even openblijft voor alternatieve oplossingen en om nog relevante vragen te kunnen stellen

edit:

Ik zie ineens wel een redelijk probleem:

column_data.col_value moet van een bepaald type zijn, bijvoorbeeld VARCHAR. Alle gegevens kunnen dan bijvoorbeeld max. 255 alfanumerieke tekens bevatten. Neem ik voor column_data.col_value een TEXT, dan wordt de db weer onnodig groot.... Ik vrees dus dat ik toch een andere oplossing moet gaan zoeken ;( Iemand andere ideeën?

[ Voor 30% gewijzigd door Verwijderd op 03-12-2002 15:23 ]


Acties:
  • 0 Henk 'm!

  • DeTeraarist
  • Registratie: November 2000
  • Laatst online: 18:43

DeTeraarist

#Boots2Asses

Volgens wat ik uit de help opmaak, maakt dat niet uit:
BLOB
TEXT

A BLOB or TEXT column with a maximum length of 65535 (2^16 - 1) characters. See Silent column changes. See BLOB.
Alleen een maximum length, geen minimum, alleen wil dat nog niet veel zeggen.
Gaan we verder kijken bij Silent column changes, dan staat er o.a. dit (het heeft er niets mee te maken, maar het gaat even om het dikke gedeelte:
If any column in a table has a variable length, the entire row is variable-length as a result. Therefore, if a table contains any variable-length columns (VARCHAR, TEXT, or BLOB), all CHAR columns longer than three characters are changed to VARCHAR columns. This doesn't affect how you use the columns in any way; in MySQL, VARCHAR is just a different way to store characters. MySQL performs this conversion because it saves space and makes table operations faster. See Table types.
Waar ik uit opmaak, dat TEXT dus een variable length column is en dus geen loze ruimte reserveert.

Soms, als ik heel stil ben, kan ik de zon horen schijnen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik geef dit topic even een schop, ik loop namelijk tegen een probleem aan dat hieraan verwant is. Ik heb nu een tabel zoals onderstaande:
code:
1
2
3
4
5
6
7
8
table column_properties

+-----+---------+---------+----------+-------------+----------+
| id  | colname | caption | sortnmbr | category_id | datatype |
+-----+---------+---------+----------+-------------+----------+
| 1   | 1stname |   First |        4 |           2 |     text |
| 2   | 2ndname |    Last |        5 |           2 |     text |
+-----+---------+---------+----------+-------------+----------+

Het gemakkelijke van deze table opzet is dat alles wat je hoeft te doen is een nieuwe row in deze tabel invoegen. Dat is erg handig, maarrrrrrrr...
Als ik nu een row wil invoegen die in mijn tooltje onder 1stname wordt weergegeven, moet ik nu achtereenvolgens de waarde sortnmbr van 2ndname met 1 verhogen en dan de nieuwe row invoegen. Dat is hier niet zo erg, maar als ik 30 properties heb en ik wil een nieuwe 'bovenaan' invoegen zal ik eerst in 30 queries de sortnmbr's van de andere rows moeten ophogen, en dat is nou niet bepaald handig te noemen :)

Kan dit op een makkelijker manier? Misschien ben ik wel heel fout bezig met de column sortnmbr, misschien zijn er andere methoden om hetzelfde te bewerkstelligen?

Acties:
  • 0 Henk 'm!

  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 17-09 07:55

thomaske

» » » » » »

werkt zoiets niet:

code:
1
2
3
4
5
6
7
8
update 
  column_properties 
set 
  sortnmbr = sortnmbr+1 
where 
  category_id = 2 
  AND 
  sortnmbr > 4

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."

Pagina: 1