Topic: Ryšys su savimi

Tarkime yra lentele straipsniai

straipsniai
id | user_id | title.....

Ir man reikia kažkaip DB saugoti tarpusavyje susijusius/panašius straipsnius. ryšius vartotojai galės rankiniu būdu nustatinėti arba jie bus automatiškai randami pagal tagus ar dar kaip.

Pagrindinis klausimas: kaip saugoti tą dalį, kurią įveda vartotojai?

jei daryčiau many2many

straipsniai_staipsniai
id | straipsnis_id | straipnsis2_id

tai laikantis visų normalizacijos taisyklių, "a" rišis su "b", be ne "b" su "a".
Dabar mastau, geriau ar daryti 1 užklausą per abu stulpelius, ar geriau daryti 2 užklausas atskirai per kiekvieną stulpelį, ar dubliuoti visus duomenis

id | straipsnis_id | straipnsis2_id | auto
1  |   42             | 120                | false
2  |     120         | 42                  | true

O gal yra dar koks variantas?

Re: Ryšys su savimi

šiaip nesu tokio dalyko daręs, tai neteko labai ir galvoti šia tema.

Jeigu visada bus tokia logika, kad vieno elemento sąsaja su kitu yra abipusė tada dubliuoti įrašus būtų nelogiška (-;

įrašų dubliavimas logiškas, kai ryšys yra neabipusis.

Aš dar padaryčiau taip, kad tokio lauko kaip id nenaudočiau visai, o stulpelius straipsnis_id ir straipsnis2_id apjungčiau į UNIQUE indeksą.

Taip pat rašydamas įrašus straipsnių ID lyginčiau tarpusavyje ir į pirmą stulpelį visada rašyčiau mažesnį ID, o į antrąjį didesnį. Tokiu būdu palenginčiau sau gyvenimą kai reikėtų išrinkinėti įrašą pagal abu ID (redagavimui ar pan.).

Re: Ryšys su savimi

Apie mažesnį įrašą pirma jau galvojau anksčiau :)
Unique savaime suprantama teks dėti :D

Mastau apie

 SELECT IF( str_str.str_id =$id, str2.title, str1.title ) AS title
FROM `str_str`
LEFT JOIN str AS str1 ON str_str.str_id = str1.id
LEFT JOIN str AS str2 ON str_str.str2_id = str2.id
WHERE str_str.str_id = $id
OR str_str.str2_id = $id

bet tada pačiam tektu nemažą dalį užklausų rašyti, kas man nepatinka :D nes kol kas cakePHP pats tvarkingai viską darydavo ;)
kažkaip linkstu prie įrašų dubliavimo varianto. Dar yra variantas pagal straipsnis_id ir straipsnis2_id daryti du atskirus HABTM ryšius, bet irgi kažkaip keistai atrodytu.