ugrás a tartalomhoz

Adatszervezés, adatmodellezés

deejayy · 2014. Okt. 8. (Sze), 21.13
Sziasztok,

elakadtam, vagyis nem találtam optimális megoldást bizonyos adattárolási és lekérdezési modellre, ebben szeretnék ötleteket, tanácsokat, linkeket kérni tőletek.

Adott egy lista, aminek a változásait kell követnem és később ebből riportolnom.

Példának vegyük az oprendszer taszklistáját. Adott egy PC, ahol látni szeretném, hogy milyen szoftverek futnak, körülbelül a következőt látom:

PID; Program név; Fejléc
110; explorer.exe; "Program Manager"
1002; notepad.exe; "Névtelen - Notepad"
1005; chrome.exe; "Fórum téma beküldése · Weblabor - Iron"

Ezeket adott időközönként lekérem és eltárolom (timestamp és pc-szám is lesz a listához).

A végén egyszerű SQL lekérdezésekkel szeretném megtudni a következő dolgokat:

- adott időpontban milyen programok futottak egy pc-n
- hányszor futott a notepad (ugye PID alapján el tudom különíteni)
- mikor, hol, mennyi ideig, hány pc-n használják a notepad-ot
- PID alapján kimutatni, hogy a PC újra lett indítva (tfh. a PID-et az OS egy folyamatosan növekvő tartományból adja)
- hány dokumentumot (és ezek listáját) szerkesztettek notepadban

Megjegyzés: a konkrét feladat természetesen nem a taszklista rögzítése (ezért kérlek benneteket, ebbe az irányba ne sodródjon el fölöslegesen a szál), de teljesen analóg ezzel a példával.

Szinte biztos vagyok benne, hogy erre már van valamilyen módszertan, mert a követelmények jól megfogalmazhatók és úgy gondolom nem az én fejemből pattant ki először az ilyesfajta adattárolás és lekérdezés ötlete.

Adatmennyiség szempontjából több ezer "PC"-ről és "program"ról beszélünk, akár évekre visszamenőleg, a lekérdezéseknek gyorsnak és percrekésznek kell majd lenniük.
 
1

off

H.Z. · 2014. Okt. 8. (Sze), 21.24
Akkor rögtön két offtopic:
Tfh WTF? ;) (mit jelent?)
Process id win7 vagy 8 óta random érték, ha jól tudom. Amennyiben valaha dolgod lesz ilyesmivel, ne számíts növekvő értékre!
2

Tfh = Tegyük fel, hogy

deejayy · 2014. Okt. 8. (Sze), 21.27
Tfh = Tegyük fel, hogy
3

Ja... én egyre angol

H.Z. · 2014. Okt. 8. (Sze), 21.35
Ja... én egyre angol magyarázatot kerestem :)
Akkor a másik tárgytalan.
5

PID

Hidvégi Gábor · 2014. Okt. 9. (Cs), 08.49
A PID-re szerintem sem lehet sok mindent alapozni, még ha növekvő számú is lenne, ha elég ideig fut a gép, egy idő után újra fog indulni a számozás.
4

MongoDB

T.G · 2014. Okt. 9. (Cs), 08.30
Nálunk is van egy hasonló projekt a tervezőasztalon, ami miatt elkezdtem komolyabban ismerkedni a MongoDB-vel. Illetve egyéb NoSql megoldásokkal.
Következő a felépítés, hihetetlen mennyiségű input (csak insert, update nem is lesz), az eredmény oldalon legfeljebb szummák és átlagok különféle szűrésekkel.
Jelenleg csak próbálgatásoknál tartunk, de sebesség szempontjából kenterbe veri a MySql-t, az a funkcionalitás, amivel nem rendelkezik, az meg ennél a projektnél nem probléma. (tranzakció, join)
Szerintem érdemes megnézned!
7

Sajnos az összefüggések miatt

deejayy · 2014. Okt. 9. (Cs), 14.32
Sajnos az összefüggések miatt használnom kell relációkat (pl a pc-nek nem csak száma van, hanem egyéb paraméterei is, amit adatgyűjtésnél nem tárolok, a proccesszeknek is vannak ilyen dolgai), de nem kizárt, hogy a sebesség oltárán kell őket feláldozni és máshogy megoldani a logikát.
6

Lehetséges megközelítés

vbence · 2014. Okt. 9. (Cs), 10.54
Az utolsó "mérést" a memóriában tartod, amikor bejön a következő lista összeveted őket, és a különbség kielemzése után frissíted az állapotokat.
Az állapotváltozásokra eseménykezelők köthetők, ezek végezhetik a statok rissítését. Példa: ha érzékeled egy process leállását, elég akkor mented a session megtörténtét (és hosszát).

