Kiedy należy preferować korzystanie z bazy danych niż parsowanie danych z pliku tekstowego?

13

Tworzyłem program w języku Python do mierzenia rozwoju codereview.SE . Moje podejście polegało na uzyskaniu „statystyk witryny” wyświetlanych na pierwszej stronie i zapisaniu ich na moim dysku twardym. Planuję to robić raz dziennie. Do tej pory zrobiłem wystarczająco dużo, aby uzyskać statystyki i dołączyć je do pliku tekstowego. Skrypt Pythona można wyświetlić na github . Format, którego używam, jest następujący

22-08-2013

questions 9073
answers 15326
answered 88
users 26102
visitors/day 7407

22-08-2013

questions 9073
answers 15326
answered 88
users 26102
visitors/day 7407

Właśnie uruchomiłem skrypt dwa razy, aby uzyskać format, którego chciałbym użyć w pliku. Początkowo wydawało mi się to dobre, ponieważ sam będę go przechowywać, a format byłby taki sam, więc można by go łatwo przeanalizować, ale nie jestem pewien. Wydaje się, że korzystanie z bazy danych powinno być tutaj lepsze, ponieważ w ten sposób odzyskiwanie danych powinno być łatwiejsze. Uwaga: nigdy nie korzystałem z żadnej bazy danych i nie mam wiedzy o SQL, MySQL ani innych wariantach RDBMS.

To prowadzi mnie do pytania. Kiedy należy preferować bazę danych do przechowywania danych niż do przechowywania danych w pliku tekstowym? Czy są jakieś wskazówki, których mogę szukać przy podejmowaniu decyzji, czy potrzebuję bazy danych czy prostych plików tekstowych?

PS: Jeśli można dodać lepsze tagi, zrób to. Miałem wątpliwości co do tagów, które można dodać.

Aseem Bansal
źródło
„Każde narzędzie jest odpowiedzialne, dopóki nie nauczysz się go używać”.
JeffO,
1
Baza danych może, ale nie musi być odpowiednia dla twojego projektu. Może się jednak okazać, że pomocne byłoby użycie prostszego formatu. Istnieje moduł CSV, który jest standardem w Pythonie, którego możesz rozważyć. Posiadanie pliku CSV uprościłoby eksportowanie danych do innych programów (np. - do arkusza kalkulacyjnego, aby można go było wykresować).
Sean McSomething

Odpowiedzi:

14

Kiedy należy preferować bazę danych do przechowywania danych niż do przechowywania danych w pliku tekstowym?

Wikipedia mówi nam, że baza danych to zorganizowany zbiór danych . W ten sposób plik tekstowy jest bazą danych. Mówi dalej:

Dane są zazwyczaj zorganizowane w celu modelowania odpowiednich aspektów rzeczywistości w sposób, który obsługuje procesy wymagające tych informacji. Na przykład modelowanie dostępności pokoi w hotelach w sposób umożliwiający znalezienie hotelu z wolnymi miejscami.

Ta część jest subiektywna - nie mówi nam konkretnie, w jaki sposób należy modelować dane ani jakie operacje należy zoptymalizować. Twój plik tekstowy składa się z wielu odrębnych zapisów, po jednym na każdy dzień, więc modelujesz aspekt rzeczywistości w sposób odpowiedni dla twojego problemu.

Zdaję sobie sprawę, że kiedy mówisz „baza danych”, prawdopodobnie myślisz o jakimś systemie zarządzania relacyjnymi bazami danych, ale myślenie o pliku tekstowym jako bazie danych zmienia twoje pytanie z „kiedy powinienem użyć bazy danych?”. na „jakiego rodzaju bazy danych powinienem użyć?” Widzenie rzeczy w tym świetle ułatwia odpowiedź: użyj lepszej bazy danych, gdy ta, którą masz, nie spełnia już twoich wymagań.

Jeśli Twój skrypt w Pythonie i prosty plik tekstowy działają wystarczająco dobrze, nie musisz tego zmieniać. Mając tylko jeden nowy rekord dziennie, a komputery stają się coraz szybsze każdego roku, podejrzewam, że twoje obecne rozwiązanie może być opłacalne przez długi czas. Dane z dekady dałyby tylko 3650 rekordów, które po przeanalizowaniu prawdopodobnie wymagałyby mniej niż 75 kilobajtów.

