Dobre powody, aby NIE używać relacyjnej bazy danych?

139

Czy możesz wskazać alternatywne narzędzia do przechowywania danych i podać dobre powody, aby ich używać zamiast starych, dobrych relacyjnych baz danych? Moim zdaniem większość aplikacji rzadko wykorzystuje pełną moc SQL - ciekawie byłoby zobaczyć, jak zbudować aplikację wolną od SQL.

żrący
źródło

Odpowiedzi:

148

Zwykłe pliki tekstowe w systemie plików

  • Bardzo proste w tworzeniu i edycji
  • Łatwy w obsłudze dla użytkowników za pomocą prostych narzędzi (np. Edytorów tekstu, grep itp.)
  • Wydajne przechowywanie dokumentów binarnych

Pliki XML lub JSON na dysku

  • Jak wyżej, ale z nieco większą możliwością walidacji struktury.

Arkusz kalkulacyjny / plik CSV

  • Bardzo łatwy do zrozumienia model dla użytkowników biznesowych

Subversion (lub podobny system kontroli wersji oparty na dyskach)

  • Bardzo dobre wsparcie dla wersjonowania danych

Berkeley DB (w zasadzie hashtable dyskowe)

  • Bardzo proste koncepcyjnie (tylko nie wpisany klucz / wartość)
  • Dosyć szybko
  • Brak kosztów administracyjnych
  • Uważam, że obsługuje transakcje

Prosta baza danych firmy Amazon

  • Wydaje mi się, że podobnie jak Berkeley DB, ale hostowane

Google App Engine Datastore

  • Hostowane i wysoce skalowalne
  • Przechowywanie klucz-wartość według dokumentu (tj. Elastyczny model danych)

CouchDB

  • Koncentracja na dokumencie
  • Proste przechowywanie danych częściowo ustrukturyzowanych / opartych na dokumentach

Kolekcje języka ojczystego (przechowywane w pamięci lub serializowane na dysku)

  • Bardzo ścisła integracja językowa

Niestandardowy (odręczny) mechanizm przechowywania danych

  • Potencjalnie bardzo wysoka wydajność w wymaganych przypadkach użycia

Nie mogę twierdzić, że nic o nich wiem, ale możesz też zajrzeć do systemów obiektowych baz danych .

Matt Sheppard
źródło
10
Byłoby wspaniale, gdybyś wyjaśnił również wady każdego wyboru, w przeciwnym razie jak wybrać? Dzięki,
Sklivvz
4
Również zapis milionów wierszy do bazy danych może zająć dzień, a dodanie miliona wierszy dziennika do pliku zajmuje zaledwie kilka minut. Nigdy nie zrozumiem, dlaczego ludzie nalegają na umieszczanie danych dziennika w bazie danych.
Aaron Digulla
33
Aaron: Mam jeden powód: SELECT wiadomości FROM WHERE (data MIĘDZY 2009-01-01 a 2009-03-01) AND type = 'error' AND system = 'windows' :) Jak byś załadował to z pliku tekstowego ?
Tomáš Fejfar
1
W miarę możliwości zdecydowanie opowiadam się za plikami tekstowymi. Nie zawsze możesz ich używać, ale kiedy możesz, są o wiele łatwiejsze do zdiagnozowania problemów.
Loren Pechtel
berkeley db zdecydowanie ma transakcje. pliki tekstowe i pliki xml / json nie, więc aplikacje wielowątkowe mogą je tępić, jeśli nie będziesz ostrożny. Pliki CSV świetnie nadają się do zbioru parametrów, ponieważ użytkownicy biznesowi mogą po prostu je przeglądać i edytować bez dodatkowych narzędzi. Pliki tekstowe świetnie nadają się do aplikacji, w których można zapisywać tylko raz / odczytywać, takich jak logowanie. Aby wybrać podejście, musisz dowiedzieć się, co próbujesz osiągnąć
O. Jones,
26

Odpowiedź Matta Shepparda jest świetna (zmodyfikuj), ale myśląc o wrzecionie wziąłbym pod uwagę te czynniki:

  1. Struktura: czy to oczywiście rozpada się na kawałki, czy robisz kompromisy?
  2. Zastosowanie: w jaki sposób dane zostaną przeanalizowane / odzyskane / wykorzystane?
  3. Czas życia: jak długo dane są przydatne?
  4. Rozmiar: ile jest danych?

