Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [mysql][php] Pole typu json, problem z normalizacją
jol.us_
post 18.10.2017, 11:54:36
Post #1





Grupa: Zarejestrowani
Postów: 132
Pomógł: 0
Dołączył: 10.12.2003
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Mam dane json, przykładowo:
  1. {"tytul":"Tytul","kolor":"#ffffff","zdjecie":"test.jpg"}


Zapisuje je do bazy MySQL, do pola typu json.
I po zapisie w polu mam wartość:
  1. {"kolor": "#ffffff", "tytul": "Tytul", "zdjecie": "test.jpg"}


Jak widać przy zapisie dane zostały znormalizowane - posortowane wg. klucza.
Czy da się to jakoś wyłączyć tak aby kolejność kluczy z oryginalnego json została zachowana również w polu tabeli MySQL?

Powyższy json to tylko przykład, w rzeczywistości danych jest więcej i są dynamiczne (różne wartości i kolejności). Dane mają wyświetlane dokładnie wg. tej kolejności jak mam w oryginale - posortowanie przy zapisie to uniemożliwia.

Ten post edytował jol.us_ 18.10.2017, 11:55:48


--------------------
run Forest run ...
Go to the top of the page
+Quote Post
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 19)
nospor
post 18.10.2017, 12:03:59
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




obiektu json NIE posortujesz (mam na mysli ze nie jestes w stanie ustawic wlasnej kolejnosci). Oswoj sie z ta mysla. Jedyne nad czym jestes w stanie zapanowac to numeryczna tablica JSON numerowana od 0 w gore. Kazde inne indeksy to wartosci losowe jesli chodzi o kolejnosc.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
jol.us_
post 18.10.2017, 12:28:04
Post #3





Grupa: Zarejestrowani
Postów: 132
Pomógł: 0
Dołączył: 10.12.2003
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Właśnie mi chodzi o to aby nie były sortowane i zostały zapisane w oryginalnej formie - a MySQL mi je sortuje sam z siebie wg alfabetu.

Funkcja PHP json_encode zamienia tablice na json wg kolejnosci podania zmiennych. Czy nie ma szans by MySQL też zapisał jsona bez normalizowania - czyli tak jak mu go podaje podczas zapisu?

Ten post edytował jol.us_ 18.10.2017, 12:29:07


--------------------
run Forest run ...
Go to the top of the page
+Quote Post
nospor
post 18.10.2017, 12:29:33
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Właśnie mi chodzi o to aby nie były sortowane i zostały zapisane w oryginalnej formie - a MySQL mi je sortuje sam z siebie wg alfabetu
Przeciez ci napisalem: nie idzie ustawic wlasnej kolejnosci indeksow w JSON. NIE i koniec kropka. Jedyna kolejnosc jaka mozna ustawic to dla tablicy numerowanej od 0 - i tyle.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
viking
post 18.10.2017, 12:38:03
Post #5





Grupa: Zarejestrowani
Postów: 6 378
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Zapisz jako tekst (przykładowo mariadb i tak json aliasuje do longtext).


--------------------
Go to the top of the page
+Quote Post
nospor
post 18.10.2017, 12:39:42
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




@viking ale wowczas przy decode i tak dostanie zmieniona kolejnosc. Moze nie za pierwszym razem, moze nie za drugim, ale w koncu dostanie.

Powinien/powinna stworzyc normalny system wyswietlania a nie polegajacy na tej sztucznej kolejnosci.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
jol.us_
post 18.10.2017, 12:45:44
Post #7





Grupa: Zarejestrowani
Postów: 132
Pomógł: 0
Dołączył: 10.12.2003
Skąd: Kraków

Ostrzeżenie: (0%)
-----


No to bryndza sad.gif
Liczyłem, że może da sie to jakoś wyłączyć w konfiguracji bd.


Tablice numerowane mnie nie urządzają bo potem nie będę się mógł do nich odwoływać przez json_extract(pole, '$.klucz')
Dane są dynamiczne, za każdym razem inne, jedynie nazwy kluczy maja znaczenie.

Jakiś pomysł jak sobie z tym poradzić inaczej?
Nie wierze, że tylko ja z tym mam problem.

Może jako osobny obiekt json dawać kolejność, na zasadzie:
  1. {"kolor": "#ffffff", "tytul": "Tytul", "zdjecie": "test.jpg", kolejnosc:[{0:"tytul", 1:"kolor", 2:zdjecie }]}



Cytat(viking @ 18.10.2017, 13:38:03 ) *
Zapisz jako tekst (przykładowo mariadb i tak json aliasuje do longtext).

Tak miałem pierwotnie. I wszystko pięknie działa. Problem mam jednak z wyszukiwaniem. W polach typu json mogę szukać w określonych kluczach, w polu tekstowych już nie.





Cytat(nospor @ 18.10.2017, 13:39:42 ) *
@viking ale wowczas przy decode i tak dostanie zmieniona kolejnosc. Moze nie za pierwszym razem, moze nie za drugim, ale w koncu dostanie.

