Tags array list in database

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Patrick cos

patrick cos

10/06/2013 17:22:47
Quote Anchor link
Ik heb onlangs een zoekfunctie gemaakt, maar zodra mensen bijvoorbeeld telefoon in toetsen dan krijgen ze geen resultaten omdat in de titel alleen smartphone staat.

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?
 
PHP hulp

PHP hulp

14/05/2024 23:01:10
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

10/06/2013 19:34:21
Quote Anchor link
Drie opties:
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
 
Patrick cos

patrick cos

11/06/2013 22:13:06
Quote Anchor link
optie A. is dus het handigst? kan je een MyIsam gewoon aanmaken in een mysql database zonder problemen? wij hebben geloof ik versie 4.5.
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.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

11/06/2013 23:30:49
Quote Anchor link
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?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

11/06/2013 23:37:53
Quote Anchor link
Hoe dan Frank leg eens uit.
Het opslaan van meerdere waardes in één kolom is gewoon bullshit.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

11/06/2013 23:44:16
Quote Anchor link
omdat je in principe in een database geen meerdere waarden in één veld moet zetten. In een database werk je in plaats daarvan met kolommen en rijen. maar je gaat natuurlijk geen 1000 'tag' kolommen aan je tabel toevoegen dus zou je een aparte tabel tags kunnen toevoegen met kolommen zoals: id, product_id, tag.

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?
 
Patrick cos

patrick cos

12/06/2013 12:11:39
Quote Anchor link
Ja dat klinkt inderdaad wel handig.

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.
 
Chris PHP

Chris PHP

12/06/2013 12:26:44
Quote Anchor link
Ligt eraan, als je alle 3 je telefoons ook die 3 tags geeft wel idd.

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
 
Patrick cos

patrick cos

12/06/2013 13:07:32
Quote Anchor link
ja dat klopt.
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?
 
Chris PHP

Chris PHP

12/06/2013 13:34:19
Quote Anchor link
Ik neem aan dat je verschillende catagorieen hebt met verschillende tags toch?

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.
 
Patrick cos

patrick cos

12/06/2013 13:45:36
Quote Anchor link
Bedankt! Dat is inderdaad dan wel de beste manier.

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?
 
Frank Nietbelangrijk

Frank Nietbelangrijk

12/06/2013 17:28:59
Quote Anchor link
één tabel met id, category_id, tag kolommen dan lijkt mij
Gewijzigd op 12/06/2013 17:29:45 door Frank Nietbelangrijk
 
Chris PHP

Chris PHP

12/06/2013 17:47:52
Quote Anchor link
Voor wat meer toelichting op de post van Frank.

- 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.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

12/06/2013 18:00:31
Quote Anchor link
En dan krijg daarbij nog de tabel product_tags met de kolommen product_id en tag_id.
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
 
Patrick cos

patrick cos

12/06/2013 18:06:51
Quote Anchor link
Oké bedankt,

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?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

12/06/2013 18:28:10
Quote Anchor link
Nee drie! Ook nog voor de tags zelf, de andere twee zijn koppeltabellen en die bestaan uit twee kolommen.
Dus voor de tabel product_tags zou de DDL er zou uit zien:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
CREATE TABLE product_tags (
    product_id INT NOT NULL,
    tag_id INT NOT NULL,
    PRIMARY KEY (product_id, tag_id),
    KEY idx_pt_prd (product_id),
    KEY idx_pt_tag (tag_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
 
Patrick cos

patrick cos

13/06/2013 15:01:01
Quote Anchor link
3 tabellen?

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?
 
Patrick cos

patrick cos

17/06/2013 00:09:11
Quote Anchor link
iemand enig idee?
 
Frank Nietbelangrijk

Frank Nietbelangrijk

17/06/2013 00:17:04
Quote Anchor link
ummm, alle velden die verwijzen naar een primary-key van een andere tabel zou je als foreign-key moeten instellen.

maar is dat wel het antwoord op je vraag want dat betwijfel ik
 
Patrick cos

patrick cos

17/06/2013 11:56:59
Quote Anchor link
Ik kom niet verder dan 2 tabellen, heeft iemand enig idee of deze goed in elkaar zit?
Alvast bedankt,

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
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;
Gewijzigd op 17/06/2013 13:41:02 door patrick cos
 
Frank Nietbelangrijk

Frank Nietbelangrijk

17/06/2013 13:35:42
Quote Anchor link
Patrick, volgens mij is wat Ger bedoelt:

- 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
 

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.