Jedną ze szczególnych zalet plików CSV w porównaniu z systemami RDBMS jest to, że można je łatwo skondensować i przenieść na praktycznie każdą inną maszynę. Wykonujemy duże transfery danych, a wszystko jest dość proste, używamy po prostu jednego dużego pliku CSV i łatwego do skryptu za pomocą narzędzi takich jak rsync. Aby zmniejszyć liczbę powtórzeń w przypadku dużych plików CSV, możesz użyć czegoś takiego jak YAML . Nie jestem pewien, czy przechowałbym coś takiego jak JSON lub XML, chyba że miałbyś istotne wymagania dotyczące relacji.

Jeśli chodzi o niewymienione alternatywy, nie przeceniaj Hadoop , który jest otwartą implementacją MapReduce. Powinno to działać dobrze, jeśli masz TONĘ luźno ustrukturyzowanych danych, które należy przeanalizować, i chcesz znaleźć się w scenariuszu, w którym możesz po prostu dodać 10 dodatkowych maszyn do obsługi przetwarzania danych.

Na przykład zacząłem analizować wydajność, która była zasadniczo liczbą wszystkich czasów różnych funkcji zarejestrowanych na około 20 maszynach. Po próbie umieszczenia wszystkiego w RDBMS zdałem sobie sprawę, że naprawdę nie muszę ponownie sprawdzać danych po ich zagregowaniu. Jest to dla mnie przydatne tylko w zagregowanym formacie. Dlatego przechowuję pliki dziennika, kompresuję je, a następnie zostawiam zagregowane dane w bazie danych.

Uwaga : Jestem bardziej przyzwyczajony do myślenia o „dużych” rozmiarach.

Tristan Juricek
źródło
5
Jednym z niebezpieczeństw związanych z plikami CSV jest ucieczka, którą należy wykonać dobrze; łatwo jest zaimplementować czytnik lub pisarz CSV, który tak naprawdę nie jest zgodny ze specyfikacją, ponieważ wygląda tak zwodniczo prostym i jest kilka subtelności: en.wikipedia.org/wiki/Comma-separated_values#Specification
Jared Updike
10

System plików jest bardzo przydatny do przechowywania danych binarnych, co nigdy nie działa zadziwiająco dobrze w relacyjnych bazach danych.

Ubiguchi
źródło
6

Jeśli nie potrzebujesz ACID , prawdopodobnie nie potrzebujesz narzutu RDBMS. Więc zdecyduj, czy potrzebujesz tego najpierw. Większość podanych tutaj odpowiedzi innych niż RDBMS nie zawiera ACID.

bzlm
źródło
1
Czy możesz podać przykład, dlaczego / kiedy ACID nie jest potrzebny?
Ivan Voroshilin
1
@vibneiro, jeśli baza danych ma tylko jednego użytkownika, który wykonuje tylko operacje sekwencyjne, lub ryzyko niespójności bazy danych w przypadku awarii zasilania jest akceptowalne, lub nie ma zastosowania koncepcja transakcji bazodanowych lub nie ma potrzeby stosowania ograniczeń, kaskadami, wyzwalaczami itp., wtedy może wystarczyć dostawca inny niż ACID inny niż RDBMS (na przykład plik tekstowy z API podobnym do RDBMS). Na przykład aplikacja może prowadzić bazę danych historycznych komunikatów diagnostycznych, dla których ACID jest całkowicie nieistotny i wystarczy plik „log.txt”.
bzlm
Okazuje się, że ACID nie jest potrzebny w bardzo rzadkich przypadkach. Zastanawiam się, dlaczego bazy danych NoSQL są tak popularne? Większość z nich nie obsługuje pełnej KWASOWOŚCI.
Ivan Voroshilin
@vibneiro, NoSQL jest zwykle łatwiejsze, lżejsze, bardziej możliwe do osadzenia, bardziej samoobsługowe, bardziej intuicyjne, bardziej elastyczne i zwykle z pewnym ACID. Jeśli nie masz danych relacyjnych, prawdopodobnie RDBMS nie jest tym, czego potrzebujesz.
bzlm,
6

