Tags array list in database
Nu wou ik een arraylist (tags per product bijvoorbeeld: (telefoon, smartphone, mobiel)) kolom in de database toevoegen en hierin deze kenmerken toevoegen.
Is dit daarnaast de meest logische manier om dit te doen?
Nu moeten de 'tags' met een , gescheiden worden en zo ook opgehaald kunnen worden door de zoekfunctie,
hoe is dit mogelijk?
a)
Je maak van de tabel een MyIsam tabel, zet een FULL TEXT index op de kolom tags en laat de komma's weg.
Dan kan je met MATCH ... AGAINST op de waardes zoeken.
b) Je laat ook weer de komma's weg maar dan ga je met LIKE aan de slag
c)
Je maakt een afzonderlijke tabel voor de tags van per product.
Het voordeel van een match against is dat kunt sorteren op de waarde.
PS.
Full text searches kunnen vanaf mysql 5.7 ook op InnoDB tabellen
Maar kan je dit dan ook per product aangeven?
Ik ben nog niet echt super handig met databases.
Als ik voor optie C ga, waarom moet ik dan een aparte tabel maken? en niet direct in de tabel producten als kolom tags?
Het is daarnaast wel belangrijk dat een leek deze termen moet kunnen invullen via een CMS systeem als dat mogelijk is.
Patrick cos op 11/06/2013 22:13:06:
Als ik voor optie C ga, waarom moet ik dan een aparte tabel maken? en niet direct in de tabel producten als kolom tags?
Het opslaan van meerdere waardes in één kolom is gewoon bullshit.
inhoud van de tabel:
1 | 1 | telefoon
2 | 1 | smartphone
3 | 1 | mobiel
de bovenstaande drie wijzen allemaal naar dezelfde product_id dat bijvoorbeeld een Samsung Galaxy is.
Toevoeging op 11/06/2013 23:45:56:
Lol ger, had te vroeg op de button geklikt zeker?
En stel als ik dan 3 telefoons zou hebben? komen er dan 9 rijen in de database of zie ik dit verkeerd?
Daarnaast begrijp ik nog niet hoe ik die tags aan een product kan toekennen in php code, waarbij meerdere tags toegekend kunnen worden.
Ik neem aan dat je middels een formulier een apparaat toevoegd in je DB? Dan maak je gewoon checkboxes met de id's van de catagorie die je dan aan of uit vinkt.
Gewijzigd op 12/06/2013 12:29:55 door Chris PHP
Dat kan wel een goed idee zijn, maar stel je hebt totaal 100/200 tags dan is er toch geen overzicht meer?
Het is ook belangrijk dat een leek dit kan toevoegen.
Moet er dan niet 2 aparte tabellen gemaakt worden??? 1 waar de standaard de tags opgeslagen worden en 1 waar de producten eraan gelinkt zijn?
Bijvoorbeeld.
Computers
- tag
- tag
- tag
- tag
- tag
Telefoons
- tag
- tag
- tag
- tag
- tag
en ga zo maar door. Dus dan kies je de catagorie van het apparaat/item dat je wil opvoeren, en aan de hand van de catagorie list je gewoon de bijbehorende tags.
Alleen heb ik het nog niet 100% helder hoe ik de tabellen moet plaatsen.
Moet ik 1 tabel maken met de kolommen id, product_id, tag
en moet ik dan ook nog een 2de kolom maken met id, categorie, tags, waarin alleen de tags per categorie beschreven staan?
Gewijzigd op 12/06/2013 17:29:45 door Frank Nietbelangrijk
- id is dus een uniek id wat automatisch ophoogt.
- category_id is het id van je categorie, let goed op dat deze overeen komt met het id van je categorie in je categorie tabel!
- tag is natuurlijk vanzelf sprekend en is de tag.
Ik neem aan dat je al een tabel category hebt? Waar je dus al je categorieen in hebt staan, en een tabel met item, device of iets in die richting waar dus al je apparaten in komen?
Hier komt dan nog de tabel tag bij met de 3 velden die Frank genoemt heeft.
De twee kolommen tezamen vormen de PK, en daarnaast geef je iedere kolom afzonderlijk een INDEX.
Zoals Patrick de situatie nu schetst is mogelijkheid C uit mijn eerste reactie de enige goede oplossing
Ja ik heb een tabel met category.
Dus uiteindelijk graag ik 2 nieuwe tabellen??
Tabel 1 category_tags: id, category_id, tag
Tabel 2 product_tags: id, product_id, tag_id
En hoe kan je De 'twee' kolommen tezamen de PK?
Dus voor de tabel product_tags zou de DDL er zou uit zien:
Tabel 1 category_tags: id, category_id, tag (dezelfde DDL als van Ger)
Tabel 2 product_tags: id, product_id, tag_id
tabel 3 id, tag
Hoe zit het dan met de foreign keys?
iemand enig idee?
maar is dat wel het antwoord op je vraag want dat betwijfel ik
Alvast bedankt,
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE TABLE `tags_onderdelen` (
`tag_od_auto_id` mediumint(9) NOT NULL auto_increment,
`od_id` mediumint(9) NOT NULL default '0',
`tag_id` mediumint(9) NOT NULL default '0',
`cat_id` mediumint(9) NOT NULL default '0',
PRIMARY KEY (`tag_od_auto_id`),
KEY `od_id` (`od_id`),
CONSTRAINT `fk_cat_id` Foreign Key (`cat_id`)
REFERENCES `onderdelen_categorie` (`cat_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `tags` (
`tag_id` mediumint(9) NOT NULL auto_increment,
`tag_naam` varchar(100) NOT NULL default '',
PRIMARY KEY (`tag_id`),
CONSTRAINT `fk_tags_onderdelen` Foreign Key (`tag_id`)
REFERENCES `tags_onderdelen` (`tag_id`),
UNIQUE KEY `tag_naam` (`tag_naam`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
`tag_od_auto_id` mediumint(9) NOT NULL auto_increment,
`od_id` mediumint(9) NOT NULL default '0',
`tag_id` mediumint(9) NOT NULL default '0',
`cat_id` mediumint(9) NOT NULL default '0',
PRIMARY KEY (`tag_od_auto_id`),
KEY `od_id` (`od_id`),
CONSTRAINT `fk_cat_id` Foreign Key (`cat_id`)
REFERENCES `onderdelen_categorie` (`cat_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `tags` (
`tag_id` mediumint(9) NOT NULL auto_increment,
`tag_naam` varchar(100) NOT NULL default '',
PRIMARY KEY (`tag_id`),
CONSTRAINT `fk_tags_onderdelen` Foreign Key (`tag_id`)
REFERENCES `tags_onderdelen` (`tag_id`),
UNIQUE KEY `tag_naam` (`tag_naam`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Gewijzigd op 17/06/2013 13:41:02 door patrick cos
- je maakt een tabel met tags (jouw tweede create table)
- dan heb je al een tabel met artikelen/producten (ik weet niet wat jij verstaat onder onderdelen)
- je hebt ook al een tabel met categorieën. (wellicht heb je ook al een koppeltabel tussen producten en categorieën opdat je een product ook aan meerdere categorieën kunt koppelen. (many to many)
dan wil Ger dus zowel de producten als ook de categorieën met een many to many relatie aan de tabel 'tags' koppelen. Je krijgt daartoe twee koppeltabellen: één voor de producten en één voor de categorieën.
De vraag is echter of jij dit ook wil. Als je het iets eenvoudiger wil houden dan zou je alleen categorieën aan tags kunnen koppelen. In dat geval heb je aan twee tabellen genoeg maar ik zou dan de koppeltabel een naam geven als 'category_tag' of iets dergelijks