элементов из массива используя входящий массив?
Дано: таблица в котороый одно из полей - массив строк. Необходимо сделать UPDATE и удалить все строки переданные в другом массиве. Массивы ориентировочно не будут сильно большими, но могут быть до 150-200 элементов.
Да просто UPDATE a_table SET a_field = some_function(a_field, $1) WHERE .... Т.е. легче написать функцию разности массивов, и использовать её, мне кажется.
понял, спасибо, тоже пришел к такому варианту - но решил на всякий случай спросить - а то выстрелю еще себе в ногу :)
Неправильный способ: сделать unnest, подразумеваемый в нём lateral join, отфильтровать нужное, затем сгруппировать по pkey обратно при помощи array_agg. Правильный способ: переделать базу, чтобы никакого массива не было, сделать отдельную таблицу с отношэнинм 1-ко-многим.
А какой тогда PK там делать? FK - понятно у нас будет на source таблицу.
Если это действительно массив — то (referenced_field, position), очевидно. Если же это на самом деле множество, как обычно бывает — (referenced_field, value).
Да, order не важен пока что. Почему-то считал что плохо иметь таблицу у которой по сути PK - это вся таблица. Или это вообще нормально? (учитывая, что value - это text)
> Почему-то считал что плохо иметь таблицу у которой по сути PK - это вся таблица. Все обычные таблицы many to many — именно такие. Т.е. понятия не имею, почему Вы так считали. ;) > (учитывая, что value - это text) Ну и что? Если по сути это правильно (если дубликаты — ошибка), этот ключ должен там быть.
Да я всегда так и делал. Но откуда-то в голове засело - что это Bad Practice. В нашем деле же как - делаешь что-то делаешь - а потом приходит осознание, что а вдруг что-то не то делаешь. :)
Пк не делать, а брать тот, что в таблицэ ужэ есть. Можно и не первичный ключ, а любой, на самом деле — но я решыл не усложнять тот комментарий лишними подробностями.
А, то есть это вопрос по правильному способу был что ли?
В таком случае мой пред-предыдущий ответ относится не к тому.
Ага, а то уже начал переделывать :) Ведь сделал же изначально так - но нет, решил а вдруг нереляционно - будет лучше :)
Нет, как раз один-ко-многим и весь кортэж первичный ключ — это классика. А массив, с частями которого что-то делают — это не 0нф.
Ну супер, на самом деле успокоили меня! Спасибо большое! Обычно стараюсь one-to-many все-таки более осмысленными делать, нежели просто ключ/значение, но тут как ни крутил - не нужно ничего дополнительного. Хотя, теперь и расширять проще будет. В общем, Илья, Ярослав, спасибо еще раз за ваши ответы!
Обсуждают сегодня