Hoe lees en schrijf ik in een genormaliseerde database.

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Koos jansen

koos jansen

27/02/2012 10:54:27
Quote Anchor link
Er zijn redelijk wat topics die uitleggen hoe je data moet normaliseren, maar ik heb niets kunnen vinden over het schrijven en uitlezen binnen php.

Zou iemand mij eens een query voor willen doen hoe deze 'n' kan worden gelezen of worden weg geschreven?:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
-lid-id
-a-id
-z-id
-r-id
n
j
f
 
PHP hulp

PHP hulp

29/03/2024 00:23:54
 
Jacco Engel

Jacco Engel

27/02/2012 10:55:49
Quote Anchor link
SELECT * FROM tabelnaam
SELECT * FROM tabelnaam WHERE kollomnaam = waarde

Youre welcome
 
Frank WD

Frank WD

27/02/2012 11:08:42
Quote Anchor link
Jacco,

Waarom die * gebruiken?
Dit word eerder afgeraden dan aan gemoedigd.

Je kan beter je Query voluit noteren.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
SELECT
 veld1,
 veld2,
 veld3
FROM
 tabel
WHERE
 veld1=waarde
?>


Want zo haal je de gegevens op die je nodig hebt.
Als je * gebruikt en je hebt 10 velden waar je in je Query maar 3 nodig hebt.
Dan laad je wel 7 onnodige velden in die je nergens in je script wilt gebruiken.
Gewijzigd op 27/02/2012 11:09:06 door Frank WD
 
Koos jansen

koos jansen

27/02/2012 11:17:49
Quote Anchor link
Volgens mij heb ik helemaal een verkeerde voorstelling van hoe die data er uiteindelijk uit ziet.
die 4 -ids die ik heb zijn dus niet elk 1 tabel, maar zijn elk een veld?
en is dan elke keer dat ik zo'n nieuw rijtje begin de naam van dat rijtje een tabel?

bv
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
Boeken
-lid-id
-a-id
-z-id
-r-id
n
j
f

is Boeken dan een tabel?
 
Jacco Engel

Jacco Engel

27/02/2012 11:20:01
Quote Anchor link
Overigens, (ff compleet offtopic) koos, check je PM ff :)
 
Wouter J

Wouter J

27/02/2012 11:22:11
Quote Anchor link
@Koos, ja boeken is een tabel. De tabel zou er in jou geval ong. zo uit zien: (als ik het goed begrepen heb)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
+----+-----+
| id | Lid |
+----+-----+
| 1  | a   |
| 2  | z   |
| 3  | r   |
| 4  | n   |
| 5  | j   |
| 6  | f   |
+----+-----+
 
Frank WD

Frank WD

27/02/2012 11:30:09
Quote Anchor link
Wouter,

Is het dan niet eerder zo?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
+----------+
|  boeken  |
+----+-----+
| id | Lid |
+----+-----+
| 1  | a   |
| 2  | z   |
| 3  | r   |
| 4  | n   |
| 5  | j   |
| 6  | f   |
+----+-----+


En ik heb een vermoeden dat Koos iets anders bedoelt met n,j en f.
Maar dat is voor mij even gokken hoor en mocht met die 3 waarden iets anders bedoelt worden dan zal het ongeveer zo moeten zijn.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
+----------------+
|     boeken     |
+----+-----+-----+
| id | Lid | ??  |
+----+-----+-----+
| 1  | a   | n   |
| 2  | z   | j   |
| 3  | r   | f   |
+----+-----+-----+


Alleen klinkt mij dit ook niet echt logich als ik eerlijk ben.
Want waarom zou je 2x een id gebruiken als dit niet nodig is? Of dit moet een eerste tabel zijn van een groter geheel.
Gewijzigd op 27/02/2012 11:36:10 door Frank WD
 
Koos jansen

koos jansen

