PHP Array output
- Ariën - op 04/02/2019 20:38:30:
Het zijn categorieën, dus die horen in één tabel. Maar je kan voor subcategorieën dan aangeven welke categorieID de 'parent' id
indien ik naar dit kijk zie ik bv niet in hoe je dan verschillende talen gaat kunnen mengen in normalisatie.
Als ik een Parent id gebruik en dezelfde subcategorie is ergens anders ook van toepassing maar in een andere parent id dan moet ik dit veld dubbel aanmaken.
Catid=1 omschrijving=Audio
subcatomschrijving=kabels parentid=1
Catid=2 Omschrijving=Industrie
Subcatomschrijving=kabels Parentid=2
Op deze manier heb ik het woord kabels 2 keer ingevuld... Als ik dan kabels wil hernoemen...
In de volgende tabel ga ik de categorie ,subcategorie toewijzen aan een artikel.
Tabel Artikel_indexatie
ArtikelId
Categorie
Subcategorie0
Subcategorie1
Probeer zo veel mogelijk verticaal een oplossing te zoeken.
Bart Smulders op 04/02/2019 20:52:57:
Op deze manier heb ik het woord kabels 2 keer ingevuld... Als ik dan kabels wil hernoemen...
Audiokabels zijn sowieso iets anders dan industriële kabels lijkt mij, dus die zouden sowieso in twee aparte records moeten staan. Die je vervolgens prima apart kunt renamen.
Zodra je tabellen of kolommen van een numeriek suffix voorziet is het tijd om na te denken hoe je e.e.a. indeelt.
Maak één generieke tabel met hierin een kolom parent_category_id die NULL mag zijn. Betreft het een hoofdcategorie is deze NULL, betreft het een subcategorie, vul dan in parent_category_id de hoger gelegen categorie in. Linkjes in een eerder bericht van mij leggen uit hoe je al deze categorieën met één query uitleest.
Code (php)
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<?php
$sql = "SELECT
(SELECT group_concat( DISTINCT CatId )
FROM Artikelen_Categorie
) AS CatId,
(SELECT group_concat( DISTINCT OmschrijvingNL )
FROM Artikelen_Categorie
) AS OmschrijvingNL,
(SELECT group_concat( DISTINCT SubcatId )
FROM Artikelen_Subcategorie
) AS SubcatId,
(SELECT group_concat( DISTINCT SomschrijvingNL )
FROM Artikelen_Subcategorie
) AS SomschrijvingNL,
(SELECT group_concat( DISTINCT SubbcatId )
FROM Artikelen_Subbcategorie
) AS SubbcatId,
(SELECT group_concat( DISTINCT SsomschrijvingNL )
FROM Artikelen_Subbcategorie
) AS SsomschrijvingNL";
$result = $con->query($sql);
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
$rowf[]=$row;
}
}
foreach($rowf as $rows ){
$Pre1=$rows["CatId"];
$Pre2=$rows["OmschrijvingNL"];
$Pre3=$rows["SubcatId"];
$Pre4=$rows["SomschrijvingNL"];
$Pre5=$rows["SubbcatId"];
$Pre6=$rows["SsomschrijvingNL"];
}
$Gd1 = explode(",", $Pre1);
$Gd2 = explode(",", $Pre2);
$Gd3 = explode(",", $Pre3);
$Gd4 = explode(",", $Pre4);
$Gd5 = explode(",", $Pre5);
$Gd6 = explode(",", $Pre6);
$hoofdcat[]=array_combine($Gd1,$Gd2);
$Subcat0[]=array_combine($Gd3,$Gd4);
$Subcat1[]=array_combine($Gd5,$Gd6);
?>
$sql = "SELECT
(SELECT group_concat( DISTINCT CatId )
FROM Artikelen_Categorie
) AS CatId,
(SELECT group_concat( DISTINCT OmschrijvingNL )
FROM Artikelen_Categorie
) AS OmschrijvingNL,
(SELECT group_concat( DISTINCT SubcatId )
FROM Artikelen_Subcategorie
) AS SubcatId,
(SELECT group_concat( DISTINCT SomschrijvingNL )
FROM Artikelen_Subcategorie
) AS SomschrijvingNL,
(SELECT group_concat( DISTINCT SubbcatId )
FROM Artikelen_Subbcategorie
) AS SubbcatId,
(SELECT group_concat( DISTINCT SsomschrijvingNL )
FROM Artikelen_Subbcategorie
) AS SsomschrijvingNL";
$result = $con->query($sql);
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
$rowf[]=$row;
}
}
foreach($rowf as $rows ){
$Pre1=$rows["CatId"];
$Pre2=$rows["OmschrijvingNL"];
$Pre3=$rows["SubcatId"];
$Pre4=$rows["SomschrijvingNL"];
$Pre5=$rows["SubbcatId"];
$Pre6=$rows["SsomschrijvingNL"];
}
$Gd1 = explode(",", $Pre1);
$Gd2 = explode(",", $Pre2);
$Gd3 = explode(",", $Pre3);
$Gd4 = explode(",", $Pre4);
$Gd5 = explode(",", $Pre5);
$Gd6 = explode(",", $Pre6);
$hoofdcat[]=array_combine($Gd1,$Gd2);
$Subcat0[]=array_combine($Gd3,$Gd4);
$Subcat1[]=array_combine($Gd5,$Gd6);
?>
Vervolgens lees ik dan de nieuwe array zo uit op de plaats waar ik ze nodig heb
Geef vervolgens een voorbeeld van hoe je deze data wilt representeren. Dit leidt mogelijk tot nieuwe inzichten hoe je dit anders/beter kunt organiseren in de database.
Wanneer je je in allerlei bochten moet wringen om de data uit je database te wringen op de wijze zoals je deze wilt gebruiken is dit in een indicatie dat deze niet goed is gestructureerd.
Dit dient om de categorie ,subcategorie,sub sub categorie weer te geven. Telkens in een option select box . Zodat je een artikel kan aanmaken op een eenvoudige manier.
Ik weet dat jij gebruikt maakt van CategorieId en parentId voor het aanmaken de categorie structuur.
Indien ik normalisatie wil toepassen kan ik deze strategie echter niet volgen aangezien ik dan null velden krijg voor sommige artikelen... helaas niet toegelaten na 1NF .
Vandaar is mijn structuur als volgt.
Tabel -> Artikelen_Categorie
CatId OmschrijvingNL
1 Audio
2 Automatisatie
6 Behuizingen
4 Connectoren
7 Diagnostiek
3 Domotica
8 Halfgeleiders
5 Kabels
10 Sensoren
9 Voedingen
Tabel -> Artikelen_Subcategorie
SubcatId SomschrijvingNL
1 Luidsprekers
2 Voorversterkers
3 Eindversterkers
4 Mengversterkers
5 Matrix
6 Geluidsbronnen
7 Signaalomvormers
8 Bedieningen
9 Aandrijvingen
10 Slagbomen
11 Verkeerscontrolepalen
12 Parking Systemen
13 Deuren
14 Motorsturing
15 Toegangscontrole
16 Microcontrollers
17 Netvoedingen
18 Lichtsensoren
Tabel -> Artikelen_Subbcategorie
SubbcatId SsomschrijvingNL
10 Codeklavieren
1 Draaihekken
9 Drukknoppen
3 Garagedeuren
6 Handzenders
11 Lichtsluis
5 Rolluiken
2 Schuifpoorten
8 Sleutelcontact
4 Vouwdeuren
7 Wandzenders
Elke tabel moet in een option select box komen .
Indien je een union of join doet vult hij de waarden die ontbreken bij andere op wat niet het gewenst resultaat geeft.
Als ik nu dus een artikel wil gaan indexeren
heb ik telkens het artikelId als FK
Tabel -> Artikel_Index
ArtikelId CategorieId
Tabel -> Artikel_SubIndex
ArtikelId -> SubcategorieId
Tabel -> Artikel_SubbIndex
ArtikelId -> SubbcategorieId
Zo vermijd ik null waarden
Hoe werk je dan met verschillende talen in jou opstelling?
Om hier aparte tabellen voor aan te maken lijkt mij echt niet nodig.
Het probleem met bovenstaande oplossing is (ook) dat deze niet flexibel is. Wat als er nu een subcategorie bijkomt (zeg nooit nooit :))? Dan moet er weer een tabel (of twee) bijgebouwd worden en dan moet je weer code en je database openbreken.
> Indien ik normalisatie wil toepassen kan ik deze strategie echter niet volgen aangezien ik dan null velden krijg voor sommige artikelen... helaas niet toegelaten na 1NF.
Waarom blijven mensen altijd vasthouden aan een voorschrift als dit voorschrift alleen maar voor ellende zorgt? :/
In de allersimpelste vorm heb je nog steeds maar één tabel nodig:
cat_id
cat_parent_id
(eventueel cat_level, maakt queries simpeler)
cat_order
cat_label
En als je het leuk vindt om de vertalingen in die tabel te stoppen:
cat_id
cat_parent_id
(eventueel cat_level, maakt queries simpeler)
cat_order
cat_label_nl
cat_label_en
cat_label_etc?
Hiermee kun je generieke code schrijven die zelfs bepaalt hoeveel dropdowns je nodig hebt zodat je nooit een enkele letter code (noch databasestructuur) zou hoeven te veranderen, zelfs niet als er nog een sub(sub(sub))-categorie bijkomt.
Gewijzigd op 06/02/2019 00:08:45 door Thomas van den Heuvel