Niestandardowy (odręczny) mechanizm przechowywania danych / Potencjalnie bardzo wysoka wydajność w wymaganych przypadkach użycia

http://www.hdfgroup.org/

Jeśli masz ogromne zbiory danych, zamiast tworzyć własne, możesz użyć HDF, hierarchicznego formatu danych.

http://en.wikipedia.org/wiki/Hierarchical_Data_Format :

HDF obsługuje kilka różnych modeli danych, w tym wielowymiarowe tablice, obrazy rastrowe i tabele.

Jest również hierarchiczny, jak system plików, ale dane są przechowywane w jednym magicznym pliku binarnym.

HDF5 to pakiet umożliwiający zarządzanie wyjątkowo dużymi i złożonymi zbiorami danych.

Pomyśl o petabajtach danych z teledetekcji NASA / JPL.

Jared Updike
źródło
4

Dzień dobry,

Przychodzi mi do głowy jeden przypadek, kiedy danych, które modelujesz, nie można łatwo przedstawić w relacyjnej bazie danych.

Takim przykładem jest baza danych wykorzystywana przez operatorów telefonii komórkowej do monitorowania i sterowania stacjami bazowymi sieci telefonii komórkowej.

I prawie wszystkie te przypadki, OO DB używana jest , albo produkt komercyjny, albo system samoczynnie rozwijający się, który pozwala na tworzenie hierarchii obiektów.

