Jak decydować między formatami przechowywania i jakie są przykładowe przypadki użycia dla niektórych z nich?

10

Mamy różne sposoby przechowywania danych programu (zapisywanie plików w grach, bazach danych pracowników, konfiguracji programów itp.):

  • Zwykły tekst (pomyśl .inii .conf)
  • XML
  • Bazy danych (MySQL, SQLite ...)
  • .zip i podobne zawierające kilka plików (o różnych formatach)
  • Pliki binarne (pomyśl .docitp., Na przykład utworzone przez narzędzie do serializacji)

Jakie są różne przypadki użycia wymienionych wyżej formatów i jakie są ich zalety wady (szybkość myślenia, elastyczność, rozmiar pliku, łatwość użycia ...)? Jak decydować między nimi o różnych zadaniach?

Informacje o formacie zip: służy tylko do przechowywania innych plików. Może to być także inny format kompresji. Pozwala to na budowę kilku plików, w tym plików obrazów, plików dźwiękowych i plików tekstowych. Na przykład załóżmy, że masz format przechowywania wiadomości, które mogą zawierać pliki. W skompresowanym pliku możesz umieścić następujące pliki:

message.txt (containing the message)
attachments (folder containing attachments)
  audio.wav
  picture.jpg
Anto
źródło
wrt binarny, rozważ bufor protokołu Google. Leniwa funkcja deserializacji jest niesamowita i zawsze masz możliwość jej wyodrębnienia i ponownego zapisania jako sformatowanego tekstu (w kilku językach C ++ / Java / Python).
Matthieu M.

Odpowiedzi:

6

Używam w następujący sposób:

Zwykły tekst

Do konfiguracji - zwykle przy użyciu YAML lub .ini. Przestarzałe przeze mnie dla większości zastosowań, z wyjątkiem sytuacji, gdy pożądany wynik to plik tekstowy (np. Wydruk na tekst, zapis na tekst itp.)

XML

Do konfiguracji i transportu danych; np. eksport, format przez XSLT itp. Dobry jako przenośny format pliku (np. SVG). Doskonałe narzędzia manipulacyjne i filtry.

Bazy danych

Główne przechowywanie danych z wnętrza aplikacji / aplikacji internetowej. Używaj go cały czas jako miejsca do przechowywania. Jest niezawodny, solidny i zawiera wiele wbudowanych elementów (transakcje, spójność referencyjna, kaskadowe usuwanie / aktualizacja, indeksy, szybkość). Najlepiej stosować z warstwą lub ORM (IMO).

Archiwum pojedynczych plików (np. .Zip)

Nadaje się do kompaktowego przechowywania powiązanych wielu strumieni binarnych, np. Obrazów ROM dla emulatora. Najlepsze dla rzeczy, które często lub nigdy nie muszą być aktualizowane. Jest ciężki, powolny i trudny do manipulowania;

Dwójkowy

Tylko wtedy, gdy baza danych nie jest dostępna do przechowywania danych aplikacji. Najłatwiejsze dzięki serializacji (C ++). Wysoce dostrojony format binarny przewyższy wszystko inne pod względem szybkości i wielkości.

Richard Harrison
źródło
4

Nie ma srebrnej kuli. Z mojego doświadczenia:

Zwykły tekst jako nośnik pamięci to automatyczne nie. Nieliczne przypadki, które nawet bym uznał, byłyby lepiej objęte plikiem .config, w którym mam schemat i bezpieczeństwo typu. Wydaje się, że prawie zawsze pojawia się potrzeba bezpieczeństwa typu i ekstrakcji danych. Zwykły tekst czyni ten proces koszmarem.

XML : Bezpieczeństwo typów, sprawdzanie poprawności danych, niski wolumen, a w niektórych przypadkach używam go, ponieważ .NET ma wbudowaną obsługę serializacji obiektów XML.

Bazy danych : Moje domyślne. Wpisz bezpieczeństwo, szybkość, transakcje, dobrze zaufane i ciężko winić za wybranie DB jako nośnika pamięci, jeśli coś nie pójdzie zgodnie z planem.

.zip jest formatem kompresji, nie wiesz, jak to pasuje do trwałości ..?

Binarny : Używam binarnego tylko wtedy, gdy muszę utworzyć tymczasowy memorystream. Binarny nie dodaje wartości w zakresie możliwości zapytania w porównaniu do DB lub XML, w którym moje dane są zorganizowane według schematu.

Łatwość użycia jest względna i zależy od tego, co konkretnie chcesz osiągnąć. Prędkość jest podobna poza tym, co powiedziałem powyżej w odniesieniu do głośności. Jeśli rozmiar pliku stanowi problem i zastosowana jest odpowiednia normalizacja, skompresuję go za pomocą zip lub innego formatu kompresji, ale jest to osobny proces.

P.Brian.Mackey
źródło
3

Używam ich w następujący sposób:

Zwykły tekst

Jeśli ta kategoria zawiera nieco bardziej rozbudowane formaty, takie jak YAML lub pliki właściwości, to jest to najlepsza opcja dla tego, czego oczekujesz, że ludzie będą czytać i edytować ręcznie. Kolejną ogromną zaletą jest prostota modyfikacji za pomocą małego skryptu (np. Sed).