Hmm... nie spotkałem się.
Zawsze dekoduje mi w tej samej kolejności co ma w obiekcie.

Ten post edytował jol.us_ 18.10.2017, 12:55:41


--------------------
run Forest run ...
Go to the top of the page
+Quote Post
nospor
post 18.10.2017, 12:52:36
Post #8





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Nie wierze,

Tez mialem z tym problem. Rozwiazanie banalne: przestalem polegac na kolejnosci w JSON smile.gif U mnie wystarczylo przejsc na indeksy numeryczne. U ciebie moze sie okazac potrzeba dodania kolejnosci pol.

Cytat
Zawsze dekoduje mi w tej samej kolejności co ma w obiekcie.
Mi tez kiedys kolejnosc ciagle sie zgadzala. Az tu nagle po pol roku sie okazalo, ze mam rzeczy przemieszane. Takze nie, dziekuje smile.gif
No i jak wrzucisz to jak ci proponowal viking to stracisz mozliwosci operacji na obiekcie JSON w bd a widze, ze uzywasz operacji jak json_extract


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
jol.us_
post 18.10.2017, 12:55:17
Post #9





Grupa: Zarejestrowani
Postów: 132
Pomógł: 0
Dołączył: 10.12.2003
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Tak jak proponował @viking już mam. Właśnie chciałem przejść na typ json - ale ta kolejność wszystko mi niweczy.

Generalnie zmiana na klucze numeryczne, gdy mam już wszystko prawie gotowe to będzie właściwie cofnięcie się do początku.
U mnie numeryczne klucze się nie sprawdzą. Muszę znaleźć inny sposób.



Ten post edytował jol.us_ 18.10.2017, 12:57:55


--------------------
run Forest run ...
Go to the top of the page
+Quote Post
trueblue
post 19.10.2017, 07:53:57
Post #10





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Czy oryginalna kolejność oznacza, że raz możesz mieć JSON taki:
  1. {"tytul": "Tytul", "kolor": "#ffffff", "zdjecie": "test.jpg", "kolejnosc":[{"0":"tytul", "1":"kolor", "2":"zdjecie" }]}

a innym razem taki:
  1. {"kolor": "#ffffff", "zdjecie": "test.jpg", "tytul": "Tytul", "kolejnosc":[{"0":"tytul", "1":"kolor", "2":"zdjecie" }]}

, czyli pomimo identycznej zawartości może zdarzyć się inna kolejność?


--------------------
Go to the top of the page
+Quote Post
jol.us_
post 19.10.2017, 08:11:29
Post #11





Grupa: Zarejestrowani
Postów: 132
Pomógł: 0
Dołączył: 10.12.2003
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Cytat(trueblue @ 19.10.2017, 08:53:57 ) *
Czy oryginalna kolejność oznacza, że raz możesz mieć JSON taki:
  1. {"tytul": "Tytul", "kolor": "#ffffff", "zdjecie": "test.jpg", "kolejnosc":[{"0":"tytul", "1":"kolor", "2":"zdjecie" }]}

a innym razem taki:
  1. {"kolor": "#ffffff", "zdjecie": "test.jpg", "tytul": "Tytul", "kolejnosc":[{"0":"tytul", "1":"kolor", "2":"zdjecie" }]}

, czyli pomimo identycznej zawartości może zdarzyć się inna kolejność?


Json'y które zacytowałeś to moja dalsza modyfikacja - próba wymyślenia jak przechowywać kolejność bez kluczy numerycznych.

W pierwszym poście jest przedstawiony problem.
Mam json który ma jakąś kolejność danych, jednak po zapisie do bd (do pola typu json) jest on automatycznie porządkowany i kolejność jest zmieniana - mnie zależy na zachowaniu pierwotnej kolejności.
No ale jak już wyszło - tego się uniknąć nie da.

Wciąż nie wymyśliłem jak to zrobić.
Mój finalny Json może mieć wiele zagnieżdżeń, które również mają mieć zachowaną kolejność. Chyba jednak w tym przypadku pozostanę przy tekstowym przechowywaniu danych.

Ten post edytował jol.us_ 19.10.2017, 08:17:06


--------------------
run Forest run ...
Go to the top of the page
+Quote Post
trueblue
post 19.10.2017, 08:44:12
Post #12





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


No, ale nie odpowiedziałeś na pytanie.
Czy dany klucz raz może być w JSON w indeksie X, a w innym przypadku w indeksie Y. Mówimy o oryginalnym JSON, przed włożeniem do bazy danych.


--------------------
Go to the top of the page
+Quote Post
jol.us_
post 19.10.2017, 10:17:20
Post #13





Grupa: Zarejestrowani
Postów: 132
Pomógł: 0
Dołączył: 10.12.2003
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Generalnie klucze nie są z góry zdefiniowane. Ich kolejność za każdym razem może być inna - cała właśnie zasada działania jest w tym.
Potem kolejność wyświetlania na stronie jest taka sama jak kolejność kluczy.