Tárolhatod az eseményeket (változásokat) egy jól indexelt táblában így később új kérdésekre is írhatsz queryket úgy, hogy az előfeldolgozást már elvégezted.
8

Jelenleg én is hasonló

deejayy · 2014. Okt. 9. (Cs), 14.53
Jelenleg én is hasonló módszert használok, de több problémám van vele:

1. nem elegáns: ahhoz, hogy a pillanatnyi állapotot le tudjam kérdezni, a statisztikai adatokat ÉS az aggregáltat is tárolnom kell, ami redundancia.
2. sem a pc-k sem a gyűjtő nem megbízható, azaz gyakori a hálózati kapcsolat megszakadása, eszközök el-nem-érhetősége, így lehet, hogy a memóriában 2 napos állapot van.

Illetve minél kevesebb munkát szeretnék bízni alkalmazáslogikára, eseménykezelőn pl. triggert értettél?
9

Feldolgozás

vbence · 2014. Okt. 9. (Cs), 15.33
nem elegáns: ahhoz, hogy a pillanatnyi állapotot le tudjam kérdezni, a statisztikai adatokat ÉS az aggregáltat is tárolnom kell, ami redundancia.


Ha van egy SESSION eseményed, aminek van egy kezdete és egy hossza (vagy vége) egy indexelt táblából nagyon könnyen ki tudod szedni azokat a sessionöket, amik az illető időpont előtt kezdődtek, de nem értek még véget. Ehhez nem kell többféle adat. - Megspékelheted geospacial indexszel, hogy ne legyen USING WHERE a vég-időpontok vizsgálatánál.

sem a pc-k sem a gyűjtő nem megbízható, azaz gyakori a hálózati kapcsolat megszakadása, eszközök el-nem-érhetősége, így lehet, hogy a memóriában 2 napos állapot van.


Ekkor kell egy policyt lefektetni feketén, fehéren, hogyan lesznek kezelve az adott helyzetek, és az aszerinti lekezelés után ugyanolyan rekordokat kapsz, mintha minden szbályosan menne.

Pl: egy paint session elkezdődött 15 perccel az utolsó mérés előtt, ezután 2 napra rá kapsz egy másik mérést. - Ekkor lehet az a policyd, hogy csak a biztosan metörtént 15 percből készül egy ession; vagy lehet az, hogy a paint használatok átlagos hosszával (monduk 20 perccel) könyvelsz egy sessiont.
(Persze lehet egy időtített taszk ami szabályok szerint megkeresi és lezárja az éppen nyitott, de halottnak számító állapotokat).

Illetve minél kevesebb munkát szeretnék bízni alkalmazáslogikára,


Ez pedig inkább programozási feladat, mint adatbáziskezelés. Legalább is a relációs adatbázisoknak nem erőssége ez a fejta feldolgozás.

eseménykezelőn pl. triggert értettél?


Eseményeket úgy értettem, hogy te találsz ki különböző eseményeket, mint gépújraindítás, megszakadt kapcsolat, elindított program, eltűnt elindított program - amikből építhetők másodlagos események pl. a programhasználat (ahogy egy egymást követő mousedown és mouseup váltja ki a click eseményt).
10

Bevallom abban reménykedtem,

deejayy · 2014. Okt. 10. (P), 12.20
Bevallom abban reménykedtem, hogy erre is van valami pattern, mint a hierarchikus adatkezelésre, csak még nem találtam meg :\
11

PID

janoszen · 2014. Okt. 10. (P), 12.38
A PID sehol nem garantalt, hogy egyre novekvo ertek. Ki kell olvasnod, hogy mennyi ideje fut a gep. Linuxon sysinfo(), Windowson pl. GetTickCount64.

Egyebkent fogalmam sincs, ki talalta ki ezt a feladatot, de evekre visszamenoleg egy olyan orbitalisan nagy adathalmazrol beszelunk, hogy teljesen eselytelen a gyors kereses. Nem tudom, ki talalta ki ezt a kivalo feladatot, de vagy iskolai pelda es semmi koze egy valos adattarolashoz, vagy valaki nagyon felreertett valamit.
12

Idézném a nyitóposzt egy

deejayy · 2014. Okt. 14. (K), 08.06
Idézném a nyitóposzt egy részét: "Megjegyzés: a konkrét feladat természetesen nem a taszklista rögzítése".

