|
Набор данных с иерархическими данными в json
|
|||
---|---|---|---|
#18+
Всем привет! У меня вьюха с данными которые из себя представляет типа дерево(id, parent_id). Как мне лучше перевести эти данные в json. Чтобы получилось типа {"table_id": 0, "branch": "Данные по абоненту", ...., [{"table_id": 1, "branch": "Начисления", ...}, {}, ...]} Хочу строить на основе этого дерево в Qt. Заранне спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2017, 23:24 |
|
Набор данных с иерархическими данными в json
|
|||
---|---|---|---|
#18+
вот скрин данных ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2017, 23:29 |
|
Набор данных с иерархическими данными в json
|
|||
---|---|---|---|
#18+
with recursive dake в Qt. ну и делай "дерево" на клиенте из тех данных, что есть. зачем гонять из пустого в порожнее на стороне сервера. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2017, 01:20 |
|
Набор данных с иерархическими данными в json
|
|||
---|---|---|---|
#18+
авториз пустого в порожнее ну почему сразу так...я думаю вполне приемлимо... а на клиенте простым обходом этой json-структры можно легко построить дерево) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2017, 08:06 |
|
Набор данных с иерархическими данными в json
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2017, 15:59 |
|
Набор данных с иерархическими данными в json
|
|||
---|---|---|---|
#18+
LeXa NalBatнагуглил http://bender.io/2013/09/22/returning-hierarchical-data-in-a-single-sql-query/ В примере: Код: plsql 1.
агрегируются в массив только одноуровневые проекты, а у автора, на сколько я понимаю, массивы в JSON могут включать данные с массивами. Без рекурсии такую сборку на SQL не сделать, а рекурсивные запросы Postgres агрегатные функции не понимают. Чтобы собрать JSON одним запросом (скриптом), можно использовать DO..., в котором обычным циклом собираем JSON, куда-то его сохраняем (PREPARE). После DO... получаем результат через обычный SELECT... Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2017, 16:14 |
|
Набор данных с иерархическими данными в json
|
|||
---|---|---|---|
#18+
sereginseregin, согласен, в рекурсивной части не получается вызвать агрегатную функцию... немного не понял по твоему подходу... что значит авторв котором обычным циклом собираем JSON и все остальное можешь пояснить ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2017, 15:41 |
|
Набор данных с иерархическими данными в json
|
|||
---|---|---|---|
#18+
dakesereginseregin, авторв котором обычным циклом собираем JSON и все остальное можешь пояснить Конечно такое лучше готовым скриптом показать, но времени нет его отрабатывать: 1. Выбираем в начальный МАССИВ (JSON элементов) записи у которых нет дочерних 2. В цикле, пока новые родительские записи по МАССИВУ отбираются: 2.1. добавляем в МАССИВ родительские записи с вложенными дочерними 3. Фильтруем полученный МАССИВ (JSON элементов), отбирая только те записи, у которых нет родителей. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2017, 15:08 |
|
Набор данных с иерархическими данными в json
|
|||
---|---|---|---|
#18+
sereginseregin2. В цикле, пока новые родительские записи по МАССИВУ отбираются: 2.1. добавляем в МАССИВ родительские записи с вложенными дочерними в plpgsql это дорого. (именно поэтому реализованы агрегаты типа str_agg() и array_agg() ) //если что-то тут изменилось -- прошу all поправить. т.е. рекомендую попробовать это сделать в немного другом pl . или вернуться к рек-ции p2 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2017, 16:42 |
|
Набор данных с иерархическими данными в json
|
|||
---|---|---|---|
#18+
sereginseregin2. В цикле, пока новые родительские записи по МАССИВУ отбираются: 2.1. добавляем в МАССИВ родительские записи с вложенными дочерними Порядок обхода записей пришлось усложнить qwwqв plpgsql это дорого. (именно поэтому реализованы агрегаты типа str_agg() и array_agg() ) без array_agg() никуда, но все равно сборка в JSON сложная и дорогая. Цикл нужен для эмуляции рекурсии. Добил код, интересны Ваши замечания: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2017, 16:54 |
|
Набор данных с иерархическими данными в json
|
|||
---|---|---|---|
#18+
вообщем решил вопрос рекурсивной функцией CREATE OR REPLACE FUNCTION storage.get_tree_json ( p_id bigint = 1 ) RETURNS jsonb AS $body$ declare node record; res jsonb; childs jsonb; begin /* получение данных для определенного(current) узла*/ select row_to_json(t) into res from storage.view_abn_tree t where t.id = p_id; childs:= '[]'::jsonb; /*перебираем дочерние узлы*/ for node in select * from storage.view_abn_tree t where t.parent_id = p_id loop /*рекурсивный вызов нашей функции для дочерних узлов*/ select jsonb_set(childs, format('{%s}', node.id)::text[], storage.get_tree_json(node.id), true) into childs; end loop; /* полученный на выходе из рекурсивного вызова json-массив с дочерними узлами добавляем в данные current узла*/ select jsonb_set(res, '{childs}', childs, true) into res; return res; end; $body$ LANGUAGE 'plpgsql' VOLATILE на мой взгляд довольно таки элгегантно)) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2017, 14:41 |
|
Набор данных с иерархическими данными в json
|
|||
---|---|---|---|
#18+
может быть получится и через рекурсивную функцию на SQL, а не на PL/PGSQL ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2017, 16:07 |
|
Набор данных с иерархическими данными в json
|
|||
---|---|---|---|
#18+
dakeвообщем решил вопрос рекурсивной функцией... Провел экстремальное тестирование твоего и своего вариантов с глубоким вложением элементов для таблицы: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
У тебя до 2 сек, но для id>900 не работает, требует увеличить "max_stack_depth" (currently 2048kB). У меня в 20 раз оказался медленнее из-за множества вложенных запросов, что естественно надо оптимизировать. Нашел у себя косяк, строку в 2.2: Код: plsql 1.
заменить на: Код: plsql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2017, 15:06 |
|
Набор данных с иерархическими данными в json
|
|||
---|---|---|---|
#18+
sereginsereginПровел экстремальное тестирование полный скрипт теста от генерации таблиц и данных приведите , пжлст тут есть например спойлеры -- для простынок. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2017, 15:48 |
|
Набор данных с иерархическими данными в json
|
|||
---|---|---|---|
#18+
[quot qwwq] полный скрипт теста от генерации таблиц и данных приведите Скрипт тестирования кода sereginseregin Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73.
Скрипт тестирования кода dake из функции убрал схему storage, чтоб на временную таблицу с именем view_abn_tree ссылаться: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
сам тест: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2017, 16:06 |
|
Набор данных с иерархическими данными в json
|
|||
---|---|---|---|
#18+
Из двух вариантов самый быстрый и простой третий, с определением уровня вложенности: 1. Закидываем все записи во временный массив JSONB с указанием уровня вложенности 2. Цикл по уровням вложенности от MAX до 0 2.1. Вкладываем крайние дочерние элементы в родительские (текущего уровня) Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2017, 08:01 |
|
|
start [/forum/topic.php?fid=53&msg=39477792&tid=1996404]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
34ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
others: | 327ms |
total: | 453ms |
0 / 0 |