Nic nie przebije prostoty i łatwości użytkowania. Gdy zespół pomocy technicznej musi coś skonfigurować na zdalnym komputerze (np. Rozwiązać problem klienta) lub dział IT musi ponownie skonfigurować kilka serwerów, na których działa twoje oprogramowanie, podziękują Ci za wybranie tego formatu. Pozwoli ci to również zaoszczędzić na pisaniu oprogramowania, które im to odpowiada.

XML

Zgadzam się z @Ingo tutaj - w przeciwieństwie do zwykłego tekstu XML jest trudniejszy do przetworzenia za pomocą skryptów, a koszmar do edycji ręcznie imo.

Mimo to, jeśli masz dane o skomplikowanej strukturze, w których YAML staje się nieczytelny i nadal chcesz, aby były czytelne dla człowieka i edytowalne, to XML jest prawdopodobnie najlepszym wyborem.

Relacyjna baza danych

Świetny wybór, gdy masz dużo danych (co spowodowałoby, że zwykły tekst i XML byłyby uciążliwe), które nadal możesz chcieć umożliwić stronom trzecim do ręcznej edycji - za pomocą poleceń SQL, a nawet GUI.

Kolejną zaletą jest to, że kod zarządzający zawartością jest bardzo czytelny. @ Richard-Harrison podał dobrą listę innych zalet w swojej doskonałej odpowiedzi.

Baza danych NoSQL

Zaletą w stosunku do RDBMS jest skalowalność poprzez dystrybucję, co prawdopodobnie nie jest zbyt istotne w przypadku twojego pytania. Korzyści, które są prawdopodobnie bardziej odpowiednie, to prostota magazynu klucz-wartość i elastyczność schematyzmu (czy to słowo?). Kiedy odkryjesz, że łamiesz paradygmat relacji: po prostu przechowuj obiekty BLOB w bazie danych, uzyskuj do nich dostęp za pomocą klucza i przetwarzaj je za pomocą kodu, a następnie rozważ tę opcję. Niektóre opcje (np. CouchDB) są bardzo przenośne, mają niewielkie rozmiary i mogą być skalowane, dzięki czemu stanowią dobrą nierelacyjną alternatywę dla MySQL i SQLite.

Dwójkowy

Zaletą binarnych jest to, że jest szybki i kompaktowy. Jeśli jedyną rzeczą, która musi odczytać i zmodyfikować plik, jest program, a dane nie pasują do paradygmatu relacji lub szybkość jest naprawdę ważna, może to być dobry wybór. Prawdopodobnie najlepiej pasuje do plików multimedialnych.

Powinienem jednak zaznaczyć, że jeszcze nie spotkałem się z przypadkiem, w którym prosty dostęp do danych programu nie jest w pewnym momencie wymagany z powodów, które nie były brane pod uwagę podczas wstępnego projektowania. Obecnie osobiście wybieram opcję bazy danych dla wszystkiego innego niż pliki, które mają standardowe formaty i muszą być kodowane / dekodowane przez inne oprogramowanie (np. Audio, wideo).

Uwaga: powszechne jest błędne przekonanie, że plik binarny jest nieprzejrzysty, a przez to bardziej bezpieczny. Bez dodatkowej ochrony tak nie jest - jeśli ktoś chce zhakować twoje oprogramowanie, po prostu przechowywanie konfiguracji lub cokolwiek w pliku binarnym ich nie zatrzyma.

Skompresowane archiwum

Nie jest to właściwie alternatywa dla powyższego, ale raczej dodatkowy środek.

Jest to przydatne, gdy potrzebujesz przesyłać rzeczy przez sieć lub gdy przechowujesz dużo danych i chcesz zaoszczędzić miejsce. Pamiętaj, że w dzisiejszych czasach przestrzeń dyskowa jest zwykle duża, więc zastanów się nad platformą docelową.

Działa bardzo szybko na prawie wszystkim dzisiaj (prawo Moore'a w działaniu, kochanie), więc jedynym powodem, dla którego nie należy go używać, jest to, że zwiększa złożoność kodu. Niewielka złożoność, ale nadal naruszenie zasady KISS. Szczególnie kłopotliwe w przypadku plików konfiguracyjnych, które należy edytować ręcznie lub za pomocą skryptów - a jeśli naprawdę potrzebujesz tam zaoszczędzić miejsce, prawdopodobnie powinieneś użyć opcji bazy danych.

Elad
źródło
2

Użyłbym ich w następujący sposób:

  • Zwykły tekst : Aplikacja ma mały rozmiar danych o prostej strukturze (na przykład pary wartości nazwa). Dane nie są modyfikowane jednocześnie przez wielu użytkowników.
  • XML : Mały rozmiar danych strukturalnych, które nie są modyfikowane jednocześnie lub często.
  • Baza danych : potrzebne są duże dane strukturalne lub równoczesny dostęp. Konieczność zapytania i wyszukiwania jest koniecznością w aplikacji.
  • Dane binarne : użyłbym tego tylko do przesyłania strumieniowego obiektów.
  • zipowanie to kompresja, którą można dodać jako inny proces dla dowolnego z powyższych procesów, z wyjątkiem baz danych na serwerach.
M.Sameer
źródło
1

Słyszałem, że XML łączy najgorsze cechy tekstu (trudny / wolny w przetwarzaniu) i binarnego (nieczytelny).

Ingo
źródło
Nie jest to kompletna odpowiedź
Anto