2011-09-29 19 views
5

php jak przechowywać i czytać dane json za pośrednictwem mysql?php jak przechowywać i czytać dane json za pośrednictwem mysql?

mysql_query("INSERT INTO text (data) VALUES (json_encode('id' => $uid, 'value' => yes))"); 

następnie, jak zaktualizować wartość data? odczytać dane, a następnie wstawić je za pomocą procesu json_encode i dekodowania lub tylko w łatwy sposób zaktualizować?

[{"id": "1", "value": "yes"}] 

następnie wstawić kolejną zmianę do [{"id": "1", "value": "yes"},{"id": "2", "value": "yes"}] ...

Albo nawet jeśli długo długo wartość.

[{"id": "1", "value": "yes"},{"id": "2", "value": "yes"}...{"id": "10000", "value": "yes"}]

następnie zaktualizować innego, zmienić [{"id": "1", "value": "yes"},{"id": "2", "value": "yes"}...{"id": "10000", "value": "yes"},{"id": "10001", "value": "yes"}]

Chcę zapytać, jak to zrobić mysql przetwarzania zapytań mądrzejszy i bardziej efektywnie? Dzięki za więcej sugestii.

Odpowiedz

22

Technicznie idziesz w niewłaściwą stronę. MySQL służy do oddzielnego przechowywania każdego ID/WARTOŚCI. Dla NIE zmiany twojego kodu najpierw przyjrzymy się Twojemu rozwiązaniu, ale wtedy wytłumaczę "lepszy" sposób na zrobienie tego.

Po pierwsze, trzeba dokonać JSON jako zmienna, a nie część swojej SQL:

mysql_query("INSERT INTO text (data) VALUES (".mysql_real_escape_string(json_encode('id' => $uid, 'value' => yes)).")");

zamiast

mysql_query("INSERT INTO text (data) VALUES (json_encode('id' => $uid, 'value' => yes))");

Ta pierwsza część pozwoli Ci na najmniej zamiast tego poprawnie dane do mysql. jestem zakładając, że stół ma identyfikator i że będzie go używał, aby zaktualizować lub usunąć

Podczas pobierania danych, można json_decode do $ row [ „danych”], aby uzyskać dane z powrotem z rzędu i pracować z nim. Aby zaktualizować, po prostu zrobić:

mysql_query("UPDATE text SET data = "'.mysql_real_escape_string(json_encode($myJsonToBeData)).'" WHERE rowid = '.$myrowid)

Teraz, właściwy sposób to zrobić:

Prawo sposobem na to byłoby mieć te pola w tabeli: ID, JSONID, JSONVALUE i używać tej SQL zamiast:

SELECT * FROM text WHERE id = $rowid INSERT INTO text VALUES(NULL, $jsonid, $jsonvalue) UPDATE text SET jsonid = $jsonid, jsondata = $jsondata

jest to dość proste, ale pozwoli Ci mieć dowolną liczbę wpisów w databas Dzięki temu można go przeszukiwać, indeksować, sortować, wyświetlać, itp.

+7

+1 za przestrzeganie żądania PO ORAZ wskazanie właściwej drogi. – Herbert

+1

Wierzę, że istnieje dodatkowy pojedynczy cytat w twoim pierwszym przykładzie kodu. – CervEd

2

Możesz to zrobić bardziej efektywnie, NIE przechowując JSON w jednym polu, ale tworząc właściwą tabelę MySQL z nazwami właściwości obiektu JSON jako nazwami pól.

Przechowywanie zakodowanej w postaci ciągu znaków reprezentacji danych w bazie danych całkowicie niszczy punkt korzystania z baz danych w pierwszej kolejności.

+0

MongoDb używa binarnego formatu pamięci JSON. Więc nie zgadzam się z twoim drugim punktem, że przechowywanie danych w JSON jest złym pomysłem. W przypadku MySQL (i innych zarażeń sql) Twój punkt jest prawidłowy. –

+1

Pytanie (i moja odpowiedź) dotyczy w szczególności MySQL i przechowywania danych zakodowanych jako ciąg JSON. Co więcej, jak sam powiedziałeś, MongoDb przechowuje "JSON" jako obiekty binarne, a nie jako ciągi JSON, więc przechowywanie "JSON" w MongoDb NIE zapisuje danych zakodowanych jako ciąg (który jest wciąż złym zwyczajem i zrywa [normalizację bazy danych] (http : //en.wikipedia.org/wiki/Database_normalisation)). – megaflop

2

Tak, ale ... WordPress przechowuje wiele swoich danych jako zakodowane ciągi JSON, takie jak możliwości użytkownika.Przechowywanie tablicy jako dyskretnego fragmentu danych zabiera konieczność wielokrotnego czytania w bazie danych i pozwala uzyskać wiele danych podczas jednego odczytu. Jeśli nigdy nie widzisz potrzeby SELECT poszczególnych części łańcucha JSON, nie rozumiem, dlaczego nie można tego robić w ten sposób. MySQL musi tak myśleć, ponieważ ma funkcje umożliwiające SELECT na poszczególnych polach w ciągu JSON, jeśli sobie tego życzysz (zobacz słowo kluczowe MySQL EXPLAIN). Ale zgadzam się, jeśli zamierzałeś zrobić wiele SELECT'ów na polu, które powinno mieć jedno z nich. Wszystko zależy od tego, w jaki sposób zamierzasz korzystać z danych.

+0

Wordpress nie przechowuje dużej ilości danych jako ciągi json, używa wewnętrznego mechanizmu serializacji/unserializacji :) –

+0

@Mathieu - Powiedziałem, że był "kodowany JSON", co oznacza używając searchialize/unserialize. Spójrz na słowo kluczowe EXPLAIN w MySQL. – KoZm0kNoT

Powiązane problemy