Pracowałem nad aplikacją monitorującą 3G dla dużej firmy, która pozostanie bezimienna, ale której logo to plama z czerwonego wina (-: i używali takiej bazy danych OO do śledzenia wszystkich różnych atrybutów poszczególnych komórek w sieć.

Przeszukiwanie takich baz danych odbywa się przy użyciu zastrzeżonych technik, które zazwyczaj są całkowicie wolne od SQL.

HTH.

Twoje zdrowie,

Obrabować

Rob Wells
źródło
4
Dlaczego jest tak, że dane stacji bazowej nie nadają się dobrze do modelu relacyjnego?
kaybenleroll
3

Obiektowe bazy danych nie są relacyjnymi bazami danych. Mogą być naprawdę przydatne, jeśli chcesz po prostu umieścić jakieś obiekty w bazie danych. Obsługują również przechowywanie wersji i modyfikują klasy obiektów, które już istnieją w bazie danych. db4o jest pierwszym, który przychodzi na myśl.

Chris de Vries
źródło
3

W niektórych przypadkach (na przykład dane z rynków finansowych i kontrola procesów) może być konieczne użycie bazy danych czasu rzeczywistego zamiast RDBMS. Zobacz link do wiki

Horace
źródło
3

Było narzędzie RAD o nazwie JADE napisane kilka lat temu, które ma wbudowany OODBMS. Wcześniejsze wcielenia silnika DB obsługiwały również Digitalk Smalltalk. Jeśli chcesz przykładowo zbudować aplikację przy użyciu paradygmatu innego niż RDBMS, może to być początek.

Inne produkty OODBMS to Objectivity , GemStone (będziesz potrzebować VisualWorks Smalltalk, aby uruchomić wersję Smalltalk, ale jest też wersja java). W tej przestrzeni było też kilka projektów badawczych typu open-source - na myśl przychodzi EXODUS i jego potomek SHORE.

Niestety, koncepcja wydawała się umrzeć śmiercią, prawdopodobnie z powodu braku wyraźnie widocznego standardu i stosunkowo słabych możliwości wykonywania zapytań ad-hoc w porównaniu z systemami RDMBS opartymi na SQL.

OODBMS jest najbardziej odpowiedni dla aplikacji z podstawowymi strukturami danych, które najlepiej przedstawia się jako wykres połączonych ze sobą węzłów. Zwykłem mówić, że kwintesencją aplikacji OODBMS jest Multi-User Dungeon (MUD), w którym pokoje zawierają awatary graczy i inne obiekty.

ConcernedOfTunbridgeWells
źródło
2
Kiedyś było prawdą, że do korzystania z GemStone / S (dla aplikacji komputerowych) potrzebny był klient Smalltalk, ale z platformami internetowymi Aida ( aidaweb.si ) i Seaside ( seaside.st ) GemStone / S mogą być używane bezpośrednio jako aplikacja serwer. Zobacz informacje o SZKLE ( seaside.gemstone.com )
Dale Henrichs
Innym powodem może być sytuacja, w której zależy Ci na jakości danych. W OODB, takim jak Gemstone, znacznie łatwiej jest egzekwować złożone reguły ważności.
Stephan Eggermont
Możliwości zapytań ad hoc w OODBMS są znacznie lepsze niż w przypadku RDBMS opartych na SQL
Stephan Eggermont
1

Możesz przejść długą drogę, używając plików przechowywanych w systemie plików. RDBMS są coraz lepsze w obsłudze obiektów blob, ale może to być naturalny sposób obsługi danych obrazu i tym podobnych, szczególnie jeśli zapytania są proste (wyliczanie i wybieranie poszczególnych elementów).

Inne rzeczy, które nie pasują zbyt dobrze do RDBMS, to hierarchiczne struktury danych i zgaduję, że dane geoprzestrzenne i modele 3D nie są takie łatwe w obsłudze.

Usługi takie jak Amazon S3 zapewniają prostsze modele pamięci masowej (klucz-> wartość), które nie obsługują SQL. Kluczem jest skalowalność.

Pliki programu Excel również mogą być przydatne, szczególnie jeśli użytkownicy muszą mieć możliwość manipulowania danymi w znanym środowisku i zbudowania pełnej aplikacji, która nie jest do tego wykonalna.

Tomek
źródło
1

Istnieje wiele sposobów przechowywania danych - nawet „relacyjna baza danych” obejmuje szereg alternatyw, od prostej biblioteki kodu, która manipuluje lokalnym plikiem (lub plikami) tak, jakby była relacyjną bazą danych pojedynczego użytkownika, po systemy oparte na plikach, które mogą obsłużyć wielu użytkowników w szerokiej gamie poważnych systemów opartych na serwerze.

Często korzystamy z plików XML - otrzymujesz dobrze ustrukturyzowane dane, fajne narzędzia do wykonywania zapytań, a także możliwość edycji, jeśli jest to konieczne, coś, co jest czytelne dla człowieka i nie musisz się wtedy martwić o działanie silnika bazy danych (ani o działanie silnik db). Działa to dobrze w przypadku rzeczy, które zasadniczo są tylko do odczytu (w naszym przypadku częściej niż nie są generowane z bazy danych w innym miejscu), a także w przypadku systemów pojedynczego użytkownika, w których można po prostu załadować dane i zapisać je w razie potrzeby - ale stwarzasz możliwości na problemy, jeśli chcesz edytować wielu użytkowników - przynajmniej jednego pliku.

Dla nas to wszystko - albo użyjemy czegoś, co wykona SQL (MS oferuje zestaw narzędzi, które działają od .DLL do wykonywania czynności dla pojedynczego użytkownika aż do serwera korporacyjnego i wszystkie mówią tym samym SQL (z ograniczeniami na dole)) lub użyjemy XML jako formatu, ponieważ (dla nas) szczegółowość rzadko jest problemem.

Obecnie nie musimy manipulować danymi binarnymi w naszych aplikacjach, więc to pytanie nie pojawia się.

Murph

Murph
źródło
1

Można rozważyć użycie serwera LDAP zamiast tradycyjnej bazy danych SQL, jeśli dane aplikacji są silnie zorientowane na klucz / wartość i mają charakter hierarchiczny.

Terry Longrie
źródło
1

Pliki BTree są często znacznie szybsze niż relacyjne bazy danych. SQLite zawiera w sobie bibliotekę BTree, która jest w domenie publicznej (jak w prawdziwej „domenie publicznej”, nie używając tego terminu luźno).

Szczerze mówiąc, gdybym chciał mieć system dla wielu użytkowników, potrzebowałbym dużo przekonywania, aby nie używać porządnej relacyjnej bazy danych serwera.

Celestial M. Weasel
źródło
BTrees to podstawowa implementacja normalnych indeksów. Oracle obsługuje tabele zorganizowane według indeksu, które są tylko tabelami zaimplementowanymi jako indeks. Są szybsze do czytania, wolniejsze do pisania i używania B-drzewa. Zobacz: < oracle.com/technology/products/oracle9i/datasheets/iots/… >
borjab
1

Pełnotekstowe bazy danych, do których można przeszukiwać za pomocą operatorów zbliżeniowych, takich jak „w ciągu 10 słów” itp.

Relacyjne bazy danych są idealnym narzędziem biznesowym do wielu celów - wystarczająco łatwe do zrozumienia i zaprojektowania, wystarczająco szybkie, adekwatne, nawet jeśli nie zostały zaprojektowane i zoptymalizowane przez geniusza, który potrafiłby „wykorzystać pełną moc” itp.

Jednak niektóre cele biznesowe wymagają indeksowania pełnotekstowego, którego silniki relacyjne albo nie zapewniają, albo są uwzględniane po namyśle. W szczególności w dziedzinach prawnych i medycznych można przechowywać i przebrnąć przez duże obszary nieustrukturyzowanego tekstu.


źródło
1

Ponadto: * Scenariusze osadzone - tam, gdzie zwykle wymagane jest użycie czegoś mniejszego niż pełnoprawny RDBMS. Db4o to ODB, który można łatwo wykorzystać w takim przypadku. * Szybki rozwój lub weryfikacja koncepcji - gdy chcesz skupić się na biznesie i nie martwić się o warstwę trwałości

Goran
źródło
1

Twierdzenie CAP wyjaśnia to zwięźle. SQL zapewnia głównie „Silną spójność: wszyscy klienci widzą ten sam widok, nawet w obecności aktualizacji”.

Chris de Vries
źródło
1

KISS: Niech to będzie małe i proste

borjab
źródło
1
To jest wersja uprzejma… Częściej słyszałem „Niech to będzie proste, głupie”… albo, łyk, może tak właśnie mówią ludzie! :-(
GreenMatt
1

Oferuję RDBMS :) Jeśli nie będziesz mieć kłopotów z konfiguracją / administracją, wybierz SQLite. Wbudowany RDBMS z pełną obsługą SQL. Pozwala nawet na przechowywanie dowolnego typu danych w dowolnej kolumnie.

Główna zaleta w stosunku do na przykład pliku dziennika: jeśli masz duży plik, jak zamierzasz go wyszukiwać? Dzięki silnikowi SQL po prostu tworzysz indeks i znacznie przyspieszasz działanie.

Informacje o wyszukiwaniu pełnotekstowym: SQLite ma również moduły do ​​wyszukiwania pełnotekstowego.

Po prostu ciesz się ładnym standardowym interfejsem do swoich danych :)