27/02/2012 11:45:16
Quote Anchor link
ah ok, in dat geval is het bij mij in ieder geval dus:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
+----+-----+
| id | Lid |
+----+-----+
| 1  | l1  |
| 2  | l2  |
| 3  | l3  |
+----+-----+


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
+----+-----+
| id | a   |
+----+-----+
| 1  | a1  |
| 2  | a2  |
| 3  | a3  |
+----+-----+


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
+----+-----+
| id | z   |
+----+-----+
| 1  | z1  |
| 2  | z2  |
| 3  | z3  |
+----+-----+


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
+----+-----+
| id | r   |
+----+-----+
| 1  | r1  |
| 2  | r2  |
| 3  | r3  |
+----+-----+



maar hoe Boeken er dan uit ziet?..
Gewijzigd op 27/02/2012 11:57:25 door koos jansen
 
Frank WD

Frank WD

27/02/2012 12:03:43
Quote Anchor link
Wat zijn die z en z1 of a en a1 voor waarden dan?
Zijn dit titels van boeken zijn dit auteurs enz....?

Want zoals je het nu op schrijft heb je dus 4 tabellen met elk 2 velden.
Ofwel elk blokje is : 1 tabel + 2 velden waaran 1 id veld en 1 r veld. waarvan de velden 3 rows hebben.

Misschien geeft deze iets meer duidelijkheid voor jou.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
+--------------------------+
|           boeken         |
+---+-------------+--------+
|id |    titel    | auteur |
+---+-------------+--------+
| 1 |Harry Potter |  Koos  |
+---+-------------+--------+
Gewijzigd op 27/02/2012 12:11:17 door Frank WD
 
Koos jansen

koos jansen

27/02/2012 12:08:38
Quote Anchor link
Met het risico op sidetracking is dit een poging de gegevens wat minder cryptisch te omschrijven. Het hele onderwerp "Boeken" is ter plekke uit m'n duim gezogen maar stelt ongeveer mijn informatiestructuur voor:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
Boeken
-lid-id
-bibliotheek-id
-zaal-id
-boek-id
naam
auteur
genre
 
Erwin H

Erwin H

27/02/2012 12:12:02
Quote Anchor link
Maar wat wil je nu echt. Want op basis van je vraag in de eerste post is het antwoord al gegeven in de tweede post (met als opmerking dat je SELECT * niet zou moeten gebruiken). Maar ergens heb ik het idee dat dat helemaal niet is waar je naar op zoek bent, dus misschien handig om wat duidelijker te zijn.
 
Koos jansen

koos jansen

27/02/2012 12:21:04
Quote Anchor link
dus is het
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
SELECT * FROM tabelnaam(LEDEN) WHERE rijnaam = id-nummer
AND
SELECT * FROM tabelnaam(BIBLIOTHEKEN) WHERE rijnaam = id-nummer
AND
SELECT * FROM tabelnaam(ZALEN) WHERE rijnaam = id-nummer
AND
SELECT * FROM tabelnaam(BOEKEN) WHERE rijnaam = id-nummer


(ik was er al bang voor maar dat boeken was een verkeerd voorbeeld want de boekeigenschappen zijn niet afhankelijk van lid, bibliotheek, of zaal. In mijn situatie zijn die gegevens wel allemaal afhankelijk van die verschillende ids, dus for the sake of argument..;)
 
Erwin H

Erwin H

27/02/2012 12:23:24
Quote Anchor link
1 - geen tabelnaam(LEDEN), maar gewoon SELECT id FROM leden WHERE...
2 - geen * gebruiken, maar kolommen benoemen
3 - Wat wil je met die AND tussen de SELECTS. Dat kan niet, maar ik kan niet direct een antwoord geven hoe dan wel, omdat ik niet weet wat je nu precies wilt hebben....
 
Frank WD

Frank WD

27/02/2012 12:24:14
Quote Anchor link
Oke als ik heb dan goed begrijp heb jij?
Tabel 1 lid
Tabel 2 bibliotheek
Tabel 3 zaal
Tabel 4 boek

