и detail связанные один ко многим. Мы хотим данные в detail упаковать в массив и положить в одну таблицу с master в Clickhouse. И вот я на распутье какую структуру выбрать: Array Nested (...) или Array(Tuple())?
В первом случае все колонки таблицы detail выглядят как отдельные колонки-массивы. Во втором - это массив кортежей.
Провел разные эксперименты. Объем занимаемого места одинаковый в обоих вариантах, производительность запросов тоже идентична. Способы работы с данными примерно одинаковы. Может есть какие то подводные камни о которых не написано в документации? Какую же структуру все таки выбрать?
Nested сам по себе массив, его заворачивать в Array не нужно
Берите tuple и не парьтесь, потом проще будет.
Какие могут возникнуть трудности с nested? Я в своё время выбрал его и пока не столкнулся с тем, что tuple был бы проще...
Нашел один минус у tuple. Нет возможности изменить структуру, например добавить колонку. В случае с Nested - без проблем alter table add column и новая колонка встраивается в структуру nested. Но думаю это можно обойти созданием новой структуры tuple и миграцией данных из старой.
Алексей, а можно поподробнее, в чем nested оказался сложнее? Мне структура tuple больше по душе. Как то более понятно выглядит. Но вот что скажут архитекторы кликхауза?
В release 23.8 LTS, 2023-08-31 появился tupleConcat https://clickhouse.com/docs/en/sql-reference/functions/tuple-functions
Мне просто проще работать с tuple, воспринимаешь его как псевдомассив. А с Nested надо заморачиваться со столбцами, не гибко как то...
Для меня nested оказался вполне удобным. В кортеже нужно постоянно высчитывать индексы, а в нестед просто по именам пишу. Плюс у меня нестед вложенные, с вложенными кортежами было бы ну очень трудно разбираться в запросах.
с нестедом точно так же можно работать как с кортежем. т.е. обращаться к полям по номерам. а вот с кортежем по именам не обратиться.
Да, тоже заметил эту особенность. Если в запросе array join добавить алиас к структуре tuple, то потом к элементам этой структуры можно обратиться только по индексу. А если без алиаса, то вполне имена прокатывают. Вот пример: CREATE TABLE default.test_array_tuple_s ( id UInt32, transaction_conduction Array(Tuple( id Int16, name Nullable(String) )) ) ENGINE = MergeTree() ORDER BY id; SELECT transaction_conduction.name FROM test_array_tuple_s; SELECT t.transaction_conduction.2 FROM test_array_tuple_s t;
Обсуждают сегодня