Wyobraź sobie, że zamiast jednego małego rekordu dziennie postanowiłeś zapisać każde pytanie zadane na CodeReview, kto go zadał i kiedy. Ponadto zbierasz wszystkie odpowiedzi i odpowiednie metadane. Możesz to wszystko zapisać w pliku tekstowym, ale płaski plik utrudniłby znalezienie informacji, kiedy byłyby potrzebne. Będzie zbyt wiele danych, aby wczytać całą pamięć do pamięci, więc za każdym razem, gdy chcesz znaleźć pytanie lub odpowiedź, będziesz musiał skanować plik, aż znajdziesz to, czego szukasz. Gdy chcesz znaleźć wszystkie pytania zadane przez danego użytkownika, musisz zeskanować cały plik. Jeśli chcesz znaleźć wszystkie pytania, które zawierają „błędy” jako tag, musisz zeskanować plik.

To byłoby strasznie wolne, więc możesz zdecydować się przyspieszyć, budując indeksy, które podpowiedzą, gdzie szukać w pliku, aby znaleźć dany rekord. Możesz mieć indeks pytań, inny dla użytkowników, trzeci dla odpowiedzi i tak dalej. Gdy chcesz znaleźć pytanie, przeszukujesz (znacznie mniejszy) indeks pytań, uzyskujesz pozycję pytania w głównym pliku danych i szybko przeskakujesz we właściwe miejsce w pliku. To byłaby duża poprawa wydajności. Rzeczywiście, taki właśnie jest system zarządzania bazą danych.

Więc używaj DBMS, kiedy jest to, czego potrzebujesz. Używaj go, gdy masz dużo danych, gdy chcesz mieć szybki dostęp do tych danych i być może w sposób, którego na początku nie potrafisz całkowicie przewidzieć. Jeśli masz różne rodzaje danych - różne typy rekordów - które są ze sobą połączone, użyj RDBMS, aby móc odpowiednio powiązać różne rekordy.

Caleb
źródło
3
„myślenie o pliku tekstowym jako zmianie bazy danych” Bardzo wnikliwe. Pomocna była także część, że mam tylko 3650 wpisów. Pomogło to uzyskać realną perspektywę problemu.
Aseem Bansal
1
Bardzo niedoceniana odpowiedź, po raz drugi do niej wróciłem.
Hashim
6

Bazy danych mają wiele zalet, ale czyni dostęp łatwiej nie jest jednym z nich. Szybsze, bardziej znormalizowane, interpretowalne jako podrzędny język poleceń, bezpieczniejsze, tak - ale nie łatwiejsze. Bez względu na to, ile cukru syntaktycznego zapewnia Twój język i standardowa biblioteka, musisz przede wszystkim mieć bazę danych, otworzyć połączenie z nią i przekierować dane z programu na coś zupełnie innego. Tak długo, jak nie ma problemów z tym, co robisz, a łatwość programowania jest twoim priorytetem, nigdy nie przełączaj się na bazę danych tylko dlatego, że uważasz, że to „dobra praktyka”.

Moim zdaniem, kiedy dokonać zmiany, jest śledzenie rozwoju historycznego. W końcu ludzie przechowywali dane w plikach przez długi czas, zanim wynaleziono relacyjną bazę danych, a tak naprawdę wcześniej wymyślono całą masę gorszych modeli baz danych (hierarchiczna baza danych, baza danych sieci ...). Zaczęli pisać bazy danych i korzystali z nich, gdy stało się jasne, że pozwoli to zaoszczędzić sporo czasu na przetwarzaniu, zwiększyć ogólną niezawodność itp. Na dłuższą metę . Dopóki nie będzie tak w twoim przypadku, i nie przewidujesz, że stanie się to w najbliższym czasie, zmiana będzie nadmiernie inżynierska.

