Vra

Ek het'n idee hoe om hierdie probleem op te los, maar ek wou om te weet as daar iets is makliker en meer extensible om my probleem.

Die program ek werk op die twee basiese vorms van data:beelde, en die inligting wat verband hou met die beelde.Die inligting wat verband hou met die beelde is voorheen gestoor in'n JET-databasis van die uiterste eenvoud (vier tafels) wat blyk te wees, beide stadig en onvolledig in die gestoor velde.Ons beweeg na'n nuwe implementering van die stoor van data.Gegewe die eenvoud van die data strukture wat betrokke is, ek dink dat'n databasis is overkill.

Elke beeld sal die inligting van dit se eie (vang parameters), sal deel wees van'n groep van beelde wat is interafhanklik (geneem in die dieselfde dertig minute tydperk, sê), en dan deel van'n groter groep geheel en al (geneem van die dieselfde persoon).Nou, ek is die stoor van mense in'n woordeboek met'n unieke identifiseerder.Elke persoon het dan'n Lys van die verskillende groepe van foto's, en elke prentjie groep het'n Lys van foto's.Al hierdie klasse is serializable, en ek is net serializing en deserializing die woordeboek.Redelik eenvoudige dinge.Beelde is apart gestoor, so dat die woordeboek nie astronomiese in grootte.

Die probleem is:wat gebeur wanneer ek nodig het om by te voeg nuwe inligting velde?Is daar'n maklike manier om te installeer hierdie data strukture te rekening vir moontlike toekomstige weergawes?In die verlede, die manier wat ek wil hanteer dit in die C is om te skep'n serializable struct met baie van die leë grepe (ten minste'n k) vir die toekoms rekbaarheid, met een van die grepe in die struct wat die weergawe.Dan, wanneer die program lees die struct, dit sou weet wat deserialization te gebruik wat gebaseer is op'n massiewe skakelaar verklaring (en ou weergawes kon lees nuwe data, want vreemde data sou net gaan in die velde wat geïgnoreer).

Nie so'n skema bestaan in C#?Soos, as ek het'n klas is'n groep van String en Int voorwerpe, en dan het ek nog'n String voorwerp aan die struct, hoe kan ek deserialize'n voorwerp van die skyf, en dan voeg die string tot dit?Het ek nodig het om te bedank myself om met verskeie weergawes van die data klasse, en'n fabriek wat'n deserialization stroom en hanteer deserialization gebaseer op'n paar weergawe inligting wat gestoor word in'n basis klas?Of is'n klas soos Woordeboek ideaal vir die berging van hierdie soort van inligting, as dit sal deserialize al die velde op die skyf outomaties, en as daar is'n nuwe velde bygevoeg in, ek kan net vang uitsonderings en plaasvervanger in die leë Snare en Ints vir diegene waardes?

As ek gaan met die woordeboek benadering, is daar'n spoed getref wat verband hou met die lêer lees/skryf, sowel as parameter herwinning keer?Ek vind dat as daar net velde in'n klas, dan veld herwinning is onmiddellik, maar in'n woordeboek, daar is'n paar klein oorhoofse wat verband hou met die klas.

Dankie!

Was dit nuttig?

Oplossing

My brein is gebraai op die oomblik, so ek is nie seker dat ek kan raad gee vir of teen'n databasis, maar as jy op soek is na weergawe-agnostikus serialisasie, wil jy'n dwaas om nie ten minste kyk na Protokol Buffers.

Hier is'n vinnige lys van die implementering ek weet vir C#/.NETTO:

Ander wenke

Sqlite is wat jy wil hê.Dit is'n vinnige, embeddable, enkel-lêer databasis wat bindings aan die meeste tale.

Met betrekking tot die rekbaarheid, kan jy dit stoor jou modelle met die standaard eienskappe, en dan het'n aparte tafel vir die kenmerk uitbreidings vir toekomstige veranderinge.

'n jaar of twee in die pad af, indien die kode is nog steeds in gebruik is, sal jy gelukkig wees dat 1)Ander ontwikkelaars sal nie het om te leer om'n persoonlike kode struktuur in stand te hou die kode, 2) Jy kan uitvoer, sien, verander die data is met die standaard databasis tools (daar is'n ODBC bestuurder vir sqlite lêers en verskeie navraag gereedskap), en 3) jy sal in staat wees om te skaal na'n databasis met'n minimale kode veranderinge.

Net'n wee woord van waarskuwing, SQLLite, Protokol Buffers, mmap et al...al baie goed, maar jy moet prototipe en toets elke implementering en maak seker dat u nie van plan om druk op die dieselfde perf kwessies of ander knelpunte.

Eenvoud kan word net om te upsize tot SQL (Express) (jy sal dalk verbaas wees by die perf kry) en regmaak wat ontbreek van die huidige databasis ontwerp.Dan as perf is nog steeds'n probleem begin ondersoek na hierdie ander tegnologie.

Daar is'n databasis skedule, vir wat ek kan nie onthou die naam, wat kan hanteer hierdie soort van situasie.Jy het basies twee tafels.Een tafel winkels die veranderlike naam, en die ander winkels die veranderlike waarde.As jy wil om te groep die veranderlikes, dan voeg'n derde tafel wat sal'n een tot baie verhouding met die veranderlike naam tafel.Hierdie opset het die voordeel van die verhuring jy hou die toevoeging van verskillende veranderlikes sonder om te hou die verandering van jou databasis skedule.Gered my spek nogal'n paar keer wanneer die hantering van departemente wat hul gedagtes verander gereeld (soos Bemarking).

Die enigste nadeel is dat die veranderlike waarde tafel sal nodig het om te slaan die werklike waarde as'n string kolom (varchar of nvarchar eintlik).Dan is jy het om te gaan met die probleme van die omskakeling van die waardes terug na hul geboorteland voorstellings.Ek het tans handhaaf iets soos hierdie.Die veranderlike tabel tans sowat 800 miljoen rye.Dit is nog redelik vinnig, as ek nog kan haal sekere variasies van waardes in onder een sekonde.

Ek is nie C# programmeerder, maar ek hou van die mmap() noem en sien daar is'n projek doen om so'n ding vir C#.

Sien Mmap

Gestruktureerde lêers is baie uitvoering as maat vir'n spesifieke toepassing, maar is moeilik om te bestuur en'n skaars herbruikbare-kode hulpbron.'n beter oplossing is'n virtuele geheue-soos implementering.

  • Tot 4 gb van inligting bestuur kan word.
  • Ruimte kan geoptimaliseer word om die werklike data grootte.
  • Al die data kan gesien word as'n skikking en verkry met lees/skryf bedrywighede.
  • Geen nodig om die struktuur op te slaan maar net gebruik en stoor.
  • Kan cached.Is hoogs herbruikbare.

So gaan met sqllite vir die volgende redes:
1.Jy hoef nie om te lees/skryf die hele databasis van die skyf elke keer
2.Veel makliker om by te voeg om selfs as jy nie laat genoeg plekhouers aan die begin
3.Makliker om te soek gebaseer op enigiets wat jy wil
4.makliker om te verander data in maniere buite die aansoek is ontwerp

Probleme met die Woordeboek benadering
1.Tensy jy het'n slim woordeboek wat jy nodig het om te lees/skryf die hele databasis elke keer (tensy jy noukeurig ontwerp van die data struktuur sal dit baie moeilik wees om in stand te hou compatibiliteit)
----- a) as jy het nie genoeg plek houers bye bye
2.Dit lyk asof jy wil hê om te lineêre soek deur al die foto's om te soek op een van die Eienskappe Vang
3.Kan'n foto wees in meer as een groep?Kan'n foto onder meer as een persoon?Kan twee mense in dieselfde groep?Met woordeboeke hierdie dinge kan kry harig....

