ugrás a tartalomhoz

Egymáshoz kapcsolat entitások változásainak időbeli validitása

Török Gábor · 2011. Már. 1. (K), 15.25
Adott Helyszín és Esemény entitásom, köztük egy-sok kapcsolat. A Helyszínt a nevén túl jellemzi a földrajzi címe is. Ha kiváncsi vagyok, hogy adott tavaly decemberi esemény hol volt, akkor az Eseményhez kapcsolt Helyszín objektum cím attribútumát kell kiolvasnom.

Történt, hogy adott helyszín elköltözik, címet vált. Frissítem az entitás vonatkozó attribútumát. Hogyan őrízhetem meg az adatok épségét időben úgy, hogy a tavaly decemberi eseményhez kötött helyszín akkori állapotát lássam? Verziózzak vagy új helyszín entitást hozzak létre, és kapcsoljam őket össze?

Milyen módszertan, minta szolgál erre?
 
1

Verziókövetés

Poetro · 2011. Már. 1. (K), 16.53
Ezt szerintem verziókövetéssel lehet szépen megoldani. Például a Drupal a tartalmakhoz két azonosítót rendel. Egy publikusat, nid néven, és egy vid nevű verzió azonosítót. Ekkor tudod melyik entitásról van szó, valamint annak melyik verziójáról. Amikor pedig hivatkozás van egyik entitásról a másikra, akkor megadhatod, hogy egy konkrét változatra vonatkozzon-e, vagy annak a legfrissebb változatára. Már csak az a kérdés, hogyan lehet azt szépen és kulturáltan megoldani, hogy ha a kapcsolt elem frissül, akkor frissíteni kell-e az entitást, vagy pedig a régebbi elemre hivatkozzon.
5

Tehát ha jól értem, minden

Török Gábor · 2011. Már. 1. (K), 20.56
Tehát ha jól értem, minden esetben az entitás azonosító–verzió azonosító együttessel történik a hivatkozás. A vid ezek szerint a legelső alkalommal is kap értéket? A legfrissebb változatra hivatkozás a legutolsó nid–vid-re való hivatkozást jelenti?

A kapcsolt entitás módosítása esetén számomra pont az a kívánatos, ha a meglévő forrás entitások továbbra is a régi változatra mutatnak – így validak időben.
6

Létrejön

Poetro · 2011. Már. 1. (K), 21.51
Igen, az első létrehozáskor létrejön egy nid-vid páros az entitáshoz. Ezek után, minden alkalommal amikor új verziót követelő változás történik, akkor generálunk egy új egyedi vid értéket, és ezzel egy új verziót az entitásból (legalábbis Drupalban).
2

Ha az időbeni változásokat is

nanofish · 2011. Már. 1. (K), 16.59
Ha az időbeni változásokat is bele akarjuk venni a modellbe, akkor a helyszín és a földrajzi cím 1:N kapcsolatban áll egymással, ebben az esetben a helyszín + költözés dátuma egy lehetséges kulcs, ami meghatározza a földrajzi címet és ezt lehet az eseményhez kapcsolni. Ez az elmélet, gyakorlatilag szerintem az adott esetben teljesen rendben van, ha a földrajzi címet az esemény egyedbe is beleteszed és elnevezed mondjuk "event_address"-nek.
3

Épp egy nagyon hasonló

bb0072 · 2011. Már. 1. (K), 17.22
Épp egy nagyon hasonló problémán dolgozok éppen :))

Két megoldást tudnék ajánlani:

1) Egy helyszínhez maradjon egy rekord a Helyszín táblában, az esemény táblába pedig kerüljön bele az esemény időpontjában éppen aktuális cím.
Előny: tiszta, áttekinthető marad az adatstruktúra, ha pl. statisztikát kell csinálni, akkor igencsak látod előnyét.
Hátrány: időlegesen redundánsan tárolsz adatokat a db-ben.

2) Ha a címet (vagy egyéb adatot) a helyszín táblában módosítanak, akkor módosítás helyett egy új rekord szülessen, a régi meg legyen archiválva. A régi esemény az archív sorhoz kapcsolódik továbbra is.
Előny: nem kell módosítani a db szerkezetet
Hátrány: karbantarthatóság, vagy pl olyan típusú lekérdezés, hogy adott helyszínen hány esemény volt adott időszakban. És szintén redundáns adattárolás

Én az 1)-es variációt ajánlom.
4

Szerintem az adatbázist kéne

inf · 2011. Már. 1. (K), 17.41
Szerintem az adatbázist kéne átalakítani:

Ha jól értem most ilyen a db:
event:
event_id|event_info|location_id

location:
location_id|address


Ebből lehetne csinálni egy ilyet:
event:
event_id|event_info|event_location_id

event_location:
event_location_id|from|to|location_id

location:
location_id|address


Vagy ha ez túl bonyolult megoldani, akkor lehetne csinálni egy új táblát, ami a helyszíneket tárolja időrendben.
event:
event_id|event_info|location_id

location:
location_id|address

location_in_time:
event_id|location_id|migration_time

A helyszín módosításakor ide is menne egy insert, a régi dolgok meg ugyanúgy működnének módosítás nélkül.