Anton Prokofiev
źródło
0

Jednym z dobrych powodów, aby nie używać relacyjnej bazy danych, jest sytuacja, gdy masz ogromny zestaw danych i chcesz wykonywać masowo równoległe i rozproszone przetwarzanie danych. Idealnym przykładem takiego przypadku byłby indeks internetowy Google.

Hadoop ma również implementację systemu plików Google o nazwie Hadoop Distributed File System .

John Channing
źródło
0

Zdecydowanie poleciłbym Lua jako alternatywę dla przechowywania danych w rodzaju SQLite.

Ponieważ:

  • Język został zaprojektowany od początku jako język opisu danych
  • Składnia jest czytelna dla człowieka (XML nie jest )
  • Aby zwiększyć wydajność, można skompilować fragmenty Lua do postaci binarnej

To jest opcja „zbiór języka ojczystego” zaakceptowanej odpowiedzi. Jeśli używasz C / C ++ jako poziomu aplikacji, całkiem rozsądne jest wrzucenie silnika Lua (100kB binarnego) tylko po to, aby odczytać konfiguracje / dane lub je wypisać.

akauppi
źródło
Lua to język programowania. Sugestię tę można uogólnić, aby zasugerować wszelkie cechy trwałości / serializacji dowolnego języka programowania (na przykład pikle / półka w Pythonie lub JSON / YAML w przypadku Perla i innych itd.). Nie dotyczy to równoczesnego dostępu i gwarancji ACID w ogóle.
Jim Dennis
Masz rację. To, czego brakowało w moim wpisie, to domniemany charakter tego użycia tylko do odczytu. W takim scenariuszu trzymam się swojego tekstu. W przypadku odczytu i zapisu użycie Lua w ten sposób nie ma absolutnie żadnego sensu. Wiele rzeczy, metadane systemu plików są przeważnie tylko do odczytu, więc takie podejście nie oznacza pełnego wymagania ro.
akauppi