Met'n databasis tabel, as jy kry'n nuwe kenmerk kan jy net sê Alter Table Prentjie Voeg Kenmerk DataType.Dan so lank as wat jy maak nie'n reël wat sê die kenmerk het'n waarde, jy kan nog steeds laai en stoor ouer weergawes.Op dieselfde tyd die nuwer weergawes kan gebruik om die nuwe eienskappe.

Ook jy nie nodig het om te red die prentjie in die databasis.Jy kan net die stoor van die pad na die foto in die databasis.Dan wanneer die jeug moet die prentjie, net laai dit van'n skyf lêer.Dit hou die databasis grootte kleiner.Ook die ekstra tyd soek om te kry om die skyf lêer sal waarskynlik onbelangrik in vergelyking met die tyd om te laai die beeld.

Waarskynlik jou tafel moet wees
Foto(PictureID, GroupID?, Lêer Pad, Vang Parameter 1, Vang Parameter 2, ens.)

As jy wil meer buigsaamheid jy kan'n tafel te maak CaptureParameter(PictureID, ParameterName, ParameterValue) ...Ek sou raai teen hierdie, want dit is'n baie minder doeltreffend as net om hulle in een tabel (om nie te praat van die navrae te haal/soek die Vang Parameters sou wees meer ingewikkeld).

Persoon(PersonID, Enige Persoon Eienskappe soos die Naam/Ens.)
Groep(GroupID, Groep Naam, PersonID?)
PersonGroup?(PersonID, GroupID)
PictureGroup?(GroupID, PictureID)

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top