En dit wil je dan samen koppelen. Want dat begrijpt ik uit de verschillende id's bij de eerste 4. Als je het bedoelt zoals ik heb snap dan zal het zijn.
tabel boek
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
+-------------------------------------------------+
|                        boek                     |
+---+-----+-----+-----+-----+-------+-------+-----+
|id |l_id |b_id |z_id |     naam    |auteur |genre|
+---+-----+-----+-----+-------------+-------+-----+
| 1 |  1  |  1  |  1  |Harry Potter |  Koos | En  |
+---+-------------+---+-------------+-------+-----+


tabel lid
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
+-----------+
|    lid    |
+-----+-----+
|l_id |naam |
+-----+-----+
|  1  |Koos |
+-----+-----+


tabel bibliotheek
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
+------------------------------+
|         bibliotheek          |
+-----+---------------+--------+
|b_id |      naam     | plaats |
+-----+---------------+--------+
|  1  |Koos lees huis |Utrecht |
+-----+---------------+--------+


Enz............
 
Milo S

Milo S

27/02/2012 12:29:38
Quote Anchor link
Ik denk dat jij het volgende wilt:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
+----------------------------------+
|              boeken              |
+-----+---------+------------------+
|  id |  lidID  | boek             |
+-----+---------+------------------+
|  1  |    1    |  Kappen          |
+-----+---------+------------------+
|  2  |    1    |  Harry Potter    |
+-----+---------+------------------+
|  3  |    3    |  Harry Potter 2  |
+-----+---------+------------------+

+----------------------------------------+
|              bibliotheken              |
+-----+----------------------------------+
|  id |  bibliotheek  | locatie          |
+-----+----------------------------------+
|  1  |    bieb 1     |  Utrecht         |
+-----+----------------------------------+
|  2  |    bieb 2     |  Amsterdam       |
+-----+----------------------------------+
|  3  |    bieb 3     |  Maarssen        |
+-----+----------------------------------+
                                
+-------------+
|    leden    |
+-----+-------+
| id  | name  |
+-----+-------+
|  1  |  jan  |
+-----+-------+
|  2  |  kees |
+-----+-------+
|  3  |  gert |
+-----+-------+


Nu heb je al je boeken, al je leden en kun je bijhouden wie welk boek heeft...
Volgende keer als je wat vraagt graag een iets completeren beschrijving, zo is het gewoon gokken.

Uitleg:
Als je dit dan zo ziet is het vrij simpel te begrijpen. Een boek is in bezit van een lid of een bibliotheek, want het kan niet op 2 plekken tegelijk zijn.

Wil je nu alle leden ophalen selecteer je heel simpel door middel van een select statement al je leden.

Voorbeeld
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
SELECT
    id,
    name
FROM
    leden


Nu zou je ook nog heel erg graag alle boeken die dat lid in bezit heeft willen hebben. Hiervoor ga je join gebruiken. Geen tweede query, dat is namelijk niet nodig.

Voorbeeld:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
SELECT
    l.id,
    l.name,

    b.boek
FROM
    leden   AS l
JOIN
    boeken  AS b
ON
    l.id = b.lidID


Wil je alle boeken die niet uitgeleend zijn aan een lid hebben? Dan kijk je gewoon waar er geen lidID is ingevuld in je tabel.

Voorbeeld
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
SELECT
    id,
    boek
FROM
    boeken
WHERE
    lidID = 0


Ga zo maar verder....
Gewijzigd op 27/02/2012 13:05:37 door Milo S
 
Koos jansen

koos jansen

27/02/2012 12:33:03
Quote Anchor link
@Frank.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
+-------------------------------------------------+
|                        boek                     |
+---+-----+-----+-----+-----+-------+-------+-----+
|id |l_id |b_id |z_id |     naam    |auteur |genre|
+---+-----+-----+-----+-------------+-------+-----+
| 1 |  6  |  3  |  2  |Harry Potter |  Koos | En  |
+---+-------------+---+-------------+-------+-----+

Juist.

en dan is de vraag hoe je zo'n waarde opvraagt of wegschrijft.
Als ik in jouw tabel "Boek" bv de naam wil veranderen, wat word dan mijn query?


