[MySQL/PHP] Gerelateerde Artikelen

Pagina: 1
Acties:
  • 34 views sinds 30-01-2008

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben bezig met de implementatie van een systeem om artikelen op een website met elkaar te relateren (relaties tussen artikelen onderling en tussen nieuws en artikelen).
Hierbij ga ik uit van de volgende aannamen:
- Een gelegde relatie geldt beide kanten op
- Alleen de relaties van nieuwste X artikelen/nieuwsberichten worden weergegeven

Ik was bezig met de volgende aanpak:
Tabel met relaties
artikelid (ID nummer artikel/nieuwsbericht)
artikeltype (artikel of nieuwsbericht)
relatieid (ID nummer van het gerelateerde artikel/nieuwsbericht)
relatietype (artikel of nieuwsbericht)
relatietijd (timestamp van gerelateerde artikel/nieuwsbericht)

Probleem hierbij is dat relaties niet heen en weer gelden, een relatie tussen twee artikelen moet twee keer in de database.

Ik vraag me af of er iemand een betere/slimmere implementatie van dit probleem weet, aangezien bovenstaande manier alles behalve optimaal is.

Acties:
  • 0 Henk 'm!

  • chris
  • Registratie: September 2001
  • Laatst online: 11-03-2022
kan je niet bij een artikel het artikel zelf uit de db trekken, en tegelijkertijd alle artikelen met datzelfde relatieID. Dus stel je wilt artikel met ID 1 dan krijg je:
code:
1
2
select from artikelen WHERE id='1'
select from artikelen WHERE relatieID='1'

Zo hoef je maar een keer de koppeling te leggen.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

Mischien is het handiger om een relatie table te maken. Hier zet je dan de relatie id's in en niet in de artikel table.

Waar je goed rekening mee moet houden is waneer er een relatie tussen artikel A en artikel B is, en een relatie tussen artikel B en artikel C, dat er niet perse ook een relatie tussen artikel A en C hoeft te zijn.

A - nieuwe versie Appache
B - security hole in ISS
C - securityhole in App X

Op dit moment hebben A en B een relatie (webservers) en B en C (security), maar A en C niet.

Door nu een tabel te maken met:

RelatieID ArtikelID

kun je vervolgens iets doen als:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT 
  r_a.artikel_ID, a.title 
FROM 
  relatie_artikel as a_t, 
  artikel as a 
WHERE 
  r_a.relatieID IN (
    SELECT 
    relatieID
    FROM 
    relatie_artikel 
    WHERE 
    artikelID=JOUWARTIKELID
  )

oid

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Duff
  • Registratie: Maart 2001
  • Laatst online: 17-09 22:49
Misschien een idee om php te laten zoeken naar overeenkomende woorden in de artikelen zelf, de id's van deze artikelen op te halen en vervolgens een link creeren naar die artikelen. Is vrij simpel misschien, en je moet dan wel een lijstje maken van woorden die je eruit zuivert (de, het, een, toen, wanneer, ook, enz.)

Bijvoorbeeld:
Het artikel waarvan je de gerelateerden wilt zoeken (artikel A) wordt vergeleken met de overige artikelen:
(ff makkelijk hoor ik weet zo snel de preciese terminologie niet :P )
Haal uit de database alle artikelen ongeveer gelijk aan (artikeltekst van A)
Creeer nu een linke naar deze artikelen

Ik denk dat je het ook zo kunt doen, maar het is wel vrij simpel en niet erg nauwkeurig...

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
De manier van Janos komt in de buurt van de manier waarop ik het oorspronkelijk zelf wilde doen.
Zoeken naar overeenkomstige woorden in titels is te database intensief en werkt nooit zo goed als door een mens gelegde relaties.

Dat een relatie tussen A en B en eentje tussen B en C niet impliceert dat A en C een relatie hebben is idd een goed punt.

De aanpak wordt iets moeilijker als je niet alleen relaties tussen artikelen, maar ook tussen nieuwsberichten onderling en nieuwsberichten en artikelen wil maken.

Heeft er iemand een slimme query om dat in 1 keer voor elkaar te krijgen? Artikelen en nieuws staan uiteraard ieder in een eigen tabel, de titel van een nieuwsbericht en artikel zijn nodig voor de link. Ik zie momenteel even geen mogelijkheid om die titels erbij te krijgen in 1 query.
code:
1
2
3
4
5
6
7
8
9
10
describe relations;
+--------------+-------------------+
| Field   | Type          |
+--------------+-------------------+
| articleid    | int(10) unsigned  |
| articletype  | enum('a','n')     |
| relationid   | int(10) unsigned  |
| relationtype | enum('a','n')     |
| relationtime | int(10) unsigned  |
+--------------+-------------------+

edit:

Misschien de titel ook in de relatie-tabel erbij opslaan? Niet echt netjes, ik weet het.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een query gevonden die doet wat ik wil. Hij geeft iets teveel data terug, maar ik kon zo 123 niet verzinnen hoe ik in 1 query toch alle data uit de database kan halen dit ik nodig heb. Zo werkt het iig.
code:
1
2
3
4
5
6
7
8
9
10
11
SELECT rl.relationtype, 
     a.articleid, 
     a.title AS articletitle, 
     n.newsid, 
     n.title AS newstitle
FROM relations rl 
     LEFT JOIN articles a ON rl.relationid=a.articleid 
     LEFT JOIN news n ON rl.relationid=n.newsid
WHERE rl.articletype='TYPE' AND
    rl.articleid=ID
ORDER BY rl.relationtime;

Hierin is TYPE n(ews) of a(rticle) naar gelang hetgeen de bezoeker op dat moment bekijkt en ID het id nummer van dat artikel/nieuwsbericht.
Uit de resultaten moet de juiste kolom worden geselecteerd door middel van de kolom relationtype.

Bedankt voor het meedenken, al heb ik het dan zelf bedacht ;)

Acties:
  • 0 Henk 'm!

Verwijderd

Interessante discussie, ik ben namelijk bezig om een soortgelijk iets te maken bij mijn nieuwssysteem, alleen zou ik graag automatisch laten zoeken naar gerelateerde artikelen.

Wat zou hiervoor de beste optie zijn? Ik gebruik een titel, inleiding en rest van het verhaal. Probleem zijn inderdaad simpele woorden als 'de, het, toen, wanneer, ...'.

Acties:
  • 0 Henk 'm!

  • rollebol
  • Registratie: Mei 2000
  • Laatst online: 22-08 14:55
Interessante kick qua anderhalf jaar, maar goed. Je zou op stop words kunnen filteren voor je de query doet.

Google, I'm feeling lucky -> http://snowball.tartarus.org/dutch/stop.txt

Sluit dit aan bij het tweede deel van je posting? (die niet zo veel met het topic te maken lijkt te hebben...)

Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

james_bond: je probleem is weinig gerelateerd aan het originele probleem, en dan zien we liever een nieuw topic dan een kick van anderhalf jaar. Open dus maar een nieuwe, deze op slot. En hobbel even langs de FAQ voor de quickstart over hoe je een mooi topic begint :D

Professionele website nodig?

Pagina: 1

Dit topic is gesloten.