Obecnie, w uproszczeniu, działa to tak.
Zapis
1. Mam formularz z różnymi polami, które są sortowane przez użytkownika (wraz z zagnieżdżeniami).
2. Wysyłam formularz, a tablice POST traktuje funkcja json_encode i zapisuję do bazy danych - do pola format longtext.
Edycja
1. Odczytuje jsona z bazy danych
2. Parsuje jsona i na jego podstawie generuje formularz edycji w tej samej kolejności i z tymi samymi zagnieżdżeniami

Do tej pory wszystko działało jak należy.


Jednak teraz pojawiła się potrzeba przeszukiwania mojego json po niektórych kluczach - noi tutaj stwierdziłem, że najlepiej będzie jak zmienię typ pola na json i użyje sobie m. in. funkcji json_extract.
Jednak okazało się, że zapisując dane do typu pola json (zamiast do longtext) mysql normalizuje dane i sortuje je wg klucza (alfabetycznie) - przez co niweczy mi całe generowanie formularza edycji.

Ten post edytował jol.us_ 19.10.2017, 10:18:11


--------------------
run Forest run ...
Go to the top of the page
+Quote Post
trueblue
post 19.10.2017, 10:23:03
Post #14





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Ok, czyli każdy JSON traktujemy odrębnie, nawet jeśli klucze będą podobne - nie ma ogólnej zasady pozycji kluczy.

W takim razie obok pola z JSON możesz zapisywać drugi JSON, w którym klucze będą identyczne jak w pierwszym, ale wartościami będą oryginalne indeksy kluczy.
Czyli np. dla:
  1. {"tytul": "Tytul", "kolor": "#ffffff", "zdjecie": "test.jpg"}

drugi JSON będzie taki:
  1. {"tytul": 0, "kolor": 1, "zdjecie": 2}

Kiedy je zapiszesz w bazie, to w pierwszym przypadku stracisz kolejność, ale z drugiego JSON (nawet po przemieszaniu) uzyskasz informacje, na której pozycji był klucz.

Drugi JSON uzyskasz w PHP z wykorzystaniem rekurencji, array_keys i array_flip.


--------------------
Go to the top of the page
+Quote Post
jol.us_
post 19.10.2017, 10:33:03
Post #15





Grupa: Zarejestrowani
Postów: 132
Pomógł: 0
Dołączył: 10.12.2003
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Tak, też zacząłem tak kombinować. Trzymać gdzieś json z kolejnością.
Ale klucze numeryczne muszę nadawać. Do tego dane się zagnieżdżają co mi komplikuje sprawę


--------------------
run Forest run ...
Go to the top of the page
+Quote Post
trueblue
post 19.10.2017, 10:33:42
Post #16





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


W jakim momencie potrzeba Ci tak kolejność? Gdzie ją "wyciągasz"?


--------------------
Go to the top of the page
+Quote Post
jol.us_
post 19.10.2017, 10:35:12
Post #17





Grupa: Zarejestrowani
Postów: 132
Pomógł: 0
Dołączył: 10.12.2003
Skąd: Kraków

Ostrzeżenie: (0%)
-----


1. W formularzu edycji - generując formularz danych w tej samej kolejności
2. Wyświetlając na froncie dane w tej samej kolejności


--------------------
run Forest run ...
Go to the top of the page
+Quote Post
trueblue
post 19.10.2017, 10:40:23
Post #18





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


W takim razie możesz przechowywać oryginalną kopię JSON w polu TEXT (bez CAST'owania na JSON przy wyciąganiu danych) na podstawie, której uzyskasz informacje o kolejności.

Jeśli jednak się zdecydujesz na powyższe rozwiązanie, to tak jak pisałem, używasz rekurencji - wtedy nie będzie problemu z zagnieżdżonymi danymi.


--------------------
Go to the top of the page
+Quote Post
jol.us_
post 19.10.2017, 10:44:22
Post #19





Grupa: Zarejestrowani
Postów: 132
Pomógł: 0
Dołączył: 10.12.2003
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Trzymanie 2 razy danych to mało eleganckie.
Wiem, że trzymanie kolejności to jedyne wyjście.

Będę się musiał z tym zmierzyć.


--------------------
run Forest run ...
Go to the top of the page
+Quote Post
trueblue
post 19.10.2017, 10:49:49
Post #20





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Zawsze możesz wybierać wszystkie rekordy, a warunek dla JSON umieścić już po stronie skryptu. Ale czy to będzie bardzie eleganckie? Czasem redundancji danych nie da się uniknąć.

Czekaj czekaj.
Jeśli dobrze zrozumiałem, to jest tak jak wyżej. Czyli JSON_EXTRACT używasz w WHERE, tak?
W takim razie przechowuj JSON w polu TEXT, a dla potrzeb WHERE i JSON_EXTRACT użyj CAST na tym polu. Wyselekcjonujesz odpowiednie rekordy, a JSON nadal będzie w oryginalnej postaci.
Jeśli mój tok rozumowania jest niepoprawny, to wyjaśnij proszę w jakim celu na poziomie zapytania używasz JSON_EXTRACT.

Ten post edytował trueblue 19.10.2017, 10:52:54


--------------------
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 18.07.2025 - 18:37