Kilian Foth
źródło
Czy spójność nie jest lepsza według ogólnego projektu? np. w moim przypadku przechowuję 5 wartości odpowiadających każdej dacie. W obecnym stanie nie ma żadnej spójności między danymi.
Aseem Bansal
Masz rację, upewnienie się, że wszystkie rekordy mają spójny zestaw pól i wartości, to kolejna z tych zalet. (Ściśle mówiąc, są to tylko relacyjne bazy danych, które to gwarantują. Ludzie używali nierelacyjnych baz danych w produkcji przez długi czas, a obecnie znów zyskują na popularności dzięki ruchowi „NoSQL”.)
Kilian Foth
3

Będzie to oczywiście wezwanie do oceny, ale trzy główne kryteria, które rozważę, to: czy musi być zgodny z ACID , jak skomplikowane są dane i wreszcie, ile rzeczy trzeba odczytać / napisać. Tak długo, jak po prostu czytasz i piszesz jeden wiersz na, a Twoja aplikacja jest jedyną aplikacją, która czyta lub pisze, prawdopodobnie możesz pominąć bazę danych. Gdy zaczniesz mieć wiele aplikacji do odczytu lub zapisu, lub gdy struktura danych stanie się złożona (szczególnie jeśli ma związek między oddzielnymi liniami), baza danych zaczyna wyglądać naprawdę atrakcyjnie.

jmoreno
źródło
„ile rzeczy trzeba przeczytać / napisać” - To pomogło.
Aseem Bansal
2

Bazy danych służą nie tylko do przechowywania, ale także do manipulowania danymi i ich wysyłania zapytań, dlatego musisz podjąć świadomą decyzję:

Dużym czynnikiem jest korzyść, jaką uzyskuje się z instalacji bazy danych na komputerze, w porównaniu z funkcjami, które oferuje

Oczywiście, jeśli potrzebujesz zapytać o dane i manipulować nimi, a chcesz, aby dostęp był szybki - a dodatkowo możesz zastanawiać się nad wykorzystaniem bazy danych do innych funkcji, może to być dobry pomysł. Modele przechowywania baz danych umożliwiają bardzo szybkie wyszukiwanie danych według kluczowych wartości i mogę sobie wyobrazić, że parsowanie pliku może być powolne (w zależności od tego, jak to robisz)

Jeśli chcesz grać z SQL i co potrafi, SQLFiddle.com ma kilka różnych modeli RDBMS, którymi możesz się bawić (uruchamianie zapytań, tworzenie schematu itp.)

Charleh
źródło
Python ma wbudowany standardowy interfejs biblioteki dla sqlite3. Dlatego instalacja bazy danych nie stanowi problemu. Uważam, że jeśli będę nadal przechowywać dane, chyba że będę mieć jakieś indeksowanie, może stać się wolne. Myślę, że baza danych może się tym zająć. Ściągnąłem sqlite3 osobno, aby się tego nauczyć, stwierdziłem, że muszę dowiedzieć się o modelach baz danych przed użyciem bazy danych, spróbowałem tego. Mogę nauczyć się sqlite3 na przykładach internetowych, ale obecnie mam problemy z uczeniem się modeli baz danych. Wtedy przyszło mi do głowy, czy to było warte kłopotów?
Aseem Bansal
2

Jak zawsze korzystanie z bazy danych lub nie, zależy od tego, co musisz zrobić. Jeśli masz ogromną ilość danych i musisz wykonać na niej wiele różnych zapytań, prawdopodobnie baza danych może ci pomóc.

W twoim przypadku przechowałbym pamięć w pliku testowym, dopóki wydajność nie będzie akceptowalna. Zwykle czytanie pliku tekstowego (nawet dużego) nie trwa tak długo. Jeśli potrzebujesz więcej, zawsze możesz dodać bazę danych później.

Z mojego doświadczenia wynika, że ​​jeśli jesteś zupełnie nowy w bazach danych, łatwiejsze może być użycie czegoś takiego jak couchdb: http://couchdb.apache.org/, który nie jest sql i możesz używać bezpośrednio javascript lub python itp. Do zapytań.

Lorenzo Baracchi
źródło