Myślałem, że to rzecz n00b. Dlatego nigdy tego nie robiłem. Potem zobaczyłem, że FriendFeed to zrobił i faktycznie poprawił ich skalę DB i zmniejszył opóźnienie. Ciekaw jestem, czy powinienem to zrobić. A jeśli tak, to jak to zrobić?
Zasadniczo, jakie jest dobre miejsce, aby dowiedzieć się, jak przechowywać wszystko w MySQL jako rodzaj bazy danych CouchDB? Przechowywanie wszystkiego w formacie JSON wydaje się być łatwiejsze i szybsze (nie budować, mniej opóźnień).
Czy łatwo jest edytować, usuwać itp. Rzeczy przechowywane w bazie danych jako JSON?
Odpowiedzi:
CouchDB i MySQL to dwie bardzo różne bestie. JSON to natywny sposób przechowywania rzeczy w CouchDB. W MySQL najlepsze, co możesz zrobić, to przechowywać dane JSON jako tekst w jednym polu. To całkowicie zniweczyłoby cel przechowywania go w RDBMS i znacznie skomplikowałoby każdą transakcję w bazie danych.
Nie.
Powiedziawszy to, FriendFeed zdawał się używać wyjątkowo niestandardowego schematu oprócz MySQL. To naprawdę zależy od tego, co dokładnie chcesz przechowywać, nie ma jednej jednoznacznej odpowiedzi, jak nadużywać systemu baz danych, więc ma to dla Ciebie sens. Biorąc pod uwagę, że artykuł jest bardzo stary, a ich głównym powodem przeciwko Mongo i Couch była niedojrzałość, ponownie oceniłbym te dwa artykuły, jeśli MySQL nie zrobi tego za Ciebie. Powinni byli już dużo urosnąć.
źródło
Wydaje się, że wszyscy komentujący podchodzą do tego z niewłaściwego punktu widzenia, dobrze jest przechowywać kod JSON przez PHP w relacyjnej bazie danych i w rzeczywistości ładowanie i wyświetlanie złożonych danych będzie szybsze, jednak będziesz mieć względy projektowe, takie jak wyszukiwanie, indeksowanie itp.
Najlepszym sposobem na to jest użycie danych hybrydowych, na przykład jeśli potrzebujesz wyszukiwania w oparciu o datę i godzinę MySQL (dostrojona wydajność) będzie dużo szybsze niż PHP, a dla czegoś takiego jak wyszukiwanie odległości lokalizacji MySQL powinien również być dużo szybciej (zauważ, że wyszukiwanie nie ma dostępu). Dane, których nie musisz szukać, mogą być następnie przechowywane w formacie JSON, BLOB lub innym formacie, który naprawdę uznasz za potrzebny.
Dane, do których potrzebujesz dostępu, są bardzo łatwo przechowywane jako JSON, na przykład podstawowy system fakturowania dla poszczególnych przypadków. Nie korzystają zbytnio z RDBMS i mogą być przechowywane w JSON po prostu przez json_encoding ($ _ POST ['entires']), jeśli masz poprawną strukturę formularza HTML.
Cieszę się, że jesteś zadowolony z korzystania z MongoDB i mam nadzieję, że nadal będzie ci dobrze służyć, ale nie myśl, że MySQL zawsze będzie poza zasięgiem twojego radaru, ponieważ twoja aplikacja staje się coraz bardziej złożona, możesz potrzebować RDBMS dla niektóre funkcje i funkcje (nawet jeśli służą tylko do wycofywania zarchiwizowanych danych lub raportowania biznesowego)
źródło
MySQL 5.7 obsługuje teraz natywny typ danych JSON podobny do MongoDB i innych magazynów danych dokumentów bez schematów:
Więcej informacji:
https://dev.mysql.com/doc/refman/5.7/en/json.html
źródło
json nie jest niczym specjalnym, jeśli chodzi o przechowywanie, takie znaki jak
{
,}
,[
,]
,'
,a-z
,0-9
.... to naprawdę nic specjalnego i mogą być przechowywane jako tekst.pierwszy problem, jaki będziesz mieć, jest taki
{profile_id: 22, nazwa użytkownika: „Robert”, hasło: „skhgeeht893htgn34ythg9er”}
który przechowywany w bazie danych nie jest tak prosty do aktualizacji, chyba że masz własne postępowanie i opracowałeś kod jsondecode dla mysql
Ponieważ nie możesz tego zrobić, musisz najpierw WYBRAĆ plik json, zdekodować go, zmienić, zaktualizować, więc teoretycznie równie dobrze możesz poświęcić więcej czasu na tworzenie odpowiedniej struktury bazy danych!
Używam json do przechowywania danych, ale tylko metadane, dane, które nie są często aktualizowane, niezwiązane z konkretnym użytkownikiem .. przykład, jeśli użytkownik dodaje post, a w tym poście dodaje obrazy źle analizuje obrazy i tworzy kciuki i następnie użyj adresów URL kciuków w formacie json.
źródło
Aby zilustrować, jak trudno jest uzyskać dane JSON za pomocą zapytania, udostępnię zapytanie, które wykonałem, aby to obsłużyć.
Nie bierze pod uwagę tablic ani innych obiektów, tylko podstawowe typy danych. Powinieneś zmienić 4 wystąpienia kolumny na nazwę kolumny przechowującej JSON i zmienić 4 wystąpienia myfield na pole JSON, do którego chcesz uzyskać dostęp.
źródło
To naprawdę zależy od twojego przypadku użycia. Jeśli przechowujesz informacje, które nie mają absolutnie żadnej wartości w raportowaniu i nie będą odpytywane za pośrednictwem JOIN z innymi tabelami, może mieć sens przechowywanie danych w jednym polu tekstowym, zakodowanym jako JSON.
Może to znacznie uprościć model danych. Jednak, jak wspomniał RobertPitt, nie spodziewaj się, że będziesz w stanie połączyć te dane z innymi danymi, które zostały znormalizowane.
źródło
To jest stare pytanie, ale nadal widzę je na górze wyników wyszukiwania Google, więc myślę, że sensowne byłoby dodanie nowej odpowiedzi 4 lata po zadaniu pytania.
Przede wszystkim istnieje lepsza obsługa przechowywania JSON w RDBMS. Możesz rozważyć przejście na PostgreSQL (chociaż MySQL obsługuje JSON od wersji 5.7.7). PostgreSQL używa bardzo podobnych poleceń SQL jak MySQL, z wyjątkiem tego, że obsługują więcej funkcji. Jedną z dodanych przez nich funkcji jest to, że zapewniają typ danych JSON i możesz teraz wysyłać zapytania do przechowywanych JSON. ( Trochę informacji na ten temat ) Jeśli nie tworzysz zapytania bezpośrednio w swoim programie, na przykład używając PDO w php lub elokwencji w Laravel, wszystko, co musisz zrobić, to po prostu zainstalować PostgreSQL na swoim serwerze i zmienić ustawienia połączenia z bazą danych. Nie musisz nawet zmieniać swojego kodu.
W większości przypadków, jak sugerowały inne odpowiedzi, przechowywanie danych jako JSON bezpośrednio w RDBMS nie jest dobrym pomysłem. Jest jednak pewien wyjątek. Jedna sytuacja, o której przychodzi mi do głowy, to pole ze zmienną liczbą powiązanych wpisów.
Na przykład, aby zapisać znacznik posta na blogu, zwykle będziesz potrzebować tabeli na post na blogu, tabeli znaczników i pasującej tabeli. Tak więc, gdy użytkownik chce edytować post i chcesz wyświetlić, który tag jest powiązany z tym postem, będziesz musiał odpytać 3 tabele. Spowoduje to znaczne obniżenie wydajności, jeśli pasująca tabela / tabela tagów jest długa.
Przechowując tagi jako JSON w tabeli postów na blogu, ta sama czynność wymaga przeszukiwania tylko jednej tabeli. Dzięki temu użytkownik będzie mógł szybciej edytować wpis na blogu, ale spowoduje to pogorszenie wydajności, jeśli chcesz sporządzić raport o tym, który post jest powiązany z tagiem, lub może wyszukiwać według tagu.
Możesz także spróbować cofnąć normalizację bazy danych. Duplikując dane i przechowując je w obie strony, możesz skorzystać z obu metod. Będziesz potrzebował tylko trochę więcej czasu na przechowywanie danych i więcej miejsca (co jest tanie w porównaniu z kosztem większej mocy obliczeniowej)
źródło
Powiedziałbym, że jedyne dwa powody, dla których warto to rozważyć, to:
O swoim podejściu napisałem trochę tutaj:
Jakie problemy ze skalowalnością napotkałeś podczas korzystania z magazynu danych NoSQL?
(zobacz górną odpowiedź)
Nawet JSON nie był wystarczająco szybki, więc zastosowaliśmy podejście do niestandardowego formatu tekstu. Pracował / nadal działa dobrze dla nas.
Czy jest powód, dla którego nie używasz czegoś takiego jak MongoDB? (może być MySQL jest „wymagany”; po prostu ciekawy)
źródło
Wydaje mi się, że każdemu, kto odpowiada na to pytanie, w pewnym sensie brakuje jednej krytycznej kwestii, z wyjątkiem @deceze - użyj odpowiedniego narzędzia do pracy . Możesz zmusić relacyjną bazę danych do przechowywania prawie każdego rodzaju danych i możesz zmusić Mongo do obsługi danych relacyjnych, ale jakim kosztem? W końcu wprowadzasz złożoność na wszystkich poziomach rozwoju i konserwacji, od projektu schematu po kod aplikacji; nie wspominając o przeboju wydajności.
W 2014 roku mamy dostęp do wielu serwerów bazodanowych, które wyjątkowo dobrze radzą sobie z określonymi typami danych.
Jestem pewien, że brakowało mi innych, takich jak RabbirMQ i Cassandra. Chodzi mi o to, użyj odpowiedniego narzędzia do danych, które chcesz przechowywać.
Jeśli Twoja aplikacja wymaga przechowywania i pobierania różnych danych naprawdę, bardzo szybko (a kto tego nie robi), nie wahaj się korzystać z wielu źródeł danych dla aplikacji. Najpopularniejsze frameworki internetowe obsługują wiele źródeł danych (Rails, Django, Grails, Cake, Zend, itp.). Ta strategia ogranicza złożoność do jednego określonego obszaru aplikacji, ORM lub interfejsu źródła danych aplikacji.
źródło
Oto funkcja, która zapisuje / aktualizuje klucze tablicy JSON w kolumnie i inna funkcja, która pobiera wartości JSON. Te funkcje są tworzone przy założeniu, że nazwa kolumny przechowywania tablicy JSON to json . Używa PDO .
Funkcja zapisu / aktualizacji
gdzie $ uid to identyfikator użytkownika, $ key - klucz JSON do aktualizacji, a jego wartość to $ val .
Funkcja Get Value
gdzie $ key to klucz tablicy JSON, z którego potrzebujemy wartości.
źródło
SELECT FOR UPDATE
lub wersjonowanie w danych JSON.SELECT FOR UPDATE
aby była lepsza. Nie wiem, jak go używać.Wczesne wsparcie dla przechowywania JSON w MySQL zostało dodane do wersji MySQL 5.7.7 JSON Labs ( pliki binarne Linux , źródło )! Wydaje się, że to wydanie wyrosło z serii funkcji zdefiniowanych przez użytkownika związanych z JSON, które zostały upublicznione w 2013 roku .
Ta rodząca się natywna obsługa JSON wydaje się zmierzać w bardzo pozytywnym kierunku, w tym walidacja JSON na INSERT, zoptymalizowanym formacie binarnym, w tym tablica przeglądowa w preambule, która pozwala funkcji JSN_EXTRACT na wykonywanie wyszukiwań binarnych zamiast analizowania przy każdym dostępie. Jest też cała masa nowych funkcji do obsługi i odpytywania określonych typów danych JSON:
IMHO, powyższe jest doskonałym przykładem użycia tej nowej funkcji; wiele baz danych SQL ma już tabelę użytkownika i zamiast dokonywać niekończących się zmian schematu w celu dostosowania do zmieniającego się zestawu preferencji użytkownika, posiadanie pojedynczej kolumny JSON w pobliżu
JOIN
jest idealne. Zwłaszcza, że jest mało prawdopodobne, aby kiedykolwiek trzeba było zapytać o poszczególne elementy.Chociaż to dopiero początek, zespół serwer MySQL robią wielkie zadanie komunikowanie zmian na tym blogu .
źródło
Uważam, że przechowywanie JSON w bazie danych mysql w rzeczywistości udaremnia cel używania RDBMS w takiej postaci, w jakiej ma być używany. Nie użyłbym go w żadnych danych, które w pewnym momencie zostałyby zmanipulowane lub zgłoszone, ponieważ nie tylko zwiększa złożoność, ale także może łatwo wpłynąć na wydajność w zależności od tego, w jaki sposób jest używany.
Byłem jednak ciekawy, czy ktoś inny wymyślił możliwy powód, aby to zrobić. Myślałem o zrobieniu wyjątku dla celów logowania. W moim przypadku chcę rejestrować żądania, które mają zmienną liczbę parametrów i błędów. W tej sytuacji chcę użyć tabel dla typu żądań, a samych żądań z ciągiem JSON o różnych uzyskanych wartościach.
W powyższej sytuacji żądania są rejestrowane i nigdy nie są przetwarzane ani indeksowane w polu ciągu JSON. JEDNAK, w bardziej złożonym środowisku, prawdopodobnie spróbuję użyć czegoś, co ma większe znaczenie dla tego typu danych i przechowywać je w tym systemie. Jak powiedzieli inni, to naprawdę zależy od tego, co próbujesz osiągnąć, ale przestrzeganie standardów zawsze pomaga w długowieczności i niezawodności!
źródło
JSON jest poprawnym typem danych również w bazie danych PostgreSQL. Jednak baza danych MySQL nie obsługuje jeszcze oficjalnie formatu JSON. Ale to pieczenie: http://mysqlserverteam.com/json-labs-release-native-json-data-type-and-binary-format/
Zgadzam się również, że istnieje wiele ważnych przypadków, w których niektóre dane powinny być serializowane do łańcucha w bazie danych. Głównym powodem może być to, że nie są regularnie odpytywane, a jego własny schemat może się zmienić - nie chcesz zmieniać odpowiadającego mu schematu bazy danych. Drugim powodem jest to, że jeśli serializowany ciąg pochodzi bezpośrednio ze źródeł zewnętrznych, możesz nie chcieć analizować ich wszystkich i podawać do bazy danych za wszelką cenę, dopóki nie użyjesz żadnego. Będę więc czekał na nową wersję MySQL obsługującą JSON, ponieważ wtedy będzie łatwiej przełączać się między różnymi bazami danych.
źródło
Używam json do nagrywania czegokolwiek dla projektu, w rzeczywistości używam trzech tabel! jeden dla danych w json, jeden dla indeksu wszystkich metadanych struktury json (każda meta jest kodowana przez unikalny identyfikator) i jeden dla użytkownika sesji, to wszystko. Benchmark nie może być określony ilościowo w tym wczesnym stanie kodu, ale na przykład byłem widokami użytkowników (sprzężenie wewnętrzne z indeksem), aby uzyskać kategorię (lub cokolwiek, jako użytkownik, ...) i było to bardzo wolne (bardzo, bardzo wolne , używany widok w mysql nie jest dobrym sposobem). Moduł wyszukiwania w tej strukturze może zrobić wszystko, co chcę, ale myślę, że mongodb będzie bardziej wydajny w tej koncepcji pełnego rekordu danych json. Na przykład używam widoków, aby utworzyć drzewo kategorii i menu nawigacyjne, mój Boże! tak wiele zapytań do zrobienia! sam apacz zniknął! i faktycznie na tej małej stronie używam php, który generuje drzewo i bułkę tartą, ekstrakcja danych jest wykonywana przez moduł wyszukiwania (który używa tylko indeksu), tabela danych służy tylko do aktualizacji. Jeśli chcę, mogę zniszczyć wszystkie indeksy i zregenerować je z każdym danymi i wykonać odwrotną pracę, aby na przykład zniszczyć wszystkie dane (json) i ponownie je wygenerować tylko z tabelą indeksów. Mój projekt jest młody, działa pod php i mysql, ale czasami myślę, że używanie node js i mongodb będzie bardziej wydajne w tym projekcie.
Użyj json, jeśli myślisz, że możesz to zrobić, po prostu zrób to, ponieważ możesz! i zapomnij o tym, jeśli to był błąd; spróbuj dokonać dobrego lub złego wyboru, ale spróbuj!
Niska
francuski użytkownik
źródło
Wiem, że jest to naprawdę późno, ale miałem podobną sytuację, w której zastosowałem podejście hybrydowe polegające na utrzymywaniu standardów RDBMS polegających na normalizowaniu tabel do pewnego punktu, a następnie przechowywaniu danych w JSON jako wartości tekstowej poza tym punktem. Na przykład przechowuję dane w 4 tabelach zgodnie z zasadami normalizacji RDBMS. Jednak w czwartej tabeli, aby dostosować dynamiczny schemat, przechowuję dane w formacie JSON. Za każdym razem, gdy chcę pobrać dane, pobieram dane JSON, analizuję je i wyświetlam w Javie. Jak dotąd działało to dla mnie i zapewniam, że nadal jestem w stanie indeksować pola, które przekształcam w dane JSON w tabeli w znormalizowany sposób przy użyciu ETL. Gwarantuje to, że podczas pracy z aplikacją użytkownik napotyka minimalne opóźnienia, a pola są przekształcane do formatu przyjaznego dla RDBMS do analizy danych itp.
źródło
Możesz użyć tego sedna: https://gist.github.com/AminaG/33d90cb99c26298c48f670b8ffac39c3
Po zainstalowaniu go na serwerze (potrzebujesz tylko uprawnień roota, a nie super), możesz zrobić coś takiego:
select extract_json_value('{"a":["a","2"]}','(/a)')
To zwróci
a 2
. Możesz zwrócić wszystko wewnątrz JSON, używając tego. Dobra część jest taka, że obsługuje MySQL 5.1,5.2,5.6. I nie musisz instalować żadnych plików binarnych na serwerze.Oparty na starym projekcie
common-schema
, ale nadal działa dzisiaj https://code.google.com/archive/p/common-schema/źródło