[xml database] Duwtje in de rug ..

Pagina: 1
Acties:

  • r0bert
  • Registratie: September 2001
  • Laatst online: 11-08 16:19
Hey mensen! Ik ben bezig met de voorbereidingen van het bouwen van een applicatie, waarbij ik de data-uitwisseling graag in xml zou willen doen, zodat ik de interface 'eenvoudig' via xsl(t) kan uitvoeren.

Maar omdat de gegevens ook opgeslagen zullen moeten worden, ben ik maar eens op jacht gegaan naar een database die de xml-pagina's zo kan ontvangen en ook zo weer kan uitspugen (adhv een query).

Via de search kon ik wel wat resultaat vinden, maar ik raak volledig de weg kwijt en kan het me niet veroorloven dat ik in het begin de fout maak de verkeerde DB kies, zodat ik later uren onnodig werk heb zitten doen ;) Daarom ben ik benieuwd naar mensen die ervaringen hebben met dit soort databases.

Het liefst natuurlijk, niet té ingewikkeld en niet té duur (nog liever opensource). Alles wat ik tegen kwam moest je via Java installeren en weet ik wat allemaal. Ik ben dus geheel niet in dat databasewereldje verder thuis (gebruik altijd gewoon standaard php/mysql ;)). Alle reactie is welkom (zolang de modjes geen extra werk krijgen door nutteloze reply's :))

  • whoami
  • Registratie: December 2000
  • Laatst online: 21-08 22:54
XML - databases....
* whoami vind nog altijd dat data best in een RDBMS opgeslagen wordt, en dat XML best geschikt is voor data - exchange.

SQL Server 2000 kan wel -afaik- de resultset in XML formaat uitspugen. ( FOR XML clausule in het SELECT statement).

https://fgheysels.github.io/


  • MisterData
  • Registratie: September 2001
  • Laatst online: 19:41
Ik denk inderdaad dat je XML meer moet zien als een soort 'container' of 'envelop' voor je data. Een universeel formaat om in op te slaan, niet om in te zoeken (waar een RDBMS voor is). Denk goed na of een XML database wel is wat je zoekt...

  • r0bert
  • Registratie: September 2001
  • Laatst online: 11-08 16:19
Hmmz, misschien gaat het er inderdaad meer om dat de output van de DB, xml is.. omdat de data die gesubmit wordt toch in form van $_POST etc is en niet in xml-vorm..

Weet niet of het handiger is, maar kan ik dan beter een PHP bestand ertussen hangen, die de data uit de database haalt en het als XML bestand naar de interface-stylesheets doorstuurt ?

edit:
Ik gebruik nu MySQL gewoon.. Maar ik vind het zo vervelend dat je daar geen table in een table op kan slaan, dat je dus daadwerkelijk een structuur krijgt

vb:
dat je bijvoorbeeld deze database tables hebt zo gestructureerd.. en dat je vervolgens de gegevens opslaat in de tables 'vrienden', 'familie', 'intern', 'extern'.. Simpel voorbeeld, maar het gaat er dus om dat je subtables kunt gebruiken.. dat zou vaak handig zijn :'(
Tables
contacten-> prive-> vrienden
-> familie
-> zakelijk-> intern
-> extern


@Freak007: Ja, op die sites was ik inderdaad ook al terecht gekomen via zoeken :) Dat Apache project (Xindice) zag er inderdaad wel leuk uit.. gedownload/uitgepakt, maar toen kwam dat Java gedoe en heb ik het maar opgegeven :)

[ Voor 110% gewijzigd door r0bert op 07-07-2003 21:23 ]


  • Rense Klinkenberg
  • Registratie: November 2000
  • Laatst online: 09-08 19:19
Een XML database is ook niet bedoelt om data in op te slaan dat toevallig in een mooi xml jasje gestoken is.

In je een xml database kan je perfect xml documenten opslaan. Het voordeel is dan dat je direct in die documten kan zoeken, alsof alles een groot xml bestand is. Als je een beetje bekend bent met XQuery en XPath, kan je hier zeer leuke dingen mee doen.

Maar zoals ik al zei, is het alleen goed om hiervan gebruik te maken als je echt met xml aan de gang gaat, het heeft geen zin om er een visiterslog mee bij te houden, want daar zijn xml databases niet voor gemaakt.

