baza danych i xml

Witam, mam takie pytanko, niektórym może okazać się dość trywialne... Otóż zamierzam napisać pewną aplikację, w której część danych będzie wprowadzana bezpośrednio do bazy MySql, a część będzie w plikach xml. Tu moje pytanie- jak i gdzie najlepiej przechowywać te xml-e? Byłabym wdzięczna jakby ktoś mógł mi wyjaśnić jak najlepiej zabrać się za taką bazę- do tej pory korzystałam tylko z MySql, a wszystkie dane siedziały sobie ładnie w tabelach.

  • Kilka pytań które mogą pomóc:

    1. Czy będziesz udostępniać te pliki klientowi?
    2. Czy sama będziesz odczytywać/parsować te wygenerowane pliki?
    3. Czy będziesz je modyfikować?
    4. Czy pliki te mają opisywać jedną klasę obiektów (na przykład zapytania od klientów), czy ma być ich więcej?

    Ad. 1. Jeśli będziesz udostępniać te pliki klientowi, to zapewne chodzi w tym wszystkim o to, żeby klient mógł dostać informacje z Twojej aplikacji w strawnym dla niego formacie XML. W takiej sytuacji możesz trzymać pliki w jakimś katalogu (np. generated-xmls) i przechowywać informacje o nich w tabelce MySQL. Nazywaj je na przykład numerami id z owej tabeli.

    Ad. 2,3. Jeśli masz zamiar odczytywać i lub modyfikować te dane, to chyba takie działanie mija się z celem, o ile nie nastąpi pkt. 1, to znaczy nie masz zamiaru udostępnić plików klientowi lub innym aplikacjom. Ale nawet w takim wypadku znacznie lepiej jest spróbować zachować homogeniczność, dane przechowywać w tabelach MySQL i generować pliki na żądanie klienta, przechowując je jak w punkcie 1.

    Ad. 4. Jeśli jedna klasa - patrz pkt. 1. W przeciwnym razie możesz utworzyć kilka tabel MySQL (na przykład request_xmls, response_xmls, client_xmls czy co tam jeszcze potrzebujesz), każdą z nich łącząc z tabelą xmls (za pomocą klucza obcego xml_id). Ten id może być jednocześnie nazwą pliku w katalogu z xml-ami.

    Jest jeszcze taka opcja (łącząca się nieco z punktem 2 i 3), że naprawdę potrzebujesz jakiś cech XML-a, których relacyjne bazy danych nie są w stanie Ci zapewnić (na przykład dowolność kształtowania schematu bazy). Jednak i w tym przypadku polecam Ci rozwiązanie z punktów 1+4 - informacje o plikach w bazie MySQL, a same pliki w wydzielonym katalogu.

    Jeśli tworzysz aplikację WWW, to katalog nie może być dostępny z przeglądarki! W takim przypadku zadbaj również o prawa tworzonych plików, aby żaden inny użytkownik nie miał do nich dostępu (na przykład mogą być to uprawnienia 600, czyli rw-------).

  • Zanim zadasz pytanie jak i gdzie będziesz te pliki przechowywał warto sobie zadać pytanie czy warto to robić. Przetwarzanie plików xml jest znacznie wolniejsze niż zapytania do bazy danych. Zakładając jednak, że masz taką potrzebę musisz zadać sobie pytanie na ile te dane są 'wrażliwe'. Jeżeli każdy ma do nich dostęp zrób sobie katalog XML i trzymaj je w tym katalogu. Jeżeli dostęp do danych uzależniony jest od uprawnień użytkowników, wyrzuć katalog na XMLe poza katalog publiczny. W ten sposób w zależności od uprawnień możesz odmówić dostępu do pliku lub przetworzyć jego dane.

    Co do struktury przechowywania to dużo zależy od aplikacji. Dla przykładu jeżeli pliki XML są źródłem informacji dla wielu galerii. Możesz to zrobić tak, w głównym katalogu plik XML opisujący wszystkie galerie. W podkatalogach pliki konkretnych galerii opisujące poszczególne zdjęcia oraz zdjęcia.

    Podsumowując... temat rzeka.

  • Niektóre bazy - na przykład PostgreSQL - posiadają dedykowane typy danych do przechowywania XMLa i zestawy funkcji do operacji.

    http://www.postgresql.org/docs/8.4/interactive/datatype-xml.html

    http://www.postgresql.org/docs/8.4/interactive/functions-xml.html

    Jesli na przykład masz duży zbiór metadanych w postaci plików XML i nie wiesz co będzie potrzebne z tych plików za pół roku, możesz zaimportować je do bazy danych, a potem wyciągać z nich potrzebne dane za pomocą xpath.

    Sytuacja z życia - duży zbiór danych dotyczacych płyt CD - pliki kilkaset tysięcy plików meta, nie bardzo wiadomo co z nich wyciągnąć od razu, jaka struktura będzie potrzebna. Zostały wciągnięte jako dane typu xml, i teraz w razie potrzeby można uzupełniać strukturę docelową za pomocą zapytań z użyciem funkcji xpath, np tego typu:

      SELECT id,
      xpath('Artist/text()', meta) as artists,
      xpath('//Track/track_title/text()', meta) as tracks
      FROM import_sources
      LIMIT 3;
    

    Wynik:

    [ RECORD 1 ]
    
    id      | 1
    artists | {"Will Hoge"}
    tracks  | {"Not That Cool","Be The One","King Of Grey","Secondhand Heart","Hey Tonight","Doesn't Have To Be That Way","It's A Shame","Someone Else's Baby","TV Set","Better Off Now","All Night Long","Baby Girl"}
    
    [ RECORD 2 ]
    
    id      | 2
    artists | {"Pulse Ultra"}
    tracks  | {Acceptance,"Finding My Place","Put It Off","Big Brother","Never The Culprit","Slip In Sin",Prelude,Void,"Build Your Cages",Tired,Interlude,"Look Closer","Glass Door",Despot}
    
    [ RECORD 3 ]
    
    id      | 3
    artists | {Outspoken}
    tracks  | {"Bitter Shovel",Revolving,Farther,"Feel This","Loose End","Deeper Than Down",Elastic,"Way I Am","My Turn",Now,Judging,Guidance}
    

Zaloguj się, aby dodać swoją odpowiedź