(overigens ie ik net dat ik toch een handleiding over het hoofd heb gezien, waarschijnlijk't beste als ik die eerst lees ;)
http://www.phphulp.nl/php/tutorial/data-verwerking/multiple-querys-die-je-nodig-hebt-na-normaliseren/483/ )
Gewijzigd op 27/02/2012 12:34:46 door koos jansen
 
Erwin H

Erwin H

27/02/2012 12:40:07
Quote Anchor link
Maar ga dan wel direct door naar de joins tutorial die op de laatste pagina gelinked staat: http://www.phphulp.nl/php/tutorial/overig/sql-joins-uitgebreid/479/

Expliciete joins zijn (wat mij betreft in elk geval) vele malen beter dan die impliciete joins die in de tutorial worden gebruikt die jij nu linked hier.
 
Frank WD

Frank WD

27/02/2012 12:55:49
Quote Anchor link
Koos,

Mooi dat het is wat je bedoelt.
Dan heeft mijn glazen bol me niet in de steek gelaten ;)

Zoals Erwin aan gaf even joins door nemen. Hier kan ik je niet zo snel een voorbeeld van geven ivm ik daar nog niet bedreven in ben en zelf veel moet toveren er in.

Alleen beetje van db normaliseren lukt me redelijk.
 
Wouter J

Wouter J

27/02/2012 13:10:21
Quote Anchor link
@Koos, in dat geval moet je nog wat beter normaliseren. Om 2 dingen, in dit geval boeken en leden, aan elkaar te koppelen gebruik je een koppeltabel, zoals je bij milo ziet. En dit doe je ook voor bibliotheken.
 
Milo S

Milo S

27/02/2012 14:45:45
Quote Anchor link
@ Wouter,
In deze situatie heb je geen koppel-tabel nodig. Een lid kan namelijk wel meerdere boeken hebben, maar datzelfde boek niet bij meerdere leden.

Zelfs als je meer van hetzelfde boek zou hebben in 1 bibliotheek is dit zo, ieder boek heeft namelijk altijd zijn eigen nummer.
 
Koos jansen

koos jansen

03/03/2012 21:07:40
Quote Anchor link
Ik ben enkele dagen ziek geweest dus heb het even moeten laten liggen maak pak het nu weer op ..

Ik zit dan nog even met het volgende probleem.


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
--------
|a       |
 --------
|id|a1|a2|
 --------
|1 |45|32|
|2 |56|54|
|3 |76|65|
 --------
 
 --------
|b       |
 --------
|id|b1|b2|
 --------
|1 |45|32|
|2 |56|54|
|3 |76|65|
 --------
 
 
 --------
|c       |
 --------
|id|c1|c2|
 --------
|1 |45|32|
|2 |56|54|
|3 |76|65|
 --------
 

 -----------------
| hoofdindex      |
 -----------------
|id|a_id|b_id|c_id|
|1 |2   |1   |3   |
|2 |1   |2   |4   |
|3 |4   |1   |3   |
 -----------------



Het opvragen lukt me volgens mij zo wel:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT
 hoofdindex.id
 a.a1
 b.b1
 c.c1
FROM
 hoofdindex
 a
 b
 c

WHERE
a_id = 1
and
b_id.= 1
and
c_id = 1



Alleen het toevoegen lukt me nog niet helemaal

de eerste tabellen lijkt wel te lukken
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$query1 = "INSERT INTO a VALUES (
'',
'$a1',
'$a2'
)";
mysql_query($query1);

$query2 = "INSERT INTO b VALUES (
'',
'$b1',
'$b2'
)";
mysql_query($query2);

$query3 = "INSERT INTO c VALUES (
'',
'$c1',
'$c2'
)";
mysql_query($query3);


Maar hoe weet ik welke $*_ids ik in mijn hoofdindex moet zetten bij het toevoegen van gegevens.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
$query4 = "INSERT INTO hoofdindex VALUES (
'',
'$a_id',
'$b_id',
'$c_id'
)";
mysql_query($query3);
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.