Op http://www.rpbourret.com/xml/ProdsNative.htm staat een lijst met native-xml databases waar ik het hiervoor over had.

Zelf ben ik een lange tijd geleden hier ook eens mee bezig geweest en was erg te spreken over Xindice. Het is wel geschreven in Java, maar er zwerft op internet wel ergens een mooie windows installer rond, die het zelf ook nog als service installeert.

  • MisterData
  • Registratie: September 2001
  • Laatst online: 19:41
r0bert schreef op 07 July 2003 @ 21:09:
vb:
dat je bijvoorbeeld deze database tables hebt zo gestructureerd.. en dat je vervolgens de gegevens opslaat in de tables 'vrienden', 'familie', 'intern', 'extern'.. Simpel voorbeeld, maar het gaat er dus om dat je subtables kunt gebruiken.. dat zou vaak handig zijn :'(
Tables
contacten-> prive-> vrienden
-> familie
-> zakelijk-> intern
-> extern
[beetje-offtopic]

Dat zou je in een RDBMS kunnen oplossen met 1 tabel die groepen aangeeft, als volgt:

code:
1
2
3
4
5
6
7
8
9
tabel `groepen`:
- groepid
- parent_groepid
- text

tabel `data`:
- dataid
- groepid (fk)
- data


Ofzoiets..
[/beetje-offtopic]

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
Voor onze CMS hebben we a 'two-pronged' approach gebruikt. Heel de data-structuur staat beschreven als XML en eigenlijk wordt deze gemapped op 'objects'. Sommige van die objects (meestal dingen die vaak en veel voorkomen en allemaal hetzelfde van structuur zijn) worden door een 'JDO' approach opgeslagen in een RDBMS. let wel: we gebruiken gewoon XPath queries die worden vertaalt naar SQL. Dus er is geen regel SQL te vinden. Sommige data zit dan weer in een echt xml-database zodoende het eigenlijk niet altijd duidelijk is waar nou iets steekt. We waren zeer tevreden over het feit dat we geen SQL hoefde te gebruiken (60+ highly linked tables) - ook leuk was dat je dan eenvoudig kunt cascading delete kunt toepassen zelfs met mySQL (natturlijk meerdere queries maar toch lekker snel). de XPath routines heb ik zelf geschreven maar retrieval gebeurde met OJB , maar in feite hadden we dat net zelf kunnen doen. Alle 'data' kon een data-type worden gegeven (ie email:, met die en die subdomain, xhtml vakje met die en die styles, tabular data (om echt een grid data te hebben die dan weer een eigen table krijgt), tree (gaat naar xml) enzovoorts. Onze forms konden dus ook alle data ineens client side valideren aangezien de server 100% dezelfde code had.

Xindice is leuk om te proberen maar voor productie is ie NIET klaar. Wij hebben alle versie met 5 VM geprobeert maar de java-lullen zitten niets dan WeakHashMaps te gebruiken (heel leuk helaas werken die gewoon niet). Een 2MB xml file werd na 10 XPath queries 120MB. Leaks allom dus. Toen heb ik zelf maar XMLserverke geschreven (op 4 uur tijd) die compatible was met xindice (xml-rpc interface). Deze laatste kon wel geen XUpdate (maar xindice verneukt die 95% van de tijd toch) maar wel live een document update doen (wat we ook doen). Verder weet ik dat de F1A een xml-database gebruikt voor al hun dingen dus er zijn wel degelijk goede commericeele produkten. Persoonlijk vind ik onze approach nog het best - beste van beide werelden. De rest van het system (web side) werd gedaan in Cocoon zodoende dat dan ook alles met XML+XSLT werd gedaan. Van snelheid ben ik niet tevreden (serverside) maar het ligt vast aan wat instellingen (niet mijn verantwoordelijkheid). SQL is zalig voor speed, maar naar mijn inziens nog veel te onduidelijk (zie ook 'Perl') en een foutje zit er gemakkelijk in, anderzijds: als het werkt - werkt het beestig. met een SQL generator heb je het beste van beide. Ik weet niet hoe groot je site is (onze was 90+ allemaal 100% dynamic). maar als je niet live moet updaten kun je toch gewoon met xml+xslt werken (dat ga ik doen voor me eigen site, ik wacht tot php5 uit is zo dat ik xslt erop kan loslaten, maar voorlopig test ik alles met Java).

edit:
part II of 'Adventures in Ridiculously XML oriented Database design' volgt een andere keer. :) - Eigenlijk zou GoT wel leuk zijn om 'Post-Mortems' te posten he?

