DB optimaliseren
Mijn DB design is heel simpel en beperkt mij (denk ik). Ik schrijf alles weg als tinytext in T_Clubs, dus ook categorie van de club, gemeente, provincie etc.
Ik heb er met mijn leerkracht wat mee zitten knutselen maar ik raakte er niet aan uit.
Wat ik dus graag zou willen doen is mijn DB optimaliseren zodat mijn zoekfunctie ook goed werkt.
Elke vechtsport is een categorie, maar nu schrijf ik het weg dmv een dropdown in HTML als tinytext. Mij werd er verteld dat het beter een aparte tabel zou zijn en een view zou moeten zijn ?
Kan iemand mij op weg helpen ?
Tabel ziet er zo uit:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
--
-- Tabelstructuur voor tabel `t_clubs`
--
CREATE TABLE IF NOT EXISTS `t_clubs` (
`D_id` int(11) NOT NULL AUTO_INCREMENT,
`D_naam` tinytext NOT NULL,
`D_categorie` tinytext NOT NULL,
`D_provincie` tinytext NOT NULL,
`D_gemeente` tinytext NOT NULL,
`D_contact` tinytext NOT NULL,
`D_foto` tinytext NOT NULL,
`D_extra` text NOT NULL,
`D_zichtbaar` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`D_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ROW_FORMAT=FIXED AUTO_INCREMENT=4 ;
-- Tabelstructuur voor tabel `t_clubs`
--
CREATE TABLE IF NOT EXISTS `t_clubs` (
`D_id` int(11) NOT NULL AUTO_INCREMENT,
`D_naam` tinytext NOT NULL,
`D_categorie` tinytext NOT NULL,
`D_provincie` tinytext NOT NULL,
`D_gemeente` tinytext NOT NULL,
`D_contact` tinytext NOT NULL,
`D_foto` tinytext NOT NULL,
`D_extra` text NOT NULL,
`D_zichtbaar` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`D_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ROW_FORMAT=FIXED AUTO_INCREMENT=4 ;
Toevoeging op 21/06/2011 10:29:32:
Een voorbeeld zou dan zijn:
D_id: 1
D_naam: EXIT
D_categorie: Brazilian Jiu-Jitsu
D_provincie: Antwerpen
D_gemeente: Antwerpen
D_contact: mail... tel. nr
D_foto: URL naar foto, anders default (geen foto)
D_extra: extra info over de club
D_zichtbaar: 1
Toevoeging op 21/06/2011 10:30:03:
Nu, sommige clubs kunnen bvb meerdere categories hebben, zowel MMA als BJJ etc. Ik zou niet weten hoe ik dit moet aanpakken met mijn search.
Lees wat info door en vertel wat je er uit begrijpt en wat niet. Dan helpen we je weer verder. (is leerzamer dan alleen even voorkauwen)
Een visuele voorstelling doet mij meer dan tekst. Ik snap dat ik een view moet creeëren, maar ik weet niet wat met wat (en HOE) gelinkt wordt?
Toevoeging op 21/06/2011 11:43:22:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
+-----------------------+
| T_Clubs |
|-----------------------| +---------------------------+
| D_id tinyint | | T_Categorie |
| D_naam tinytext | |---------------------------|
| D_categorie tinyint +------------> D_categorie tinyint |
| D_provincie tinytext | | D_categorienaam tinytext |
| D_gemeente tinytext | +---------------------------+
| D_contact tinytext |
| D_foto tinytext |
| D_extra text |
| D_zichtbaar tinyint |
+-----------------------+
| T_Clubs |
|-----------------------| +---------------------------+
| D_id tinyint | | T_Categorie |
| D_naam tinytext | |---------------------------|
| D_categorie tinyint +------------> D_categorie tinyint |
| D_provincie tinytext | | D_categorienaam tinytext |
| D_gemeente tinytext | +---------------------------+
| D_contact tinytext |
| D_foto tinytext |
| D_extra text |
| D_zichtbaar tinyint |
+-----------------------+
Toevoeging op 21/06/2011 11:43:44:
Ziet dit er iets of wat goed uit ?
Normaliseren gaat over items en relaties.
De items die jij hebt zijn (als ik het goed zie)
-clubs
-provincies
-gemeente
-categorien
Tussen de items zijn er relaties.
Er zijn 3 soorten relaties
1 op 1
1 op n
n op n
1 op 1 relaties zijn de makkelijkste.
Bijvoorbeeld een huwelijk Je vader is getrouwd met je moeder en je moeder met je vader.
Dit is een extra kolom in 1 item (niet in beide, want dan kan je incorrecte data krijgen)
1 op n relaties zijn iets uitgebreider
Bijvoorbeeld vader kind relaties. Je vader kan meerdere konderen hebben maar jij hebt maar 1 vader.
Dit is een extra kolom in het item dat er maar 1 heeft (hierbij dus het kind)
n op n relaties zijn het meest uitgebreid.
Dit is bijvoorbeeld de relatie tussen studenten en vakken. Een student volgt (meestal) meerdere vakken en meerdere studenten volgen een vak.
Hiervoor heb je een koppeltabel nodig. Daarbij worden de id's van de verschillende onderdelen aan elkaar gekoppeld.
Bijvoorbeeld
student_id | vak_id
Waar je ook nog op moet letten is dat je data niet dubbel opslaat.
Bij een club hoef je bijvoorbeeld geen provincie op te slaan, je slaat al de gemeente op en die hoort bij maar 1 provincie.
Je krijgt dan iets als: (datatypes mag je zelf doen)
clubs
-----
id
naam
categorie_id
gemeente_id
foto
extra
zichtbaar
categorien
--------
id
naam
gemeenten
--------
id
naam
provincie_id
provincies
---------
id
naam
Wat voor mij nog wel onduidelijk is wat je met contact wilt doen.
Als je daar een email adres en telefoonnummer wilt opslaan kun je daar 2 kolommen van maken.
Gemeentes laat ik manueel invullen omdat ik geen lijst heb, provincies zijn dan weer op voorhand gedefinieerd.
Met contact wil ik contact gegevens (naam, telefoon nr, mail etc.) opslaan en dan gewoon als 1 displayen, tenzij er een behoefte is om ze apart op te slaan wil ik het zo houden.
Toevoeging op 23/06/2011 00:48:46:
Ik ben al goed op weg, heb nu alleen een probleem met mijn view.
Mijn DB ziet er zo uit, alleen heb ik geen idee hoe ik mijn view moet aanmaken. Dit is wat ik heb geprobeerd en wat NIET lukt, ik snap de logica van een view aanmaken even niet.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE VIEW V_clubs AS
SELECT CLU.D_id as ID,
CLU.D_naam as Naam,
CLU.D_categorie as Categorie,
CLU.D_provincie as Provincie,
CLU.D_gemeente as Gemeente,
CLU.D_contact as Contact,
CLU.D_foto as Foto,
CLU.D_extra as Extra,
CLU.D_zichtbaar as Zichtbaar,
FROM T_clubs as CLU,
JOIN T_categorie as CAT,
ON (CLU.D_categorie = CAT.D_categorie)
JOIN T_provincies as PROV,
ON (CLU.D_provincie = PROV.D_provincie)
SELECT CLU.D_id as ID,
CLU.D_naam as Naam,
CLU.D_categorie as Categorie,
CLU.D_provincie as Provincie,
CLU.D_gemeente as Gemeente,
CLU.D_contact as Contact,
CLU.D_foto as Foto,
CLU.D_extra as Extra,
CLU.D_zichtbaar as Zichtbaar,
FROM T_clubs as CLU,
JOIN T_categorie as CAT,
ON (CLU.D_categorie = CAT.D_categorie)
JOIN T_provincies as PROV,
ON (CLU.D_provincie = PROV.D_provincie)
Gewijzigd op 23/06/2011 00:49:14 door Vlad Polianskii