Sosem fogok taszklistát lekérni, nem érdekelnek a PID-ek, oprendszerek, semmi ilyesmi, ezeket csupán a példa kedvéért írtam.

A módszertan érdekel elsősorban.
13

Akarsz róla beszélni?

Vilmos · 2014. Okt. 14. (K), 08.52
A kérdésed gazdasági jellegűnek látszik, nem technikainak. Az elérési időre van egy limit, kívánatos értéke pillanatnyilag üzleti titok. Gondolom a példa szándékosan az ami, az adataid hasonlítanak a taszklistához. Az sem tudható, el vannak-e tárolva, vagy az is a feladat része?
15

Akarok! :)

deejayy · 2014. Okt. 14. (K), 10.15
A kérdésem pedig igenis technikai, konkrétan az optimális adatfeldolgozási, tárolási és lekérdezési módszereket kutatom.

Az aggregált adatokat lekérdezni millisecundumokban mérhető időbe telhet (annyira onlinenak kell lennie az egésznek, hogy egy ajax kéréssel jsonban jön a brózerbe az adat, amit live frissít majd).

Adatok még nincsenek, azokat kvázi megkapom (realtime, ha a taszkos példánál maradunk, akkor legyen WMI), nekem a többivel kell foglalkoznom.
16

Beszélgetés közben találod

Vilmos · 2014. Okt. 14. (K), 11.32
Beszélgetés közben találod ki, mi a feladat? (távolról így tűnik)
A gyors reakció idő és a nagy adatbázis kizárja egymást. Tényleg el akarják érni - ezredmásodperc alatt - az elmúlt x évből egy-egy esemény idősorait?
Érthető, ha egy nap, vagy óra eseményeit gyűjtöd a memóriába. Annak az elérése legyen gyors, mert most nem az. A végleges tárolás szerintem külön történet.
17

Igyekeztem az indító posztban

deejayy · 2014. Okt. 14. (K), 13.30
Igyekeztem az indító posztban leírni mindent, amit a feladatról elképzelek, ettől még meglátásom szerint nem tértem el, leírtam, hogy a gyors reakcióidőre és aktuális adatokra van szükségem.

És a felvetésed alapján lehet, hogy pontosítok, illetve szűkítek: gyorsan csak az aktuális adatokra van szükségem, egy évekre visszamenő idősorra nyilván a realitás talaján maradva kell a reakcióidő.
Egyébként az előbbi kitételt azért tartottam fontosnak leírni, mert nem célom az, hogy az aktuális állapotot események sorozatából kelljen alkalmazásszinten kiszámolni (ami ennél fogva lassú lenne), hanem egy szimpla lekérdezés szolgáltasson adatokat.
14

Modszertan?

janoszen · 2014. Okt. 14. (K), 10.00
Hogy adjunk jo tanacsot modszertanra, hogy ha nem mondod el mit kell megoldani? Az adat jellege es a lekerdezes milyensege nagyban befolyasolja azt, hogy hogyan kell tarolni az adatot. Pl hogy kell-e azonnal valasz vagy jo 10 perc mulva. Vagy hogy mi alapjan akarsz keresni.

A tasklista valoszinuleg nem a helyes analogia, mert szemmel lathatolag nem erted 100%-ban, hogy hogyan epul fel. Eppen ezert jobban jarnal, ha elmondanad hogy mit is akarsz tarolni.
18

Közben elkezdtem gyártani

deejayy · 2014. Okt. 14. (K), 13.38
Közben elkezdtem gyártani valami példát erre az egészre, hátha abból jobban átjön, hogy mire van szükségem, aztán észrevettem, hogy nagyjából 3 esemény köré épül ez az egész: start, change, stop, amik persze nem effektív események, hanem az adatokból következnek.

Hasonlóságot véltem felfedezni az add-modify-delete, azaz diff, tehát változáskövetés(kezelés) között, így akadtam két linkre, ami talán segíhet, ezeket még olvasgatom:

http://dataprotocols.org/revisioning-data/
http://www.jasny.net/articles/versioning-mysql-data/
19

Irritalo

janoszen · 2014. Okt. 14. (K), 13.56
Ugy erzed, hogy mennyire irritalo probalni neked segiteni? Egyertelmuen van egy feladatod, de pont annyira kodositesz hogy ne lehessen ertelmesen tanacsot adni. Ha nem akarod leirni publikusan, keress mar meg privatban es mondd el hogy mirol van szo, had irjak egy jobb hasonlatot.
20

+1

Pepita · 2014. Okt. 14. (K), 23.29
Az jó lenne... :)