[ Voor 5% gewijzigd door hobbit_be op 07-07-2003 21:56 ]


  • r0bert
  • Registratie: September 2001
  • Laatst online: 11-08 16:19
B) Kan de topicstarter helaas niets uit wijs worden maar ik weet zeker dat het heel interresant is voor de overige lezers =P 8)7 Als je nog tijd te veel hebt, zou je er ook nog een beginner versie bij kunnen maken? Je bent toch zo fanatiek bezig ;)

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Voor onze CMS hebben we a 'two-pronged' approach gebruikt. Heel de data-structuur staat beschreven als XML en eigenlijk wordt deze gemapped op 'objects'. Sommige van die objects (meestal dingen die vaak en veel voorkomen en allemaal hetzelfde van structuur zijn) worden door een 'JDO' approach opgeslagen in een RDBMS. let wel: we gebruiken gewoon XPath queries die worden vertaalt naar SQL. Dus er is geen regel SQL te vinden.
Ik moest er even over nadenken, maar dat is inderdaad een hele goede benadering. Wij hebben namelijk tot op zekere hoogte dezelfde benadering, maar daarin is de xml-structuur enkel een "configuratie" van het cms. Het beschrijft de datastructuren (is dus gewoon een meta-data base) die in de database voorkomen. Er wordt vervolgens aan de hand van die structuren gemapped naar objecten die daardoor "zelf" weten welke relaties ze hebben met andere objecten en hoe ze die moeten verwerken.

Ik begrijp echter uit jouw verhaal dat je nog een stap verder gaat, en feitelijk ook de SQL "overneemt" door de objecten :) (tenminste, ik zeg het nou een beetje debiel, maar ik geloof wel dat ik je begrijp). Jij zit dus ongeveer op de gulden middenweg, terwijl ik er net naast zit.

Voordeel is natuurlijk voor het grootste gedeelte dat je niet meer afhankelijk bent van SQL als taal en soms zelfs MySQL als platform maar dat je voor jezelf een volledig transparante laag hebt gecreeerd om ook andere soorten data er in te kunnen "pluggen". Flat databases, XML, ODBC, niks is meer te gek natuurlijk :D

* drm parkeert 't idee even en gaat nadenken hoe dat uit te werken :)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
rObert: ja ik wou eigenlijk alleen zeggen dat Xindice maar niets is, maar ik vond het wel belangrijk om uit te leggen waarom - tis beetje uitgelopen ;).

drm: 'op de gulden middenweg' - ja en nee. Soms duurt het langer om met xpath queries iets te doen dan gewoon met SQL (ik denk trouwens dat SQL altijd al korter is maar minder maintainable). Ze zijn gelukkig te cachen (read: HashMap ;) ). Je hebt gelijk als je zegt dat het ons in feite geen bal meer kon schelen hoe en waar het nou werd opgeslagen - iets waar cocoon meer problemen mee had dan client-side. Door bestaande techieken (OJB/Xindice/JxPath/etc) te gebruiken duurde het veel langer dan het allemaal moest. ook JBDC heeft ons dagen kopzorgen gekost omdat ie soms wel erg raar deed (TimeStamps, UTF, etc) gelukkig waren did problemen op dat layer en die werden dus gefixed (niet altijd mooi ;) - Java kent blijkbaar geen 'correcte' BST timezone) maar zonder maar een regel in de xml description te veranderen want we (nou ik was de push achter dit systeem) dachten top -> down. Daardoor kon de dude die de forms samenstelde (sommige moesten niet alles tonen en hadden extra validation-rules) rustig verder omdat ik had gezegd: zo gaat het werken en zo is de xml. werken met een OO approach (en gemixed met xpath die (leuk voor ons eigenlijk een soort van scripting-taal is) kan HEEL snel werken. helaas moesten we voor elk echt Mapped object ook een corresponding Java Class hebben (aangezien OJB dit nodig had) maar dit was eigenlijk nog een sublayer die we gebruikten. Ook de client-side UI is volledig beschreven in XML (zo dat je het kon designen terwijl ie aan het runnen is). Het samenvoegen - so to speak - duurde een dag. En we hebben met het systeem (xml side) geen problemen gehad alleen met JDBC (nou ja meer met mySQL layer).

een paar voorbeeld xmls

defineren van een datatype... alle properties zijn op elk moment voor elk 'object' (ie ding die van dt image is hier) overridable. In feite is het dus een soort van template. Doet me het meest denken aan Scripting Talen zoals ECMA...
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
    <data-type id="image" viewer="image-editor">
       <extends data-type="string" />
       <add-rule rule="file-filters-rule">
            <filter name="Graphics For WWW Use (.jpg, .gif, .png)">
                <allow-extension id="jpg" name="JPeg File (.jpg)" />
                <allow-extension id="gif" name="Gif File (.gif)" />
                <allow-extension id="png" name="Portable Network Graphics File (.png)" />
            </filter>
        </add-rule>
        <add-rule max="1000000" rule="file-size" />
        <set-property id="remote-path" value="{$global:resourcesPATH}/user/content/" />
        <set-property id="remote-url" value="{$global:resourcesURL}/user/content/" />
    </data-type>



deze beschrijft hoe je een bepaald object kan bekijken/manipuleren. Laat ook ziet dat dit ook in feite een template is die dus voor eender welke conforme 'classe' kan werken. Ook params, global vars etc worden allemaal geparst. de Actions zijn meestal default actions (naargelang het object) maar voor elke object (nou ja interface is al genoeg) gaat het systeem de best passende zoeken. In dit geval is het object mapped over 3 tables. In dit geval zijn er geen subforms (m:n) maar ook dit word natuurlijk ondersteunt.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<tabular-view data-object="Appointment" id="appointments">
        <action mode="new" name="handle"/>
        <action name="{$parameter:mode}Cancel"/>
        <list-view subtitle="Appointments Requested By People" title="{$modeLabel()} Appointments">
            <fields>
                <field mode="new" order-by="desc" ref="/interaction/createDateTime"/>
                <field condition="&gt;={$global:currentDateTime}"
                    format="dd/MM/yyyy HH:mm" mode="new" ref="/datetime"/>
                <field condition="&gt;={$global:currentDateTime}"
                    format="dd/MM/yyyy HH:mm" mode="my" order-by="asc" ref="/datetime"/>
                <field format="dd/MM/yyyy HH:mm" ref="/cancelledDatetime"/>
                <field label="Student">
                    <field ref="/interaction/user/firstname"/>
                    <field value=" "/>
                    <field ref="/interaction/user/surname"/>
                </field>
                <!--new-->
                <field condition="=0" mode="new"
                    ref="/interaction/handlerId" visible="false"/>
                <!--my-->
                <field mode="my" ref="/rescheduleState"/>
                <field condition="={$global:userId}" mode="my"
                    ref="/interaction/handlerId" visible="false"/>
            </fields>
        </list-view>
        <form-view
            subtitle="Accept/Reject Or Reschedule This Appointment" title="{$modeLabel()} Appointment">
            <action name="{$parameter:mode}Reschedule"/>
            <fields>
                <field ref="/datetime"/>
            </fields>
        </form-view>
    </tabular-view>


en een klein stukje ui (we gebruiken ongeveer 30 ui - templates voor alle dialogs, er is dus ook 0% swing voor de maker ;). Hier zijn ook wat last minute extra attributes bij voor server-side.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
   <panel id="content" layout="border">
            <tabs id="allTabs">
                 <tab label="Incoming" layout="border">
                    <splits id="Test AGain">
                        <split layout="border">
                            <list-editor id="newList" width="40%">
                                <item data-type="ojb-tabular" icon="images/appointment.gif"
 label="Appointments" mode="new" tabular-view="appointments" />
                                <item data-type="ojb-tabular" icon="images/question.gif" 
label="Questions" mode="new" tabular-view="questions" />
                                                          </list-editor>
                        </split>
                        <split layout="border">
                            <data-viewer id="newViewer" layout="border" width="60%" />
                            <!-- connect data and logic for ui -->
                            <connect-data input="newViewer" output="newList" />
                            <connect-event input="newList" output="newViewer" />
                        </split>
                    </splits>
                </tab>
   </panel>



hmm weer een veel te lange post...

[ Voor 13% gewijzigd door hobbit_be op 08-07-2003 02:08 ]

Pagina: 1