Вы видите копию треда, сохраненную 30 января 2023 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Ссылки:
- https://www.postgresqltutorial.com/
- https://www.mysqltutorial.org/
- https://www.sqlitetutorial.net/
- https://www.oracletutorial.com/
- https://github.com/agarcialeon/awesome-database
Задачи:
- https://www.sql-ex.ru
- https://www.codewars.com/?language=sql
Продвинутый MySQL:
- https://www.mysqltutorial.org/mysql-resources.aspx
- https://shlomi-noach.github.io/awesome-mysql/
Инструменты проектирования БД
- https://www.mysql.com/products/workbench/
- https://explain.dalibo.com/
Видосики:
- Плейлисты по разным СУБД: https://www.youtube.com/c/SQLDeveloperBI/playlists
- https://www.youtube.com/watch?v=EHvzvwAv7RU&list=PLY7PmJJFH5nT-lbFKxfbp3rw5BBuq5Azo
Литература:
- Томас Кайт. Oracle для профессионалов
- https://postgrespro.ru/education/books/dbtech
- Алан Бьюли. Изучаем SQL. - про MySQL
- К. Дж. Дейт. Введение в системы баз данных
Прочее:
- https://dbdb.io/
- https://db.cs.cmu.edu/
- https://www.youtube.com/channel/UCHnBsf2rH-K7pn09rb3qvkA/playlists
- Сравнение диалектов SQL: http://troels.arvin.dk/db/rdbms/
- Как БД работают изнутри: https://habr.com/ru/company/mailru/blog/266811/
Ссылки для аутистов:
- https://www.w3schools.com/sql/
- https://learnxinyminutes.com/docs/sql/
- https://metanit.com/sql/
- http://sql-tutorial.ru/
- MongoDB: https://metanit.com/nosql/mongodb/
FAQ:
Q: Нужно ли знать английский?
A: Да.
Q: Что лучше, SQL или NoSQL?
A: По задачам.
Q: Вопросы с лабами и задачками
A: Задавай, ответят, но могут и обоссать.
Здесь мы:
- Негодуем, почему шапка - говно, и предлагаем коллективному ОПу идеи, как её улучшить.
- Разбираемся, почему PostgreSQL - не Oracle
- Пытаемся понять, зачем нужен Тырпрайс, если есть бесплатный опенсурс
- Обсуждаем, какие новые тенденции хранения данных появляются в современном цифровом обеществе
- Решаем всем тредом лабы для заплутавших студентов и задачки с sql-ex для тех, у кого завтра ПЕРВОЕ собеседование
- Анализируем, как работает поиск вконтакте
- И просто хорошо проводим время, обсирая чужой код, не раскрывая, как писать правильно.
Поехали!
Мигрировался в этот тред.
Но в этом playground можно все потестить же
Это нетипичная задачка для скл, надо быть ебать знатком, чтобы через жопу извернуться.
Если бы это был какой-то цсв, то решается в десять строчек и можно быстро молотить гигабайты, а тут хуй знает.
Можешь молотить построчно из базы, но это хуевое решение, канеш.
Ну допустим
https://pastebin.com/cJdcDvye
а чо в постгресе такие ебнные функции работы со временем? Где datediff?
Это не самостоятельная сущность - полностью зависит от этих трех
Как делать условные селекты? Нужно чтобы колонка name в результате была или null если у профиля нет имён, или первое имя профиля.
select case when ... then ... else ... end from yourtable
У меня есть таблица с некими периодами со значениями, они могут накладываться друг на друга.
Нужно в итоге посчитать суммы этих значений во времени.
Ну типа
А-C - 1
B-D - 2
Результат
A-B - 1
B-C - 3
C-D - 2
Я короч придумал как это решить https://www.db-fiddle.com/f/8DoGuaWbJC8yeLwNxUadHg/0
но меня терзают смутные сомнения, что сделал это по-уебански совсем, и очень неэффективно.
Как сделать это правильно?
---
Моё решение такое, я подумал что логично будет сначала просто разбить всё множество периодов на отрезки.
Для этого сначала взял все возможные пары точек (через 4 юниона, для разных случаев), потом для этих пар нашел непересекающиеся отрезки с минимальной длиной (сгруппировал просто по левой точке, с самой ближней правой точкой).
Ну а имея отрезки уже можно было джойнуть их с периодами и уже агрегацией посчитать суммы, изи.
нет, кодом только за деньги
ну смотри если у тебя разные отрезки времени, тебе же надо будет порезать по ним. Например первый 14:00-14:30 второй 14:10-14:20, соответственно пересечение 20 минут, а не 30. Делаешь джоин потом при помощи iif считаешь begin/end
С ORM надо в деталях знать механизм его работы вплоть до чтения его исходников, читать книги на тысячи страниц, знать про проблемы типа N+1, очень внимательно и осторожно описывать конфиг ORM и все сущности, очень хорошо знать SQL, чтобы смотреть сгенерированные запросы и мочь при их неоптимальности переписать на нативный SQL (примерно в половине случаев).
Вообще, хуй знает, для кого придумали ORM, они не решают проблем, которые на них возложены. Работа с базами данных только усложнилась.
Если нравиться быть обсосанным на кодревью, иметь проблемы с миграцией и фейлить тесты безопасности, смело бери raw sql
Как тебе ORM с миграциями помогает? Таблицу с айдишниками запросиков, проверяемую на старте, ты можешь и без ORM сделать. А в экранизацию значений можешь даже самый паршивый драйвер/адаптер на %языкнейм%.
Это как вебмакакаи, которые выучили модный фреймворкнейм и не знают, как без него что-то сделать.
Кабану интересно только чтобы сделать с или без, а как ты сделал интересно только твоей мамке.
Долбоёб, к чему ты это высрал? Тут обсуждение технологий, а с кабанами съеби в МВП-тред.
А ты в технологиях разбираешься? ORM технологичне, миграции не нужны с ORM, так они на лету генерятся из Entity обычно. ORM не запрещает raw запросы строчить, когда реально нужно.
А, типа прям империативно кодом. Не, эт читерство, так можно вообще всё вытянуть в приложение и уже нормальным ЯПом посчитать мб даже эффективнее всего будет, чтобы базу не нагружать кстати. я хочу прям sql'ем, декларативно.
Значится, это очень холиварный вопрос.
Концептуально нам как программистам не хочется писать plain sql в бизнес-логике, потому что во первых эта логика засирается всякой sql-специфичной херней (ну там вместо одного логического upsert иногда приходится делать if !select then insert else update), а во вторых, иногда приходится захуяривать всякие промежуточные рантайм кеши и прочую особую логику и когда у тебя sql уже расползся по всему коду, то как-то задекорировать это дело становистя нереально.
Короч, хочется, чтобы бизнес-логика содержала просто действия вида "найди", "укради", "роди", а вся базоспецифичная хуйня тусила отдельно.
Тут в целом нормальный подход просто запилить интерфейс репозитория с соответствующими методами, а в отдельном слое бахнуть реализацию, уже прям с хардкодными запросами. Вот этот прям норм схема, если можешь такое сделать, не стесняйся.
Но некоторые пошли дальше и сказали, что типа а давайте вообще запросы никакие не писать, у нас будет одна универсальная либа, в которой мы будем описывать сущности и связи между ними и что мы хотим найти, а эта либа сама будет нам всё находить, сама за нас понимать, какие запросы сделать и всё такое.
И вот это всё звучит хорошо, но довольно быстро превращается в пиздец, потому что эта ORM просто становится ещё одним промежуточным языком и если раньше ты должен был знать только твой ЯП и SQL, то теперь приходится знать ЯП->ORM->SQL. А все базы, заразы такие, очень специфичны, и для эффективной работы требуют кучи всяких рюшечек, да и просто поддерживать все фишки всех бд ни одна орм нормально не может, в итоге поддерживая только какую-то общую базу, в результате чего, какую бы бд ты ни выбрал, тебе всё равно придется писать на generic sql, используя уникальные возможности бд на 20%.
Ну и про эффективную работу, тебе придётся досконально знать то, как работает твоя ORM, чтобы заставлять её каждый раз генерировать эффективный код для базы.
В итоге ты ебешься со всеми этими сложностями и такой думаешь "нахуй мне вообще этот комбайн, просто напишу плейн запросы и норм будет".
Но это тоже не вся правда, потому что в итоге тебе придется велосипедить и колхозить многие вещи, которые в орм уже сделаны и так или иначе продуманы.
В-общем, орм'ки хороши для формошлепства и всяких несложных запросов, CRUD'ов и тому подобного, а все сложные вещи лучше всего всё же писать руками в отдельном слое.
А, и да, Hibernate это какое-то монструозное говно, на которое без ужаса смотреть нельзя, если что, то бывают орм попроще и посимпатичнее.
Значится, это очень холиварный вопрос.
Концептуально нам как программистам не хочется писать plain sql в бизнес-логике, потому что во первых эта логика засирается всякой sql-специфичной херней (ну там вместо одного логического upsert иногда приходится делать if !select then insert else update), а во вторых, иногда приходится захуяривать всякие промежуточные рантайм кеши и прочую особую логику и когда у тебя sql уже расползся по всему коду, то как-то задекорировать это дело становистя нереально.
Короч, хочется, чтобы бизнес-логика содержала просто действия вида "найди", "укради", "роди", а вся базоспецифичная хуйня тусила отдельно.
Тут в целом нормальный подход просто запилить интерфейс репозитория с соответствующими методами, а в отдельном слое бахнуть реализацию, уже прям с хардкодными запросами. Вот этот прям норм схема, если можешь такое сделать, не стесняйся.
Но некоторые пошли дальше и сказали, что типа а давайте вообще запросы никакие не писать, у нас будет одна универсальная либа, в которой мы будем описывать сущности и связи между ними и что мы хотим найти, а эта либа сама будет нам всё находить, сама за нас понимать, какие запросы сделать и всё такое.
И вот это всё звучит хорошо, но довольно быстро превращается в пиздец, потому что эта ORM просто становится ещё одним промежуточным языком и если раньше ты должен был знать только твой ЯП и SQL, то теперь приходится знать ЯП->ORM->SQL. А все базы, заразы такие, очень специфичны, и для эффективной работы требуют кучи всяких рюшечек, да и просто поддерживать все фишки всех бд ни одна орм нормально не может, в итоге поддерживая только какую-то общую базу, в результате чего, какую бы бд ты ни выбрал, тебе всё равно придется писать на generic sql, используя уникальные возможности бд на 20%.
Ну и про эффективную работу, тебе придётся досконально знать то, как работает твоя ORM, чтобы заставлять её каждый раз генерировать эффективный код для базы.
В итоге ты ебешься со всеми этими сложностями и такой думаешь "нахуй мне вообще этот комбайн, просто напишу плейн запросы и норм будет".
Но это тоже не вся правда, потому что в итоге тебе придется велосипедить и колхозить многие вещи, которые в орм уже сделаны и так или иначе продуманы.
В-общем, орм'ки хороши для формошлепства и всяких несложных запросов, CRUD'ов и тому подобного, а все сложные вещи лучше всего всё же писать руками в отдельном слое.
А, и да, Hibernate это какое-то монструозное говно, на которое без ужаса смотреть нельзя, если что, то бывают орм попроще и посимпатичнее.
причём тут приложение? SQL умет в if.
Просто после джоина у тебя будут отрезки и надо найти их пересечение в рамках строки, это делается через if
если конкретно в постгре нет имплементации можно тоже самое через case сделать
Почти как у меня выше
Ну разве орм мне не поможет, если я во время миграции поменяю имя колонки в табличке? Ели рав-скл, то мне придется во всех запросах менять имя колонки.
Или удалю колонку.
С raw SQL у тебя есть такое достижение языков программирования, как повторное использование кода. Ты пишешь репозиторий, который знает, как работать с этой таблицей, а во всех остальных местах тупо этот репозиторий используешь, инкапсулировав уровень доступа к базе данных, и если захотел переименовать/удалить столбец, то только в этом репозитории и переименовываешь/удаляешь.
Да, действительно, не учёл что может быть больше 1 отрезка подряд, тогда использовать row_number() вместо lead, и в конец ещё подсчёт суммы.
Ну да. Но с орм мне придется поменять только модельку и написать чендж сет, а с рав-скл минимум поменять половину методов в репошке.
А если у меня есть методы, делающие селекты из нескольких табличек, то и в других репошках тоже придется менять поля в рав-скл запросах.
Мы так то билдером запросов пользуемся(жук) с генерацией модельки, который попроще орм(хибера), но все таки не совсем рав скл. И вместо переписывания скл-скриптов надо перегенерить модельку, а иде уже сама подчеркнет, где нужно поменять репошку. Но есть вопросы о хранениии сгенеренного кода. И еще пару мелочей, уже не помню каких.
То есть не нашли.
- Параметры всех запросов экранировать, т.е. вместо конкатенации строк везде использовать SqlCommand.Prepare(), PreparedStatement и подобное.
- Включить шифрование соединения с БД.
- Если приложение и логика у тебя в БД, и пользователи подключаются к ней напрямую, то создавать для каждого юзера по схеме, создавать публичные синонимы для хранимых процедур, выдавать гранты, пермишены, настраивать ACL.
- На случай, если уж взломали, строить архитектуру так, чтобы ущерб был минимальным. Пароли хешировать, не хранить все данные в одном месте, вынося данные в другие системы и т.д.
Да, это называется двухзвенная архитектура. Было популярно в двеяностых-начале нулевых, когда языки для серверной разработки были в зачаточном состоянии, масштабные энтерпрайзные проекты не тянули, так что удобнее всего было вести разработку бизнес-логики прямо в базе данных. Тогда и клиенты были в основном десктопными. Сейчас в основном легаси.
Что за манеквры ёбана?
Задача сводится к нахождению непрерывных временных отрезков, сделать агрегацию по ним дело техники. Эта задача решается через row_number
https://stackoverflow.com/questions/20402089/detect-consecutive-dates-ranges-using-sql
Я ждал этого!
no
Это когда пишешь SQL-запросы сам вместо того, чтобы за тебя это делал волшебный зумерский фреймворк.
Не пользуюсь джойнами, всё через where, код намного понятнее, чем ебля с FULL OUTER RIGHT INNER CROSS JOIN, но брат умер.
Как ты блядь не пользуешься джоинами а только вэрэ? Ты не пользуешься ногами, а только ботинками? Как ты соединишь таблицы без джоина? Соединение таблиц это и есть джоин. Даже если пишешь from a, b where a.id = b.a_id
Не использую синтаксис джойнов, значит, не пользуюсь джойнами. Меня не ебёт, что СУБД у себя внутри построит почти одинаковый план запроса, что и с джойном, и будет выполнять его через один и тот же механизм. Я же не говорю, что пользуюсь регистрами и прерываниями, хотя внутри тоже через них всё работает. Потому что важна только семантика языка запросов.
Дядя Петя, ты дурак?
Можешь, но однажды ты наткнёшься на какой-нибудь сломавшийся отчёт, написанный кем-то другим с активным использованием оконных функций, и тогда придётся учить. Да там и учить почти нечего.
Не говоря уже о том, что после выполнения первого же условия мы должны забить хуй на остальные и заполнить поле mode нужной цифрой, CASE это обеспечивает? Или он всегда исполняет все ветки условий?
---CASE это обеспечивает?---
Должен.
---Или он всегда исполняет все ветки условий?---
Но зачем спрашивать про специфику работы какой-то языковой конструкции на двачах, ищи в документации по СУБД
SELECT name FROM table WHERE mode NOT IN (alpha, beta, zeta)
Строку "alpha, beta, zeta" я как раз и вытащил, но бля, если я просто вставлю ее через питоновское форматирование строк в мое следующее query то может быть потенциальная инъекция (и тулза bandit не даст гитлаб пайплайну пройти), но если я буду пытаться вставить ее через обычные параметры и ? то постгря неправильно меня поймет - она будет видеть одну строку, но на самом-то деле это не единая строка и 3 разных параметра
поищи в документации, можно ли вставлять массивы через твою тулзу и как это делать
Есть ли способ обновить строчки в таблице по GROUP BY?
Вот мы сгруппировали строки по 2м колонкам: GROUP BY item, address - как внутри каждой такой группы обновить поле start_date, установив максимальную среди всей группы? Чет вроде должно быть просто, select запрос и так ясно как писать, но как из него сделать update блэт?
тебе надо найти записи с максимальным start_date и заапдейтить их?
Думаю как-то так
Работаю в open panel server, запускаю локальный сервак
При работе с формой поиска бд выдает parse error, смотрю логи апача, а там обычная 408.
Вы уже наверное поняли про что идет речь лол. Буквально месяц назад форма работала. В чем блядь проблема? В какую сторону копать?
Благодарю
И бочку делаю тоже.
Так хранимая процедура же?
Вроде по русски это называется представление, with гугли.
табличные выражения
Может и в базе данных, но там сложно получить непонятные ошибки, СУБД либо работает, либо нет. Скорее что-то не так с конфигурацией твоего open panel server, про это здесь никто не подскажет, это проблемы, специфичные для языков программирования, на которых работает приложение, использующее БД,
Да в том и прикол, что на сайте все работало, а потом раз и все, я просто уже не понимаю, где копать, потому что сайт не мой, движок не определить из за клаудфаер защиты, это точно не настройка open panel, это словно магическим образом вываливающаяся ошибка, я настолько нуб что даже не знаю как прогнать форму на ошибки, тупо как посмотреть где она, есть какие то логи апача, но это не то все, мб это специальная ошибка создателей, как ковырять, в каком месте хз. Ну вот допустим как прогнать конкретно форму сайта на ошибки?
Проблема в том что после стирания последовательность для айдишников продолжает идти, то есть когда пишем в чистую таблицу новые данные, у нас id начинается не с 1 а с того числа, на котором закончилось. Как это фиксить?
делвй drop&create
значит секъюенс тоже апдейть
Ну допустим.
TRUNCATE promejutochnaya_tablitsa RESTART IDENTITY CASCADE;
Гуглится за 10 секунд блять, хз, зачем он вообще задаёт вопрос и ждёт ответа несколько дней.
В одном месте мы селектили данные из таблицы на основании пар колонок item и type а потом отдельно обрабатывали каждую такую группу данных (штук 30-40 таких групп обычно). Подумал что можно выполнить 1 sql запрос и объединить все с помощью Union. Но на локальных тестах не увидел какого-то подъема в производительности. union бесполезен для таких кейсов что ли?
База - постгрес
он склеивает только результаты с одинаковым типом и количеством колонок.
Т.е. должны быть селекты с одинаковым типом результата
Ну да, они с одинаковым, ничего не упало. Просто какого-то прироста не заметил. Можно будет еще проверить на тестовой базе 10 миллиона строк но походу результат будет тот же
Вообще мы тут с пацанами пытались оптимизировать питоновский celery pipeline, там внутри селери-тасков дергается постгря. Думали если уж union не помогает ускориться то можно не каждый раз вытягивать данные из таблицы а 1 раз целиком заселектить всю таблицу и передать эти данные в каждый из тасков, чтобы там уже данные отфильтровать. Но случился нежданчик с брокером - Реббитом:
"PRECONDITION_FAILED - message size 2253095235 is larger than configured max size 134217728"
То есть мы попытались 2 Гига засунуть в 1 месседж Реббита. И я вот думаю - даже если разобьем этот месседж на чанки по 100 Мб скажем, тут же все равно больно дохера памяти используется, не? Кто работал с Реббитом глубоко? Это вообще норм идея передавать столько данных по нему или это хуйня ебаная и так никто не делает?
Оверхед на сериализацию/десериализацию, не?
В общем помогите плез кто чем может)
Сколько стоит твое очко?
Есть ли какая-то IDE для MySQL с урезанным функционалом для новичков чтобы могла наглядно строить таблички или все эти связи между табличками как Воркбенч? Может есть какой-то хидден гем в вашей области для новичков?
Найди студентов которые не завалили ни одного предмета.
dbeaver умеет рисовать таблички со связями
Вот у меня есть sqlite3 таблица, я добавляю туда строку через INSERT INTO и закрываю действие через .commit()
Но сейчас мне надо добавить строку, и сразу же ее обновить через UPDATE. Нужно ли делать коммит после первого действия?
> добавить строку, и сразу же ее обновить через UPDATE.
почему сразу нельзя записать то что нужно, шиз
Сделано это для обеспечения изоляции параллельных транзакций. К примеру, когда ты обновляешь строку в своей транзакции, другие транзакции так же могут работать с ней. И для них как раз и нужно сохранить старую версию. И да, строка во время обновления со страницы физически не удаляется. Это произойдет позже, во время автоочистки.
Небось скажете индексы юзать? А вот хрен, у нас в этой таблице много вставок и изменений, строк несколько десятков лямов, так что от индексов решили отказаться.
Как же быть?
Тут обоссанцы одни, ничего не шарят. Папка поможет:
TRUNCATE TABLE table_name RESTART IDENTITY
юзай ровнумбер ебана, ты чо как хлебушек
не влияет на ситуацию. Уменьшение объема передаваемых по сети данных должно ведь ускорять RPS, неужели распаковка съедает весь выигрыш?
Как тогда у этого чувака https://www.mongodb.com/developer/products/mongodb/mongodb-network-compression/ получился прирост на 33%?
Коллекция пожата в snappy, ~100k записей, клиент pymongo, тесты гонял по десятку итераций с усреднением результата.
в любом случае надо начать с замеров и мониторинга. Сделать копию базы, убрать там форенкеи, и посмотреть на мониторинг, что изменится
На своих проектах довольно редко юзаем чистоганом. Только если какаято специфичная хуйня, которую ОРМ осилить не может. Как правило это если он генерит какуюто медленную поеботу, или же какой нибудь долбоеб решил динамические свойства объектов реализовывать через добавление колоночек на лету
>Как будто блять кто-то до сих пор не хуярит своё говно через ORM
Посмотрел бы на тебя как ты бы вот это по маняОРМке писал
да, вверху еще кондишны в форматировании, строк на 40
О, спасибо!
Ораклоебы здеся?
Поясните почему with select не возвращается через dbms return?
Че за наебалого?
Так не работает:
DECLARE
rc SYS_REFCURSOR;
BEGIN
OPEN rc FOR WITH q AS (SELECT 2 FROM dual) SELECT 1 FROM q;
dbms_sql.return_result(rc);
END;
а так типа норм:
DECLARE
rc SYS_REFCURSOR;
BEGIN
OPEN rc SELECT 2 FROM dual;
dbms_sql.return_result(rc);
END;
вижу в этом проявление глубокой несправедливости
ОРМы нужны для простой вещи - загрузить строку в виде объедка.
Те кто пытается надрочить там обжект квери языки, это долбоёбы с патерном головного мозга.
ОРМ генерит говно процентов в 50% случаев. Чтобы сдать работу заказчику - хватает. А вот что начинается потом - это другой разговор
https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_no_distinct
Бля, скрин проебался
Вся строка - ключ.
А иначе подумой, что бы ты получил, если бы остались только уникальные страны и уникальные города? Это были бы записи, не имеющие отношения к исходным данным в бд.
>Как будто блять кто-то до сих пор не хуярит своё говно через ORM.
Если шлепаешь CRUDы, то да. Как только логика чуть сложнее, то пиздец ты под эту ебучую орм начинаешь подгонять необходимый sql запрос, в конечном итоге тебе нужно одновременно знать и sql и как при помощи orm накостылить этот запрос. Что в рельсах, что в ларавеле бесило этой хуйней заниматься, а писать чистый запрос не по феншую.
Уже давно пишу чистые запросы и это вообще кайф, особенно когда поднимешь локальную базу и настроишь всё в ide там почти все автокомплитом высекается. И можно уже по необходимости для каждого запроса свои структуры накидать, используя только нужные столбцы
Если не поработаю завтра будет стремно перед пмом отчитываться. Хотя тасочка до пятницы. Но хочется сказать ему, что там немного осталось, когда уже все давно готово.
SQL — язык реляционных баз данных: Учебное пособие / Кара-Ушанов В.Ю., - 2-е изд., стер. - М.:Флинта, Изд-во Урал. ун-та, 2017.
Полякова Л.Н. Основы SQL : учебное пособие / Полякова Л.Н.. — Москва : Интернет-Университет Информационных Технологий (ИНТУИТ), Ай Пи Ар Медиа, 2020.
Астахова И.Ф., Мельников В.М., Толстобров А.П. - СУБД: язык SQL в примерах и задачах - Издательство "Физматлит" - 2009 - 168с. - ISBN: 978-5-9221-0816-4
Фиайли К. - SQL - Издательство "ДМК Пресс" - 2008 - 451с. - ISBN: 5-94074-233-5
Грабер Мартин. Понимание SQL – Издательство "Лори" - 2014
Кто-нибудь читал что-то из этого?
Грубер это классека, была такая ещё совковая методичка из ранних 90-х, лол. Но там sql89, или это какое-то обновленное издание?
Местечковых хуев не знаю.
Понял-принял.
Новикова читал. Вполне неплохо. Для того, чтобы втянуться самое то. В отличие от других пособий, кроме того как пользоваться, объясняет ещё почему так сделано и как оно работает. Упор в книге идёт на постгрю. Но нужно искать второе издание. В первом только, так сказать, ознакомительная часть. Во втором же, появилась часть с деталями. Единственное, это все же учебное пособие и требует какой-никакой базы. К примеру, главу с формализацией аномалий конкурентного доступа и уровней изоляции транзакций без мат. базы читать и осознавать будет тяженько.
https://dbfiddle.uk/?rdbms=postgres_13&fiddle=5f43cee06b406a523b5280a6523d21d4
Как вставлять случайное число строк в таблицу, подразумевая, что все колонки в ней необязательны? generate_sequence() похоже на то, но как его использовать в инсерте, игнорируя его значение?
При вставке в test_1 должна пройти такая процедурка:
- Вставить n число строк в test_1
- Вставить такое же число строк в test_2
- Добавить их связь в test_refs через индекс вставки. То есть первый новый вставленный test_1 будет связан с первым новым вставленным test_2, пятидесятый новый test_1 с пятидесятым новым test_2 и т.д. Гуглить это пиздец конечно, так как index в моём кейсе это что-то типа индекса массива, а не индекс таблицы.
Посмотри блять на ссылку и скажи, куда ты там собрался устанавливать вот это:
> To install the dbms_random package, you need to run 4 scripts when connected as the user SYS or INTERNAL
В постгресе есть бюлтины для этого, вот только все инструкции или на уровне хэлловорлдов с простыми селектами, или вставляют значение в таблицу.
Типа 2022-08-15, 2022-08-16, 2022-08-21 - берём все, а 2022-08-15, 2022-08-17, 2022-08-19 - нахуй.
Можно ли так вообще или надо в коде проверять это?
Я бы сделал lead, datediff и посмотрел есть ли где отличные от 1
Дать ему пошурудить в твоей дырявой базе данных, проникнуть в его оконную функцию. Пошалить с его табличным выражением. Изолировать свою транзакцию на 3/4 в его сессии.
не вытекает.
Представь что серверов несколько или ты в любой момент выдергиваешь шнур и выдавливаешь стекло компьютера.
> Представь что серверов несколько или ты в любой момент выдергиваешь шнур и выдавливаешь стекло компьютера.
И транзакция откатится в соответствии с atomicity, придя, как следствие, к consistency.
"Выполнить поиск по соответствию полей (merge): S.item = P.item; S.start = P.start"
Только вот это постгрес и никакого merge (в версии 13) тут нет. Что блэт такое "поиск по соответствию полей"? Нихрена не гуглится
Делаю в постгресе такой запрос
SELECT *
FROM mytable
WHERE mycolumn = ANY('{JOPA, HUI, PIZDA}'::text[])
Соответственно он возвращает мне строки где mycolumn какое-то из значений в массиве. Если например нашел только HUI и PIZDA то вернет 2 записи.
Вопрос - можно ли сделать так, чтобы если значение не находилось все равно бы возвращалась пустая или определенная запись?
Типа сейчас на такой селект ответ
mycolum mycolum2 mycolumn3
HUI ZZZ XXXX
PIZDA ZZZ2 XXXX2
а например хочется
mycolum mycolum2 mycolumn3
[NULL] (или JOPA) [NULL] [NULL]
HUI ZZZ XXXX
PIZDA ZZZ2 XXXX2
или вместо NULL что-то еще. Причем важно чтобы сохранялся порядок элементов в переданном массиве, то есть в этом случае 'JOPA' вошла первой, и ее ответ был бы первым
Какими местами? DDL/DML учится за день, а если у тебя там хранимки, быстро никак не перекатишься.
Да хоронимки
Тащемта upsert производится по конфликту constrain t. merge работает по другому, он глядит если строка не сметчилась то тогда ее вставляет. Тут надо отправлять 2 запроса - update from select (с inner join) и insert from select (с left join чтобы спалить строки которые не сджойнились)
Ты типа хочешь чтобы если в mycolum было что-то не из твоего массива поиска, то показывалась пустая строка? Захера?
"2022-08-15, 2022-08-16, 2022-08-21 - берём все"
Имелось в виду "2022-08-15, 2022-08-16, 2022-08-17 - берём все"?
Иначе смысла не имеет.
Ну а вверху постгрес так что твое решение интересно только с академической точки зрения
Ну алгоритм тот же самый. Вопрос был про мерж, предложена мною конструкция повторяет мехнизм работы мержа, и может быть использована в постгрес. Конкретизирую мы не используем insert ignore или другую подобную конструкцию.
а хуй знает. пора бы привыкнуть что книг ориентированных точно на тебя нет.
работать продолжайц.
Дейта прочитал? Красную и вторую книги,я про "SQL и реляционная теория" ?
"Postgresql 14 изнутри" ?
вот еще что я хочу прочитать в ближайшие годы:
Daniel_Nichter_Efficient_MySQL_Performance_Best_Practices_and_Techniques.epub
"Database tuning principles 2002 .pdf" (старинная, конечно, но меня привлекают книги где чуваки толкают теорию, а не т.н. бросаенс)
Спасибо за наводку на Дейта, погляжу. Честно говоря, не хочется слишком много внимания уделять реляционной модели. У нас на работе такие БД в меньшинстве.
всмысли, наводку?
ты должен Дейта как просто по-дефолту. первую книгу, красную.
Но у него очень скучный язык.
Во всяком случае, вопросы о нормальных формах она закроет исчерпывающим образом.
Как научиться правильно выбирать уровень изоляции транзакции? Ну так, чтобы не наломать дров.
Какие книги почитать по этой теме?
Господа, с высоты вашего опыта подскажите литературу по MS Sql для сис админа. Решил слегка апнутся в знаниях, но даже не совсем понимаю, что требуется от админа в плане баз данных, кроме как бэкапить их. В общем нужна книга которая затронет большую часть функционала именно администрирования БД.
Сразу оговорюсь, что я ни разу не кодер и не оператор баз данных, а хуй простой; скл вчера впервые скачал в виде плагина для лисы и только знаю 3.5 команды для вывода и сортировки инфы.
Потому-что неправильно задан тип данных. Чтоб новые данные не обрезались поставь тип данных text. Что обрезалось, уже проёбано.
Шо е бiг дата? Какой набор инструментов ты подразумеваешь? База SQL учится за 2 недели если сильно хуй не пинать и не быть дауном, если одно из двух то месяц, если оба то как повезёт.
Ему ещё петухон с пандасом учить.
зная только SQL можно ли найти РАБоту? Какой минимальный габор программ нужно знать? Просто везде пишут прям про вообще дохуя какое кол-во знаний, вплоть до бизнес процессов. Так ли это, действительно ли надо 2 года дрочить, чтоб стать дата сайнтистом (или кем нить там бля хотя б)?
Ну смотри, я так сам устраивался и кореша своего устроил: учишь тупо SQL хотя бы чтобы left/right джоины нормально понимал ну и там группировки, оконные функции даже не обязательно и пиздуешь устраиваться в техподдержку Л2, не на телефон а инциденты разбирать, там платат по хуйне, но с годом опыта там уже можно качать права на аналитика 100к+ рекорд моего кореша за 6 месяцев на 140к, он он на двух разных техподдержках успел поработать перед тем как в аналитику укатиться. Предметная область это конечно плюс как и всякие UML/BPMN, но можно и без них, по сути найти чела который шарит и за финтех и при этом кнопки мыши не путает тяжело.
Хммм, спасибо! Полезно было услышать
А как тогда клиент читал эти данные, если они уже были заданы таким образом? Сам-то я ничего не менял.
Может ли такое быть, что тип данных поменялся от одного факта открытия базы в сторонней программе?
Так щас клиент запустить нельзя уже. Там вход через авторизацию на серваке, который много лет назад закрыли и всю инфу потерли. Новый клиент старые учетки не поддерживает.
Есть какое-то странное соглашение, что М - 1, а Ж - 0. Но это для пола, гендер должен быть строкой, VARCHAR2, а лучше BLOB.
Так о чем и речь, что сразу видно, что курс (и эту пдфку на скрине) писала женщина из универа возрастом в 40-45 лет. Современный поридж в своем курсе про М и Ж в bool уже вряд ли напишет.
Сейчас работаю на заводу со стеком Delphi + SQL. Создаю автоматические отчёты. Это моя первая работа.
Практически дочитал Книгу "Изучаем SQL. 2021. Алан Болье." одна глава осталась.
Собственно вопрос. Какие есть ветки прокачки? Куда дальше можно развиваться? Посмотрел объявление с своем городе есть позиции SQL разработчика и Разработчика БД. В основном нужны знания PostgreSQL. В книге упоминалась Big Data, тоже интересно. Есть ещё Аналитика данных, что вроде про SQL и нейронки. В общем, что думаешь анон?
бежать.
Ну я например загрузил жсон с пачкой каких-то значений.
Для каждой надо попробовать найти запись по какому-то полю в базе, если нашлось сделать что-то одно, если нет что-то другое. Если по одной долго, если пачкой запрашивать, то непонятно по какому значению что-то нашлось а что-то нет. Конечно можно в коде джоинить или как я в итоге сделал - отправлять батч из n селектов, но интересно можно ли одним запросом как-то так запросить, и еще обязательно без хоронимок.
Благодарю!
Для базового минимума хватит и mysql, но он нахуй никому не всрался в 2022.
Учи постгрес, это сейчас дефолтная СУБД, к тому же достаточно навороченная хоть для энтерпрайза. При необходимости пересесть на оракл легко переучишься.
знаешь различие между sex и gender?
Большое спасибо.
Вот обычный запрос на UPDATE:
UPDATE employee
SET occupation = %value%
WHERE age < 18
Обновляем все столбцы где age < 18 указанные значением. Но что если у нас куча разных строк в каждой из которых свое уникальное значение name которым надо обновить строку с конкретным айдишником? Шо делать?
Если через питон и алхимия например то решается обычным итеративным подходом:
data = [{'id': 108, name='Peter'}, {'id': 213, name='Mary}]
for row in data:
----await session.execute(f`UPDATE employee SET name = {row['name']} WHERE id = {row['id']}'`)
Но если высирать по 1 UPDATE на каждую строку это пиздец, что если таких строк 100к? А миллион? Они ж никогда не выполнятся.
insert on duplicate update и вставляешь дохуя столбцов за раз как при обычном большом инсерте.
Нужно найти и вывести пропуски ровно в одно число с помощью джоина и фильтрации, решение при помощи оконной функции не подходит
Ещё из вариантов - создаёшь временную таблицу, инсертишт в нее, а потом:
UPDATE target_table
SET value1 = tmp.Value1, value2 = tmp.value2
FROM temp_table tmp
WHERE target_table.id = tmp.id;
select T1.t +1 from T T1 join T T2 on T1.t=T2.t-2 left join T T3 on T1.t=T3.t-1 where T3.t is null
Похуй, что толсто, но постгрес подходит для любых объёмов проекта, хоть пет с 5 таблицами, хоть энтерпрайзный легаси монолит с 3000 таблицами и миллионами записей.
votes_down = int
И реализовать интерфейс к ним интерфейс, который будет увеличивать их счетчик? Возвращать count по этим полям
{
"votes_up": 325,
"votes_down": 89
}
Кто хейтит? Негатив в сторону постгреса слышно только от NoSQL-шизиков, но они ненавидят одинаково все РСУБД, что постгрес, что мускл, что оракл.
еще толще
Его хейтят только всякие макаки-веб мастера, ибо сложна, вакуум какой непонятный тюнить надо. Да и другие настроечки тоже неплохо бы покрутить, чтоб производительность лучше была.
Это смотря какие у голосовалки требования, но обычно такая логика реализуется дополнительными таблицами с внешними ключами.
План запроса смотрел? Индексы на все столбцы, по которым идёт join есть?
Это первое что я сделал. Индексы расставлены. Но эксплейн не о чем не сказал кроме 958 rows в связующей таблице. И у меня еще 5.7 мускул а там нет доп. инструментов для анализа как в 8
Не нужны никакие временные таблицы если используешь subquery
UPDATE target_table
SET value1 = subquery.Value1, value2 = subquery.value2
FROM (SELECT id, value1, value2 FROM shitty_table) as subquery
WHERE target_table.id = subquery.id;
Помощи что-ли попросить?
Чой-та я застрял с Berkeley DB, но это наверное с сишном треде надо интересоваться. Да, точно, не буду вам ебать мозги с вопросами о программировании. Но раз уж зашёл сюда, то вот интересно - есть или нет аналог схемы в базах Berkeley DB? Думаю что нет, но может быть ошибаюсь?
Ну так я писал про вариант, когда у тебя данные для обновления только на клиентской стороне есть. И их много. Вот в такой ситуации мы обычно создаём временную таблицу, заливаем ее через COPY FROM stdin и уже на стороне бд обновляем из нее через UPDATE FROM.
Чаще всего командую джуну работать за меня
https://youtu.be/8h7JGr9loFo
Сейчас я получаю данные из гугл таблиц, читаю и записываю в базу. Строки могут удаляться и добавлять.
Я пока додумался только до того, чтобы дропать таблицу каждый раз, когда приходят новые данные
Любую задачу можно решить через постгрес.
Любую, это схема one-to-many.
Понял как вычленять строки, в которых title начинается (например) с буквы "П" или заканчивается на букву "а", при помощи LIKE:
title LIKE "П%" OR title LIKE '%а' # Название начинается с буквы "П" или заканчивается на "а"
А как это же самое делать при помощи REGEXP?
Я забил хуй и решил просто перезаписывать каждый раз таблицу
> title LIKE "П%" OR title LIKE '%а'
title LIKE 'П%а'
> REGEXP
Для оракла: SELECT title FROM titles WHERE REGEXP_LIKE(title, '^П.*а$');
Гугл говорит, что в мускл есть функция REGEXP_LIKE(), аналогичная оракловой.
mysql 8 стоит в контейнере докера что настраивает isp на отдельном порту. После половины дня консоли удалось понять что как работает и настроить воркбенч на синхронизацию и просмотр статистики, но ощущение, что часть функций не работает (скрин + другой порт в характеристиках подключения, 06 вместо 10), пытаться решить проблемы или может лучше подождать чистого сервера, настроенного без Lamp? Ну а может лучше попробовать какие-то другие редакторы, ибо этот крайне ограничен? Успел познакомиться с dbForge, но бюджет не выделят пока, да и модель в воркбенче, и так изучать пришлось. isp просит не удалять поставляемый с собой сервер марьи c устаревшей версией, так как по ней он конфигурирует контейнерный докер Mysql 8
Дополнение: подключаюсь к руту, далее рут базы, иначе начинается канитель. Тестовый сервер
Есть очень жирный по памяти select-запрос. Жирный он потому что таблицу на ~ 400к данных мы джойним с самой собой, а затем сверху еще 2 джойна кидаем. При тестах вообще изи улетаем за оперативку, а на проде эта таблица жирнее раз в 8-10, то есть там точно пиздец прям даже если RAM накинуть.
Как быть? Есть идеи разбить 1 запрос на несколько с помощью LIMIT/OFFSET, это вообще поможет? Если нет, то какие варианты?
Можете спросить "а нахуя такие большие таблицы между собой джойнить"? В задаче надо узнать, существует ли в этой таблице (items) другая запись с определенными условиями или же нет.
В зависимости от этого, проставить поле mode. Без self join такое хрен знает как сделать. Я мог бы постараться просто выгрузить эту таблицу целиком в питон и там уже искать есть ли совпадения по условиям, правда хз за сколько это все выполнится, есть подозрения что надо будет ждать несколько часов бля а то и дней.
>Редис же 1поточный. Это ж большой крест, верно?
Тебе что бы выжрать всю однопоточность редиса в одном инстансе нужно очень постараться, для уберхуйлоайда у них кластер есть
Как блядь выделить две таблицы с одной хуйней?
http://www.w3schools.com/sql/trysql.asp?filename=trysql_select_all
Нужно вывести все города(City) из Customersи Suppliers в алфавитном порядке. Я пробовал через Джойн, но походу на сайте из ссылки нельзя блядь это сделать - пишет ошибку. Помогите! Пожалуйста.
Блядь, стоит только задать вопрос, как сам находишь решение? Что это за хуйня?
Три часа сидел блядь, и только задал вопрос на дваче, как через пять минут нашел решение.
SELECT City, Country FROM Customers
UNION
SELECT City, Country FROM Suppliers
WHERE NOT Country='Germany' AND NOT Country='France' AND NOT Country='UK'
Order by city;
ПИЗДЕЦ
SELECT MUSICIANS.GITHUN_NICKNAME FROM MUSICIANS, TRACKS WHERE TRACKS.MUSICIAN_ID = MUSICIANS.ID AND TRACKS.TRACK_NAME = 'Calm';
Подставь правильные названия столбцов, их на картинке не видно.
Спасибо. Пусть у тебя все будет хорошо!
Ставлю очко ОПа что это можно решить оконными функциями. Второй вариант вешать индекс, третий вариант писать процедуру и считать частями.
Решение этого вопроса сильно зависит от того, как эта таблица используется. Вангую самоджоин делается исключительно для того, чтобы реализовать вложенные списки для серверного рендера.
1. Коллекция залуп:
- пустая, чтобы пользователь мог создать коллекцию и только потом складывать в неё залупы когда-нибуть потом.
- с рефами на существующие залупы, чтобы пользовать мог создать коллекцию из существующих залуп.
- с иницализаторами залуп, чтобы пользователь мог добавить новые залупы коллекцией.
2. Залупа:
- должна принадлежать как минимум одной коллекции, так что если в инициализаторе нет инфы о существущей коллекции, то нужно создать пустую и в неё сложить новую залупу. Чтобы пользователь мог добавить залупу и сразу же складывать/добавлять другие в схожую коллекцию.
- Если же есть инициализатор коллекции, то создать коллекцию с него по всем правилам инициализации коллекции и сложить в неё новую залупу поверх.
Всё это конечно должно происходить транзакционно. Сначала пробовал реализовать это на уровне приложения, но малость подохуел от бесконечных итераций по хэштаблицам/массивам их их трансформацией туда и обратно. Потом решил написать портянку из CTE на каждый инициализатор и сейчас так и работает. Проблема в том, что если я захочу, например, добавить таблицу с гондонами для залуп с примерно такой же логикой как иницализация залупы без референсов (т.е. новый гондон -> новая залупа -> новая коллекция залуп), то мне нужно повторять всю логику предыдущих запросов в новом, что не айс в плане поддержки кода. Это юзкейс для хранимых процедур?
Я так понимаю тут нужно делать через JOIN?
Если да, то у меня нихуя не получается, если нет, подскажите пожалуйста через что.
Нужно вывести имена всех людейcustomers, которые покупали морепродукты categories
https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_join
Как блядь это сделать?
можно просто джойнить все подряд, пока не дойдешь до нужной таблицы
SELECT c.CustomerName
from orders o
join customers c on o.CustomerId = o.CustomerID
join OrderDetails od on o.OrderID = od.OrderID
join Products p on od.ProductID = p.ProductID
join Categories cat on p.CategoryID = cat.CategoryID
where cat.CategoryName = 'Seafood'
Вижу в шапке sql-ex и codewars.
Но нет ли более годных альтернатив?
sql-ex смущает тем, что древний как кал динозавра, мне кажется, что в sql уже дохуя было фич новых завезено, хотя могу ошибаться конечно.
codewars супер так-то, я там по питону всякое решал, но вот после питона раздел c sql выглядит заброшенным абсолютно.
Или не бухтеть и жрать что дают?
Мне хочется практики задач на относительно продвинутом уровне, в частности там оконные функции и такое прочее.
иди работать
мне такую шляпу скидывали, не знаю хорошая или нет https://sql-academy.org/ru/trainer?sort=byId
Бамп.
Охуеть.
Пытаюсь вкатиться, изучаю питон и понял, что передо мной стена одного питона, проанализировав рынок понял, что надо уметь бд и через них намного проще вкатиться.
Но вот это '^П.*а$'); просто пиздец синтаксис
Регулярки за полчаса учатся, а на питон у меня ушло несколько месяцев.
Нах нужно S3 хранилище?
В смысле в чем его преимущество перед рсубд или nosql? У нас все спорят, нужно ли нам s3 для нашей биг даты (таблицы постгреса на проде весят под 90 гигов), а я помалкиваю т.к. не шарю а вопросы задавать ссыкую т.к. позиционировал себя как скилового миддла с 2.5 годами опыта (припиздел)
Нужен только облакодебилам, которые не хотят поддерживать инфраструктуру самостоятельно и отдают всё на откуп вендорам.
Чтобы хранить файлы. Причем тут БД я вообще не ебу.
WITH pre AS (SELECT FROM shit),
dt AS (SELECT FROM fuck WHERE dick IS NOT NULL)
UPDATE bitch SET name=sub.nickname FROM (pre JOIN dt ON pre.dest = dt.dest) AS sub
INSERT INTO cunt (name, age, created) SELECT dt.name, dt.age, dt.created FROM dt JOIN network ON dt.loc = network.net
Но блять, постгрес постоянно кидает какие-то ошибки. То он говорит syntax error at or near "INSERT" если я не ставлю ; после UPDATE, а если ставлю то пишет relation "dt" does not exist
Втф? Как правильно выполнять несколько запросов разом через CTE?
В конце cte должен идти 1 запрос епта. Поэтому update тоже оборачивает в cte нах
1. В каком виде хранить картинки? Почитал я статьи там пишут что нельзя хранить пикчи в БД, оно и логично, неужто я могу ограничится тем что просто создам папку куда буду все скидывать а в бд буду хранить ссылку на файл?
2. Насколько бд проста в масштабируемости по вашему? Ну то есть, если я захочу продавать кроме материнок с видюхами ещё и цпу, то мне остается просто добавить таблицу с цпу не меняя все отношения
3. Как хранить пароли юзверей? Тупа в таблице захешировав? Или есть более элегантный способ?
4. Насколько сильно нужна дрочилово с внешними ключами? Я вот ещё слабо понял в их концепциях да нихуя не понял если честно
5. Ну и по индексам такой же вопрос как и в 4-ом
Пиздец задеанонил себя, ну да похуй, не в /b хотя бы
>Какой курс?
2 курс анон
Ну так поможешь? :)
1 - просто путь, да.
2 -
Тут надо много больше табличек, чел.
Для начала корзина, там номер заказа и айди юзера, потом табличка с заказами, где номер заказа, номер продукта, количество.
В продуктах номер продукта, название, ску, описание и прочая залупа, которая есть у всех продуктов. Дальше табличка с типами продуктов и вспомогательная для связи продукта с типом. Дальше табличка с опциями типа сокет, объем памяти и т.д. и вспомогательная для связи продукта с этими опциями. Это навскидку.
3 - соленый хеш + рандомная соль отдельно на каждого юзера, это как сейчас делают, тебе для лабы достаточно просто хеша.
4 - Нужно, это несложный концепт, кури.
5 - Нужно, это более сложный концепт, кури.
>Карабах чей?
Бля чел мы не в /b сидим, дай хоть здесь от этого кала отдохнуть
а так я из казахстана
Спасибо за такой ценный совет, вот со вторым пунктом я точно проебался, спасибо что заметил, тонны чаю тебе
В соседнем треде увидел упоминание NoSQL, гуглить лень, объясните в двух словах, нахуя оно нужно и чем оно лучше SQL.
Про реляционные бд знаю, про sql тоже.
Ничем оно не лучше, у него задачи другие. Реляционные для OLTP (много маленьких транзакций, есть почти во всех приложениях), NoSQL для аналитических запросов, отчётов, временного хранения данных, кешей с быстрым доступом и т.д.
NoSQL - это не название какого-то языка запросов, а просто все СУБД, которые нельзя отнести к реляционным. У NoSQL неи стандартного языка запросов, в кажой такой СУБД свои союственные.
В реляционных БД у тебя таблицы с типизированными столбцами, первичные и внешние ключи, нормализация, джойны и всё сопутствующее. В NoSQL может быть что угодно, например, есть key-value (это можно сказать гигантская мапа, где ты под указанным ключём сохраняешь какой-нибудь объект) и есть документные (когда вместо таблиц у тебя коллекции объектов - "документов" произвольной структуры без схемы, можно думать как о хранилище жсонов).
Это вопросы уровня "чем тойота лучше чем фольксваген?" или "чем go лучше чем typescript?". Nosql баз данных мильярды, есть любые прибамбасы, которые только душе угодны. Но я пользуюсь nosql из чисто прагматичных соображений, потому что ставить sql-базу западло, а за облачную nosql платишь 3 копейки в месяц, она не расходует память сервера. Мне не надо её настраивать, не нужно копаться в конфигах - я подключился и мне заебись.
В плане работы - другая идеология, вот и всё. В sql всё задрачивание идёт на построение запроса, а в nosql всё задрачивание идёт на организацию хранения данных. Соответственно, если ты любишь строить хитрожопые запросы - ты берёшь sql. А если ты любишь хитрожопо хранить данные - то берёшь nosql.
Скорость/масштабируемость у nosql замечательная. Ответ где-то в районе 8 миллисекунд. При чём не важно, сколько у тебя данных в базе, хоть 1 террабайт, хоть 1 мегабайт, по барабану вообще. На производительность не влияет никак.
Существует ли модель данных, которую невозможно представить в виде реляционной модели данных?
Не существует. Сложности всегда только с эффективностью доступа и представлением в виде реляционной модели, например, иногда приходится строить поверх реляционной модели другую модель, где в конечном итоге всё равно все сводится к таблицам и ключам. Нереляционные СУБД берут не потому, что в реляционных невозможно что-то сделать, а потому что для каких-то моделей данных они работают эффективнее, чем реляционные.
Я просто где-то слышал что некоторые сетевые или там графовые модели с рекурсией не могут быть представлены в виде реляционной модели. Поэтому и переспросил, какбэ.
Да, вот ещё, чё-то вспомнилась мне неполнота по тьюрингу языка SQL: https://neerc.ifmo.ru/wiki/index.php?title=Тьюринг-полнота#SQL
и возможность костыльного дополнения с помощью каких-то неведомых расширений, этого языка до тьюринг-полной системы.
Почему тьюринг-полнота?
А потому что речь о представлении любых моделей данных, какбэ,
и если уж моделировать любую модель, то какбэ должна бы быть тьюринг-полнота.
Почему так? Да потому что сильный тезис Чёрча-Тьюринга-Дойча, вот почему: https://ru.wikipedia.org/wiki/Тезис_Чёрча_—_Тьюринга
Дык а если в самой модели рекурсия? Скажем, описание программы с рекурсией - это ли не модель её?
Ты относишь логику программы к модели данных?
Если не относишь, то рекурсия в программе отделена от реляционной модели, никакой связи между ними нет, значит, представить можно любую модель.
Если относишь, то в реляционной модели данных вообще невозможно представить никакую модель данных, там тупо нет понятия логики. Хранимые процедуры также не имеют отношения к реляционной модели. Логика относится к программе и может вообще ничего не знать о том, как данные хранятся, ей не важно, постгрес там или монга.
Это ты тот анон, который пытается впилить sqlite в наноборду?
>Ты относишь логику программы к модели данных?
А, ну да, описание рекурсивной программы - это же не сам рекурсивный процесс её исполнения, это просто данные, ну там описание цикла бесконечного, или описание вызова функции из этой же функции...
Сам процесс выполненения программы - это уже работа с этими данными, то есть как-бы процесс обхода данных в базе данных, и если он бесконечен, как бесконечные циклы, то такой процесс невозможно смоделировать даже на машине тьюринга, исходя из того же сильного тезиса, в контексте непрерывности и бесконечности.
А если процесс исполнения конечен, то это тупо конечная последовательность выполнения элементарных операций, и она может быть представлена в виде таблицы в БД, как описание любого другого конечного процесса.
>Это ты тот анон, который пытается впилить sqlite в наноборду?
Да. Ой блядь, насчёт этой идеи. У меня тут, понимаешь ли, пришло время переустанавливать грёбанный шиндошс. Всё слетело нахуй, и я уже забыл чо хотел там.
Уебунту поставил, mono тоже сбилдил вроде, пароль от гитхаба схоронил...
А вот чо дальше со всей этой хуетой делать - хуй знает, нет чёткого плана, да и интереса как такового, в том числе и финансового - тоже нет, вообще.
Огрызки кода, недопиленные, ну вон они - в бранчах на гитхабе висят, в issues тоже есть некая инфа, я там пилил короче пира, раздающего хэш-таблицу, и отдельно - саму хэш-таблицу KeyValue на sqlite, с Mono.Sqlite.dll. Она и в шинде работает, и в уебунте, какбэ. Но всё это собрать вместе, не получилось, хотите сами въебенькайте, а то меня уже заебало.
Хотя постой. Я же вроде впилил уже сиквелайт где-то тут:
https://github.com/username1565/nanoboard/tree/nanodb-sqlite
вроде робит, и робит вроде норм.
Шо ещё надо?
А, да, хотел короче всю эту хуйню замкнуть на хэш-таблицу, вида:
|hash|ReplyToHash+PostMessage|
и короче приебенить handler в DbApiHandler.cs,
чтобы по хэшам отдавать исходники нанопостов, и так синхрить базу, между live-server'aми.
А потом вообще решил заебенить пира:
https://github.com/username1565/CSharpServers/tree/Peer
чтобы он в локалке находил других пиров мультикастом, и коннектился к ним, и чтобы короче децентрализованно синхрить хэш-таблицу эту, ебучую.
Когда полная децентрализация, то нет центров, а значит нихуя нельзя разбомбить ракетами, и поэтому короче наноборда неубиваемая будет.
А то тут, блядь, всякие над головой летают, всякие иранские дроні-камикадзе shaheed-136 и Mohajer-6, калибры, искандеры, сукка, сверхзвуковіе шеститонные советские ракеты X-22, которые напиздело у народа хуйло, спиздив ещё и ЯО СССР, перед тем как хуйло предало народ СССР.
Так что сливайте бекап наноборды и расшарьте короче всеобщее достояние это, няшное, а то так и будете на подмочухном мейлаче подхуйловском, обезьяне-маме пасскоды покупать, пока она вакабу шатает, образом - пиздец каким обратно-несовместимым.
>Ты относишь логику программы к модели данных?
А, ну да, описание рекурсивной программы - это же не сам рекурсивный процесс её исполнения, это просто данные, ну там описание цикла бесконечного, или описание вызова функции из этой же функции...
Сам процесс выполненения программы - это уже работа с этими данными, то есть как-бы процесс обхода данных в базе данных, и если он бесконечен, как бесконечные циклы, то такой процесс невозможно смоделировать даже на машине тьюринга, исходя из того же сильного тезиса, в контексте непрерывности и бесконечности.
А если процесс исполнения конечен, то это тупо конечная последовательность выполнения элементарных операций, и она может быть представлена в виде таблицы в БД, как описание любого другого конечного процесса.
>Это ты тот анон, который пытается впилить sqlite в наноборду?
Да. Ой блядь, насчёт этой идеи. У меня тут, понимаешь ли, пришло время переустанавливать грёбанный шиндошс. Всё слетело нахуй, и я уже забыл чо хотел там.
Уебунту поставил, mono тоже сбилдил вроде, пароль от гитхаба схоронил...
А вот чо дальше со всей этой хуетой делать - хуй знает, нет чёткого плана, да и интереса как такового, в том числе и финансового - тоже нет, вообще.
Огрызки кода, недопиленные, ну вон они - в бранчах на гитхабе висят, в issues тоже есть некая инфа, я там пилил короче пира, раздающего хэш-таблицу, и отдельно - саму хэш-таблицу KeyValue на sqlite, с Mono.Sqlite.dll. Она и в шинде работает, и в уебунте, какбэ. Но всё это собрать вместе, не получилось, хотите сами въебенькайте, а то меня уже заебало.
Хотя постой. Я же вроде впилил уже сиквелайт где-то тут:
https://github.com/username1565/nanoboard/tree/nanodb-sqlite
вроде робит, и робит вроде норм.
Шо ещё надо?
А, да, хотел короче всю эту хуйню замкнуть на хэш-таблицу, вида:
|hash|ReplyToHash+PostMessage|
и короче приебенить handler в DbApiHandler.cs,
чтобы по хэшам отдавать исходники нанопостов, и так синхрить базу, между live-server'aми.
А потом вообще решил заебенить пира:
https://github.com/username1565/CSharpServers/tree/Peer
чтобы он в локалке находил других пиров мультикастом, и коннектился к ним, и чтобы короче децентрализованно синхрить хэш-таблицу эту, ебучую.
Когда полная децентрализация, то нет центров, а значит нихуя нельзя разбомбить ракетами, и поэтому короче наноборда неубиваемая будет.
А то тут, блядь, всякие над головой летают, всякие иранские дроні-камикадзе shaheed-136 и Mohajer-6, калибры, искандеры, сукка, сверхзвуковіе шеститонные советские ракеты X-22, которые напиздело у народа хуйло, спиздив ещё и ЯО СССР, перед тем как хуйло предало народ СССР.
Так что сливайте бекап наноборды и расшарьте короче всеобщее достояние это, няшное, а то так и будете на подмочухном мейлаче подхуйловском, обезьяне-маме пасскоды покупать, пока она вакабу шатает, образом - пиздец каким обратно-несовместимым.
Это как бы на поверхности. Банально произвольную иерархию объектов уже проблематично отобразить в классических реляционных отношениях, если на не наложить определенные ограничения. Гугли object–relational impedance mismatch.
Да ну, а как же бесконечно-ветвящееся дерево, в виде одной лишь таблицы: |id|parentID|object_content| ?
Или ты имеешь в виду ещё и сами взаимосвязи, между свойствами описываемых объектов?
Хотя опять же, описания объектов - это просто данные, а сами взаимосвязи между свойствами этих объектов, могут быть выражены в виде логики работы программы, а не в виде реляционных связей.
Можно, конечно, использовать РСУБД для хранения данных в EAV ( https://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model ) Но это уже не реляционная модель. Это просто способ хранения EAV модели. У почти все операции реляционной алгебры сразу нахуй идут. Плюс у тебя все ограничения целостности, которая данная модель предоставляет тоже проёбываются. Причём даже на уровне типов.
Реляционная модель это не про таблички, а про отношения и операции и связи между ними. Причём операции в это модели конкретные.
Ещё раз. В виде набора табличек, да, можно почти любую модель данных представить. Но если ты над ней не можешь выполнять операции реляционной алгебры - то это уже не реляционная модель.
У меня есть три таблички A, B, C. Когда я добавляю данные в таблицу A или B, у меня автоматом конкретно выбранные столбцы из этих таблиц попадают на новую строку в таблицу С
Анончик как это делается? И насколько разумно её пользоваться? Подскажи пожалуйста
Я перефразирую вопрос. Можно сделать так чтобы в один столбец могли писать несколько таблиц. Условно таблица №1 сделала запись, а когда таблица №2 будет делать запись то она запишет в следующую строку
Триггеры там какие-то есть, вроде что-то подобное можно делать, сам не пользовался.
>Я перефразирую вопрос. Можно сделать так чтобы в один столбец могли писать несколько таблиц.
Конечно можно, при инсерте создаёшь создаёшь строку в таблице, получаешь её уникальный идентификатор и передаёшь его в другую.
>Ответ где-то в районе 8 миллисекунд.
А потом секунд 10 проверяешь целостность данных на уровне приложения.
>А потом секунд 10 проверяешь целостность данных на уровне приложения.
Чё так проверять? Модель импортируешь и всё. Mongoose там какой-нибудь или dynamoose/dynamodb-onetable.
Это называется хранимая процедура или триггер (они могут быть довольно-таки страшненькими, вот посмотри на рисунок). Имеет смысл этим пользоваться в том случае, когда резервная копия базы данных создаётся не ночью раз в сутки, а прямо во время изменения данных в таблицах.
То есть, например, к каждой таблице добавляется таблица "history" с теми же столбиками и ещё несколькими (каким было действие, кто его выполнил и когда) и при каждом добавлении/изменении/удалении в таблицу "history" сбрасывается предыдущая версия строки из основной таблицы.
Или, например, создаётся вторая точно такая же база данных (на другом сервере) и при каждом добавлении/изменении/удалении строки в таблице в такую же таблицу в другой базе данных отсылается новая версия изменённой строки.
Это называется построчное резервирование, incremental backup и т.д. Подробности:
http://www.r-5.org/files/books/computers/languages/sql/nosql/Eric_Redmond_Jim_R_Wilson-Seven_Databases_in_Seven_Weeks-EN.pdf
Нажать Ctrl+F и поискать фразу:
Finally, we create our trigger to log changes after any row is updated.
А если твой вопрос был в том, чтобы добавить строку в одну таблицу, получить её первичный ключ "id" и затем добавлять строки в другие таблицы вместе с полученным ключом "id" (где он будет уже внешним ключом), то это называется get last insert id и есть в справочном руководстве по любому языку погромирования.
И никак нельзя пройти мимо книги "Изучаем SQL" (Алан Бьюли), это самая скачиваемая книга с сайта и когда-то мне её очень недоставало!
Как же орут в переговорке, пиздец просто
На уровне запросов то же самое, а хранимки под неё пишутся на другом диалекте.
Анончики, как мне сделать count всех таблиц что у меня есть и вывести это всё красивенько?
Словарь данных. В каждой СУБД свои механизмы.
Конечно, свидетели nosql любят заливать про БЕСКОНЕЧНЫЙ ГОРИЗОНТАЛЬНЫЙ РОСТ, ОХУЕННУЮ СКОРОСТЬ, ПРОСТОЙ, УДОБНЫЙ И ПОНЯТНЫЙ АПИ, а как копнёшь, то сразу всплывает анальный вендорлок, самопальный язык запросов и игнорирование ACID.
Стаковерфлов предлагает костыли ебаные: передавать массив, передавать название таблицы строкой, создавать AGGREGATE FUNCTION и подобное. Пиздец какой-то.
Надо сджойнить таблицу на 200 млн строк саму с собой.
В постгрес мы просто улетаем за память и пиздец. Переработал и теперь хожу в цикле - джойню эту таблицу саму с собой но по чанкам - по 100к строк за раз - теперь это все по памяти терпит но выполняет сцуко долго
Подозреваю для такого лучше просто использовать нечто другое а не постгрес. Что и как юзать?
Вопрос от тупово вкатуна
Есть таблица тредов с какой то инфой внутри
Есть таблица с постами, в них хранится дата, ид треда и ещё какая то инфа
Нужен запрос написать который бы вернул треды отсортированные по датам последнего поста
или такое на чистом sql не пишут, а ручками треды сортируют?
делаешь выборку [тред|дата последнего поста] с помощью группировки и агрегатных функций, добавляешь сортировку
SELECT
thread.id AS thread_id,
thread.name AS thread_name,
last_post.date AS last_post_date
FROM threads as thread
JOIN
(
SELECT
post.thread_id AS thread_id,
MAX(post.created_at) AS date
FROM posts
GROUP BY posts.thread_id
) AS last_post ON last_post.thread_id = thread.id
ORDER BY last_post.date DESC;
Спасибо,теперь понял как такое делать
> кто так запросы-то пишет?
Успешные, здоровые люди, которые могут воспринять и распарсить у себя в голове абзац плотного текста. А ты - зумер с клиповым мышлением. Если в тексте больше трёх слов - теряешься, паникуешь.
Дед, спок. Ты же понимаешь, что когда компания наймет несколько зумеров и они переработают твой говнокод, сделав его пригодным для рефакторинга любым человеком, то окажется, что твои знания на уровне нынешнего 2 курса нахуй не нужны и ты пойдешь на досрочную пенсию из компании?
Всё понятно, просто форматирование хуёвое. Я иногда так пишу, когда нужно не забыть мысль и по-быстрому составить запрос, но потом всегда привожу к читаемому виду. Хуйня по сравнению с запросами на 500 строк для всяких отчётов.
Работу делаешь ты. А я тебе зарплату плачу. Если хорошо работаешь, офк.
Дайте премию еще 10к плес, мне на аквариум не хватает
Отвечаю на этот пуст спустя 2 месяца кажись (?).
>>450718 этот скрин тоже я оставлял. Он как раз из пдф-ки курса Дальневосточного универа, который мне повезло проходить бесплатно за счет того что я безработный сыч (по бумагам, фриланс наше государство не учитывает).
Короче. Оконные функции у нас как раз одна из последних тем. Табличные выражения и всякие вложенные запросы тоже проходили. Всякие методы для работы с временем, всякие IF и CASE тоже прошли. Все эти лефт, райт, кросс джойны и прочее, групповая выборка, корректировка данных (создание новых таблиц на основе старых, изменение содержимого таблиц, удаление строк, связывание таблиц через внешние ключи и прочее).
Вот блин а где почитать про "изолирование транзакций"? И вообще накидайте редких тем, которые можно/надо подучить на джуна чтобы знать какие примерно каверзные вопросы могут спросить на собесе.
Всем спасибо заранее.
https://stepik.org/course/63054/info
Я как раз его прохожу сейчас, только расширенную версию.
Declare @JSON varchar(max)
Declare @QUERY varchar(max)
Declare @PATH varchar(260) = 'D:\MY_JSON.json';
set @QUERY = 'SELECT @JSON=BulkColumn FROM OPENROWSET(BULK ''' + @PATH + ''', SINGLE_CLOB) AS [Json];'
exec @QUERY
Пишет - Необходимо объявить скалярную переменную "@JSON"
Шо, я же её в самом начале объявил. Что ему ещё надо?
Не надо блядский CHECK использовать. В базе данных никакой логики быть не должно, только данные
В одно рыло - это когда знаешь, что за неочевидная логика скрывается в очередном триггере или в констреинте на столбец. И исходник просто так хуй посмотришь, всё хранится в базе. Как только на проекте появляется хотя бы ещё один разраб, поддержка превращается в ад.
Предметная область оценки по предметам в университете, у меня получается так, что учебная дисциплина может быть разной, в зависимости от семестра. То есть в бд, матан за 3 семестр и 4 семестр должны отличаться.
Но как это по человечески сделать не знаю. На ум приходят только отдельную таблицу с семестрами хранить, которая будет хранить год + булеан, второй это семестр или первый.
Выглядит как то костыльно, но лучше ничего на ум не приходит
Так в динамическом запросе ты ее не объявлял, он же выполнять будет только то, что в строку ты вписал
А семестров сколько? 2? Ну и сделай тоже через INT - 1 и 2, первый и второй семестр. Булеан тут логически не очень подходит.
Тогда можно вообще забить на такую вещь как семестры. Просто в табличку Task добавить строчки Date куда будешь в стандартном формате даты заносить время получения и сдачи-выполнения задачи. И потом уже из этих временных отметок можно будет и год и семестр и прочее извлекать.
Где найти норм гайды по OrangoDB? Ни книг, ни ресурсов, ничего... Одни жиденькие доки
Первый раз про эту штуку слышу
А все, нашел какие-то
Кто-то в курсе чем отличается знак <> от обычного != в postgresql? есть какие-топ подводные при использовании одного и другого?
Одно и то же. Просто <> есть в стандарте SQL, а != нет.
> Как именно осуществить выгрузку\загрузку?
database migration service погугли. есть большая вероятность, что это ван стоп шоп для твоих нужд
про динаму не скажу, но с RDS MySQL в RDS Postgres должно быть относительно прямолинейно перекатить с помощю DMS
>Как спланировать и осуществить миграцию, чтобы все прошло гладко?
Блин, чувак, это есть в доках амазона.
https://aws.amazon.com/ru/blogs/big-data/near-zero-downtime-migration-from-mysql-to-dynamodb/
Там есть инструмент называется database migration service. Он замороченный, поднимает дополнительный инстанс и делает репликацию в реальном времени. Нужно только написать правильный маппинг. Единственный геморрой что там много надо пердолить настройки - vpc поднять, роли создать, source/target создать, migration инстанс поднять, целая история короче.
Либо второй вариант -> делать дамп в S3 и помощью AWS EMR делать конвертацию. Но это на порядок сложнее.
>>489914
>есть еще табличка (или что там у них) в DynamoDB, в которой, что интересно бля, все более менее реляционно
Как понять "реляционно"? DynamoDB базу надо уметь грамотно проектировать, чтобы выхлоп получить. У неё принципы работы другие совершенно, не такие как у MySQL.
И может еще что-то такое оптимизаторское.
Что будет с редисом если в него запихать больше данных чем оперативка?
Будет ли он их складывать на диск?
У меня есть 200ТБ данных KV которые мне надо чтобы пользователи оперативно получали. Я бы хотел их кое как шардировать какую базу выбрать для того чтобы было это поудобнее делать, монго имхо оверкил слишком сложна.
Можно попробовать потсгрес с хэш индекасами и\или каойнибудь динамодб или левел дб есть у кого опыт?
Гугли про виртуальную память.
Будет то же, что при попытке юзануть в своей программе больше ОЗУ, чем имеется: начнёт юзаться своп на диске (если он настроен), а вместе с этим начнутся дикие тормоза. Ну а потом свалится из-за нехватки памяти.
По задачам. Редис для кешей, очередей или временных данных, а не полноценная key-value СУБД.
Был бы silver bullet, никто бы не юзал другие СУБД.
Я благодарин
Точно, какой же я тупой, господи
Есть 2 запроса:
SELECT s.id, loc.id
FROM
sourcing AS s JOIN location AS loc
ON s.id = loc.id
WHERE loc.index = 1
И
SELECT s.id, loc.id
FROM
sourcing AS s JOIN (SELECT l.id FROM location AS l WHERE l.index = 1) AS loc
ON s.id = loc.id
Результаты одни и те же, но какой из этих запросов производительнее? Обычный или топ что через subquery? Допустим возьмем postgres как РСУБД
А если во втором query вынесу этот подзапрос в CTE?
>наймет зумеров
После которых всегда приходится переписывать код?
>рефакторинг
Нахуя?
>знания на уровне нынешнего 2курса
В голос - современные выпускники вузов слабее птушников 20летней давности
Обезумевший от эффекта свининга-хрюкера поридж совсем ебанулся. Тебя в принципе даже к мс-офис нельзя подпускать.
>зумеродебил не может прочитать две строчки легаси
>РРРЯЯЯ ДЕДЫ ТУПЫЕ
Пынинское образование. 20 лет. Итоги.
Ты же имбецил нахуй, имбецил клинический, буквальный, а не просто оскорбление, тебя либо твоя пидорашья мать в детстве йодом не кормила, либо что то другое органическое, у тебя же когнитивные способности как у собаки, тебе не то что с данными нельзя работать - ты бы охранником критические когнитивные ошибки выдавал и тебя выпиздовали бы нахуй на пенсию по инвалидности
Ой блядь. Просто пиздец. Мелкий орк ебаный. Поколение пынявого хуесоса - отличается от предыдущих даже биологически. Вас только в цирке уродов показывать.
Надо валить из этой страны нахуй, тут орочий союз скуфов-собяниномишустиных и йододефицитных пердежей нахуевертил уже столько в любой сфере жизни или общественном институте что точка неспасения пройдена. Системный отказ, раковая опухоль, и любое действие не важно с какими намерениями его теперь только ускорит.
Съеби из треда лучше, а не сри
SELECT g.Name, count()
FROM tracks t
JOIN genres g ON t.GenreId = g.GenreId
GROUP BY t.GenreId
ORDER BY count() DESC
LIMIT 1;
И оно работает, но потом я решил, что сортировка это обычно медленно (~O(nlogn)), а поиск минимума быстро (O(n)), сделал вторую попытку
SELECT g.Name, max(cnt)
FROM (
SELECT count(*) as cnt, t.GenreId as gid
FROM tracks t
GROUP BY t.GenreId
)
JOIN genres g ON g.GenreId = gid;
И возникла пара вопросов:
1.Гарантируется ли то, что вызове max() остальные столбцы будут принадлежать строке с max значением (ну т.е. максимальное cnt будет 100, а gid не возьмется из другой группы)
2.Есть варианты лучше?
1. Нужны ли триггеры в контексте моего проекта? Если да то каких? Если нет то почему?
2. Знаю jmeter и java+jdbc, думаю оценить работу БД под нагрузкой, хочу удостоверится что схема БД обеспечивает целостность данных. Скажите насколько обосновано мое решение?
3. Думаю для каждого товара давать шестизначный артикул в формате 123456. Но я хз как можно это в постгресе сделать, думаю код генерировать на стороне сервиса а в базе по минимуму держать логику. Насколько тоже это решение обосновано?
Так же прошу анончиков накидать советов.
Целую в пупочек за помощь
нихрена не понял чел
Есть способ сделать это быстрее?
Нет. Да и смысла в нем нету наверно. Там по сути енум с 5 возможными значениями.
А индекс для внешнего ключа? И фильтруешь ты только по этому полю или ещё каким-то? Не запрашиваешь же ты все записи для одного возможного значения, их же десятки тысяч может быть. Если фильтруешь по другим полям, на них должен быть индекс из нескольких столбцов. Надо смотреть план запроса в EXPLAIN, там не должно быть seq scan по большим таблицам.
Ну я делаю выборку через рекурсивный with. Получаю временную таблицу в которой есть айдишник другой таблицы. Из этой временной таблицы мне нужны сущности, которые определяются одним полем в другой таблице.
Даже если я на внешний ключ изначальной таблицы надену индекс, он никак не будет работать(насколько я понимаю) в выборке, выданной cte.
>Надо смотреть план запроса в EXPLAIN, там не должно быть seq scan по большим таблицам
Ну это понятно, не ясно как. Кстати explain analyze execution time вообще выдает мне 300 секунд.
Смотрите. Есть PostgreSQL
Есть примерно следующего вида таблица:
ID : int
SerialNumber: TEXT
AppID: int
Port: int
Address: int
Так вот. Что нужно
Нужно чтобы при INSERT'е - AppID, Address - брались из "дырок", либо следующий; а Port - так же из дырок, либо из переданного массива. И чтобы при этом - оно было потокобезопасным. Т.е. можно было сделать 100 инсертов из разных потоков, и оно вставилось.
И я не знаю как сделать чтобы это работало потокобезопасно. Сейчас - костыль на уровне приложения, который ебашит очередь и по этой очереди - добавляет. Но это пиздец как медленно. 1000 записей - добавляются почти минуту. Пиздец же.
create type entity_init AS (
id bigint,
items json
)
Где джейсон - массив объектов.
Как джейсон массив из этих типов размотать в набор записей этого вида:
(
id bigint
item json
)
То есть условный массив из 5 типов, в котором 5 сущностей должен превратиться в набор из 25 записей с сохранением референсов.
Ну. Портов всего 65535... Нужно экономить...
Ну и Address с AppID - используются сторонними системами, а они не очень хорошо воспринимают дырки.
Ну так сделай таблицу на 65к строк и селектом выбирай близжайший свободный порт, а при ошибке вызывай реселект.
хз схема вроде норм выглядит
Есть запрос:
DELETE FROM store WHERE id IN (:IDS_STRING)
Вместо IDS_STRING подставляем строку айдишников - перечисление через запятую. В таблице store несколько десятков миллионов записей. Вопрос, дорогие знатоки: какие подводные если там будет 10.000 айдишников? миллион? 10 миллионов? Какова там будет сложность? Условный постгрес не пережрет все ресурсы по памяти и cpu?
В некоторых СУБД максимальное число элементов в таких списках ограничено, тупо будет ошибка.
Разве IN в постгресе не требует набор строк (которые не string, а row)? У тебя скорее приложуха обосрётся интерполировать строку с 10 миллионов записей, вместе с постгресом.
Подскажите какое-нибудь мнемоническое правило, которое позволит запомнить уровни изоляции транзакции и когда какой уровень выбирать при запросе к СУБД.
На собеседованиях постоянно спрашивают все уровни изоляции транзакции, различие между ними и когда какое выбирать, чтобы добиться консистентности и скорости выполнения запросов.
Что еще спрашивают?
INSERT INTO table_name_1(column1, column2, …)
VALUES (value1, value2, …) RETURNING id;
Дальше мне нужно сделать ещё одну вставку, но уже в другую таблицу, взяв id того запроса который выполнил до этого.
BEGIN;
INSERT INTO table_name_1(column1, column2, …)
VALUES (value1, value2, …) RETURNING id;
INSERT INTO table_name_2(column1, column_id, …)
VALUES (value1, id, …);
COMMIT;
И вот как сука взять id с первого запроса чтобы можно было его вставлять в другой запрос?
Я правильно понимаю, что они обосрались с диаграммой?
Тут жанры должны быть родительской сущностью вместо фильмов. Да и вообще, там должна быть неопределённая связь между сущностями, т.к. множество фильмов может включать множество жанров, и наоборот. Тогда надо разрешать эту неопределённую связь третьей сущностью.
А сейчас там какой-то бред получается: ID фильма кочует в таблицу жанров, количество жанров очевидно меньше фильмов и когда жанры закончатся, таблица жанров начнёт заполняться NULL.
Нет, всё там нарисовано правильно. Жанры ничего не знают о фильмах, а фильмы знают, к какому жанру они относятся, и ссылаются на запись в таблицу жанров через столбец genre с внешним ключом на genres.id. К слову, название столбца "genre" сбивает с толку, его лучше было назвать genre_id.
> Да и вообще, там должна быть неопределённая связь между сущностями, т.к. множество фильмов может включать множество жанров, и наоборот. Тогда надо разрешать эту неопределённую связь третьей сущностью.
Наверняка для примера упростили. Не будут же про связь "многие-ко-многим" писать в самом начале основ SQL.
Да, чет я не подумал, что там ссылка идёт на genres.id. Но я бы всё же наверное стрелочку повернул, чтобы фильмы зависели от жанров. Тогда бы не нужно было создавать этот альтернативный ключ films.genre, он бы сразу шёл из внешним ключем из таблицы genre.
Фильмы и так зависят от жанров, стрелка показывает на зависимость. Просто такое обозначение. Если бы в таблице genres был внешний ключ, в ней пришлось бы создавать кучу одинаковых записей с одними и теми же жанрами для разных фильмов, и о нормализации пришлось бы забыть.
Да, чот мне на курсах дальневосточных лучше объясняли. Там сразу рассказывали про всякие внешние ключи и писали сразу genre_id, а не обычный id что немного с толку сбивает.
Постгрес нужен как оракл для бедных, sqlite как встраиваемое хранилище конфигов для десктопов и мобилок, остальное не нужно.
Ты сейчас оухуеешь но строку можно сформировать тем же питоном:
IDS_STRING = ', '.join(ids_list)
а потом при помощи интерполяци строк подставить в итоговый query:
f'DELETE FROM store WHERE id IN ({IDS_STRING})'
И да, это был не джун. А мидол с заявками на сеньора
Индекс - преждевременная оптимизация. Если у тебя меньше 20К строк в таблице то можно ставить анус что планировщик так и не задействует index scan.
Ещё, небось, и uuid вместо автоинкремента.
>Если у тебя меньше 20К строк в таблице то можно ставить анус что планировщик так и не задействует index scan.
когда как.
Ну а ты в свою очередь поставил бы поставить анус, на то, что через год там будет все еще меньше 20k?
PostgreSQL
Хочу такую систему, что инсерт происходит в два этапа:
1. Сначала во временную таблицу, откуда их можно прочитать, показать пользователю, а потом спросить, будет он их коммитить или нет
2. Собственно, в основную таблицу из временной.
Можно ли рассчитывать на какую-то помощь от бд? Удобный импорт из временной таблицы в основную одной командой, если у них схемы совпадают, например? Или создать временную по образу постоянной?
Или придётся всё на фронте лепить, читать из временной, записывать в постоянную?
Инфы по этому поводу что-то не особо нашёл.
Речь не про two phase commits, если что.
Никто так не делает. Все сначала загружают предзаполненную сущность с сервера, её поля показывают пользователью, а когда пользователь подтвердит, тогда и записывают.
>Сначала во временную таблицу, откуда их можно прочитать, показать пользователю, а потом спросить, будет он их коммитить или нет
Умные дяди придумали давно такую вещь как NoSQL
При том что ты хочешь возложить на постгрю те функции, для которых она не предназначена
Ты не понял что ле? Сохраняешь в монге/редисе свои ебучие данные, после тог окак юзер нажмет подтверждение, пишешь их в постгрю и чистишь кеш
>. Сначала во временную таблицу, откуда их можно прочитать, показать пользователю
Какую-то хуйню придумал.
Но если ты все же сможешь в своем ПО изобразить длинную транзакцию, которая держится, пока пользователь просматривает диалог, то можешь использовать CREATE TEMPORABLE TABLE.
В чем проблем?
Эти все штуки просто задолго до расцвета веба возникли. Для обычного десктопного софта все, конечно,придумано.
>Никто так не делает.
>Следующим предложением литералли описывает, что я хочу сделать.
>Все сначала загружают предзаполненную сущность с сервера, её поля показывают пользователью, а когда пользователь подтвердит, тогда и записывают.
чё
Да, как раз думаю, что-то маловато в моём проекте софта для баз данных, надо ещё один добавить.
Ещё хорошо бы, чтобы у них семантика отличалась, чтобы на предворительной транзакции невозможно было проверить, сожрёт ли постгрес эти данные потом. Всё проверил всё тебе нравится, дорогой пользователь? Ах, погромист не предусмотрел это минимальное различие между постгресом и редисом, вот тебе полный рот ошибок, вместо подтверждения.
Пишу вот это:
CREATE TABLE delivery (
delivery_id serial PRIMARY KEY,
address_id int references address(address_id) not null,
time_range text[] NOT NULL,
staff_id int REFERENCES staff(staff_id) NOT null,
status del_status NOT NULL DEFAULT 'в обработке',
LAST_UPDATE timestamp,
CREATE_date timestamp DEFAULT now(),
deleted boolean NOT NULL DEFAULT FALSE
)
А в ответ получаю:
SQL Error [42830]: ERROR: there is no unique constraint matching given keys for referenced table "address"
Что не так?
address.address_id должен быть первичным ключом или иметь уникальный констреинт. Судя по ошибке, у тебя нет ни того, ни другого.
>А чего ты ожидал?
В первом посте написал, чего ожидал.
>Временные таблицы за тебя фронт что ли сделают?
За меня никто не сделает, просто придётся весь алгоритм на фронте расписывать вместо:
- эй постгрес, эхо мне вот эти данные вот в эту табличку, но пока не коммить
- ага, всё норм, заливай/не не норм, дропай
Так прихуярь к ним флаг "записи не проверены", если всё ок - апдейтишь на "проверены", если не ок - делитом ебашь по этому полю.
Есть LocalStorage. Все прекрасно хранится в нем
Хмм.. Да, тоже нормальная идея. Хотя тогда ко всем существующим запросам придётся добавлять, чтобы только проверенные данные выдавали. И не хотелось бы, таблицу метадатой поллютить, но можно отдельную табличку с этим сделать. Подумаю над этим, спасибо.
попробуй SET DEFAULT или SET NULL
Будет один бот на java, он каждый день будет чекать цены товара и записывать их в базу sqlite. Список проверяемых товаров может меняться. Нужна возможность делать выборку цен по дням.
Как спроектировать таблицы/свойства, что бы было меньше гемора с выборкой? На каждую дату отдельную таблицу? Или для каждого товара сделать свойство "дата". Как организуют такое по уму?
Пока в базе есть только общий список возможных товаров.
Одна табличка с товарами, вторая товар-дата-прайс.
IIF('' <> SELECT value FROM settingsValueTable WHERE nameValue = 'newFrequency', UPDATE settingsValueTable SET value = SUBSTR(value, 1, LENGTH(value) - 1) WHERE nameValue = 'newFrequency' RETURNING , SELECT FROM settingsValueTable WHERE nameValue = 'frequency');
Чето не выходит
Слышал что в эластике есть анализатор языка, и можно ли как то в доках создать доп. поля на других языках и используя анализатор языка elasticsearch дергать определенное, в зависимости от языка в запросе? Если есть такая возможность, дайте, будьте добры, ссылку. Я вроде бы что-то и ищу, но это походу не то что мне нужно. Спасибо.
эта ебалайка совершенно контркультурна к СУБД.
Изначально была просто либа на яве, потом из нее сделали продукт для безопасников, но субд она так и не стала.
Но да, ты можешь в Индексе создавать еще "поля".
Если плохо гуглится (А ты вообще гуглил?) тебе нужно просто потерпеть и адаптироваться к тому, что в гугле много информации о старом способе работы с индексом - через веб апи.
Но потом у них появилось что-то типа SQL. Сосредоточься на нем
Вот я сидел изучал, по идее должна работать эта строка, но она не работает
SELECT * FROM students WHERE id = CASE WHEN '' <> (SELECT name FROM students WHERE id = 1) THEN (UPDATE students SET name = SUBSTR(name, 1, LENGTH(name) - 1) WHERE id = 1 RETURNING id) ELSE 2 END;
На пиках результат работы
Надо что бы если было либо "NOT SELECTED" лмбо то значение что ввел юзер в БД.
То есть 113-115 строки заполнены нормально, т.к. там ничего не задано, а вот 83-85 дублируются.
БД - PostgreSQL
Таблица g-feature относится как O2M к g-value
В общем есть БД, схема на 4 скрине. В центре таблица пробитых чеков в магазинах. Мне нужно сделать выборку как на 3 скрине. То есть выводить показатели типа общая стоимость, наценка, маржа итд по каждой дате в каждом магазине для каждого товара. Это я сделал и вроде бы правильно.
Проблема в последнем столбце. В нем я должен выводить, какой процент от общего числа продаж в этом магазине за эту дату в этой группе товаров занимает каждый товар. То есть например всего за такое-то число в магазине номер 1 было продано БАДов на 10000 руб, а какого-нибудь там фуфломицина на 1000 руб, значит в последней графе будет 10%.
Трудность в чем: в процедуру может передаваться список необходимых групп товаров, и мне нужно выводить данные по этим группам. На втором скрине код, который разбивает полученную строку и помещает значения в таблицу-переменную.
И я никак не могу понять, как передать в подзапрос, считающий общее количество продаж, как бы текущую группу продаж, по которой сейчас идет основной запрос. На 3 скрине можете заметить, что у БАДов и у Косметических средств у меня одно и то же значение в последней графе. То есть он не берет в расчет группу товаров. (я знаю, что там должен быть процент, просто для упрощения я пока только сумму вывожу, потому что в ней проблема).
Ну вот. Подкиньте идею плз, если поняли, че я написал. Второй день уже ебусь.
3 иерархические таблицы с one-to-many (самый просто случай) в среднем 1 к 10, и в верхней таблице достаточно 200 записей
>>503651
Ты пытаешься дрочить БД бизнес-логикой, которая должна быть на уровне приложения. Добавь в свою таблицу published_at TIMESTAMPTZ и триггер, который проверяет нуловое значение этой колонки при апдейте, и не еби мозг.
Убедил коллег в удобстве yaml. Вопрос неактуален
Поясните по братски на сколько лучше доступ к таблице по кластерному индексу с низкой селективностью = низкая избирательность = остаётся много строк после наложения условия лучше доступа по обычному индексу?
Потому что один долбоёб когда-то так перевёл, не зная слова "повторимый", а остальные повторяют за ним как попугаи.
Бамп вопросу
Я не мега-омега эксперт в оптимизации, но по мне так тут больше партиции помогут.
Где, тут?
вмысли "насколько" ?
ну сгенери похожие на твои данные и померяй.
Тебе никто не отвечает потому что вопрос тупой.
Администраторы баз данных / DBA.
И разработчики на всяких PL/SQL, T-SQL, PL/pgSQL, которые пишут всю логику приложения на хранимых процедурах, в основном это легаси или специфичное типа OLAP.
Меня терзают сомнения, а возможно ли сделать это без джойнов, одними селектами? Не вдупляю, как впихнуть селекты вместо полей, ну типа
>select pole, select()... from...
так что ли?
>Меня терзают сомнения, а возможно ли сделать это без джойнов, одними селектами?
Тебе для сравнения данных с нескольких таблиц в любом случае придётся джоины делать, даже неявные.
Альтернатива - вложенные селекты по типу SELECT id, name AS department name FROM "Department" WHERE id IN ( SELECT ... ).
Нормализация и джойны именно для такого и придуманы.
Вот вводные:
Есть две таблицы, для них нужно сгенерировать тестовые данные, только вот проблема для меня в том, что после вставки в таблицу #1 нужно взять его айдишник и вставить в таблицу #2. Для генерации я использую generate series(), для того чтобы брать айдишник и вставлять в следующую таблицу я использую CTE (конструкцию WITH AS). Только вот вариант на пикрил работает только если нужно вставить 1 строку (под определение генерации данных слабо подходит как по мне). И как реализовать такой запрос чтобы решить эту проблему? Помогай двощ, а то я с ума сойду((
или забить хуй и написать функцию в котором будет цикл? если что, нужно нагенерить данных не больше чем на сотню тысяч, о десятках миллионов речи не идет, а то ещё накинете йобаскрипт
У меня есть ТАБЛЦА со списком ТАБЛИЦ. Как в подзапрос подставить имя таблицы в поле фром? Что-то вроде этого:
slect
TABENAME
,(
select count(GOVNO) as GO
from ZA.TABENAME
)
from ZALUPA as ZA
Пикрил 1: простой первичный ключ в таблице Customers, внешний ключ в таблице Orders работает, возвращая в конце обновлённые данные.
Пикрил 2: составной первичный ключ в таблице Customers, внешний ключ в таблице Orders не работает, возвращая в конце старые данные.
Почему такое поведение с составными первичными ключами?
хуйня-с, придётся обратится к лунной призме
крик отчаяния
Делал на нём лабы в вузе много лет назад. Большое вообще ни от кого про него не слышал.
В общем сам я околоайти и у меня есть файл.sql весом 42 гига из которого мне нужно вытащить таблицу со столбцами userID, currency, balance, но как на деле они в этой БД названы я не знаю. Есть какой-то простой способ единожды извлечь эти данные?
Антоны, не могу решить задачу. Гугл не помог разобраться.
Есть джве таблицы. Актуальная дата сегодняшняя.
1. Столбцы предмет, локация продажи, цена и дата, когда эта цена была актуальна. Для комбинации предмет/локация может быть несколько строк с ценами для разных дат.
2. Зона и локация в этой зоне.
Необходимо сделать выборку, в которой будут предмет, цена на ближайшую дату к текущей для зоны 1, цена на ближайшую дату для зоны 2, разницу между этими ценами. Всего 4 столбца.
Хз, как это сделать.
Добра анонче. Действительно помогло
находим цены из первого региона
находим из второго
джойним
в селекте цены вычитаем и обзываем разница
должны быть справочники типа all_tab_columns
>>Задачи:
Боже, какое же говно. Задачки как будто по ЯПу, а не по работе с базами данных. Замени букву в стройке, вычисли фибонначии... Где извлечение хитровебанных наборов данных из БД??? Регался там с надеждой на куче новых задачек, остался сильно разочарованным.
Посмотри sql-ex.ru
аноны, тут есть те кто вкатывались к эксель? ищу сейчас работу, но хочу офисобыдлом быть, реально ли выучить за месяц впр гтр чето там сводные таблицы? формулки еще со школы умею делать, а вот sql очень тяжело идет, решил за неделю уже под 30 задач на sqlexe но все еще путаюсь в совсем стандартных вещах
ну и заодно может курс по экселю посоветуйте, чтоли
Эксель не имеет никакого отношения к sql, у мс есть аксес, это такой-сякой заменитель скулайта, хотя он очень сдулся в последние годы. Но сам эксель весьма нихуев, 95% его использования это тупые списки, но там можно наворотить дел при умелом использовании.
я про саму идею баз данных, просто даже для постгреса я тупенький, а вот с экселем вроде неплохо на огэ и егэ было
но в вуз не поступил, ищу работу сейчас
жаль что треда нет для него, спасибо за ответ
Он никак не связан с рсубд, не знаю, с чего ты это взял.
Твоё неплохо это средняя тётя срака с бухгалтерии.
это так( еще везде 1с требуют вместе с экселем, так что даже хз пока, посмотрю что нужно 1сникам знать
Тут суть именно в знании этой бухгалетрской хуйни, всё остальное это лишь инструменты. Надо решить - ты бугхалтер с знанием автоматизации или пограмист с знанием бухгалтерии.
Я вот лет десять зарабатываю на датамайнинге спортивных матчей, хотя про эти виды спорта я знаю чуть более чем нихуя. Но клиенты получают профит. Они довольны и я доволен.
нужна помощь с методом решения моей задачи, запрос напишу сам, но объясните, какие именно операторы или методы помогут или могут помочь. т е куда копать, дальше сам.
есть таблица, упрощенно выглядящая так:
стА стБ
123 НЕТ
123 НЕТ
123 НЕТ
456 НЕТ
456 НЕТ
456 ДА
789 ДА
789 НЕТ
789 НЕТ
и т д
как мне достать все значения стА у которых стБ всегда НЕТ?
пасиба
селфджоин
Учился на ней, моя любимая
id | jsonb
----+---------------------------------------------------------------------
13 | {"Pop": 1, "city": "new york", "food": "apple", "state": "NY"}
14 | {"Pop": 2, "city": "los angeles", "food": "avocado", "state": "CA"}
15 | {"Pop": 3, "city": "buffalo", "food": "apple", "state": "NY"}
Мне надо извлечь из нее все строки, где "food": "apple" и "state": "NY", т.е. 13 и 15 (строки полностью, включая столбец id).
Каким запросом я могу это сделать?
ебать ты хуесос
select jsonb from json_table.
о нифига как можно. спасибо анон за науку
То ли дело набирать макак писать эндпоинты и проверять нулы целыми днями.
Есть ли реальные преимущества у nosql для oltp баз данных?
Какие преимущества и в каких кейсах?
Только инмемори кей-велью для кешей для меня очевидны.
У клепмана читал преимущества графовых. Он там пугал, что обход графа в реляционках можно заменить рекурсивными сте. Но на деле в них ничего особо страшного не оказалось, для простых кейсов вполне норм. Ну конечно если сложные обходы сложных графов или поиск в них, то да. Еще я слышал, что у графовых проблемы с большими объемами.
Какие преимущества у монги перед jsonb вообще не ясно.
Для olap вот бд колоночные(аналитика) и временных рядов(метрики) намного лучше, чем реляционки.
И вообще анончики, расскажите плиз с какими nosql вы работали и для каких кейсов.
Нет у них преимуществ для OLTP. Большинство предметных областей естественным образом предполагает таблицы, доказано тысячами кабанов, ведущих учёт в стопке экселек. При любых попытках юзануть NoSQL для OLTP очень скоро возникают проблемы из-за отсутствия транзакций, избыточных данных и слабоструктурированной схемы. Разве что могут немного ускорить разработку MVP-продукта, и то спорно.
Вот в специфичных задачах типа кешей и OLAP да, без NoSQL сложно обойтись.
ПЕРЕКАТ >>2530219 (OP)
ПЕРЕКАТ >>2530219 (OP)
ПЕРЕКАТ >>2530219 (OP)
ПЕРЕКАТ >>2530219 (OP)
Накидал пока что запрос на выборку всех дубликатов:
SELECT
tt1.ticketdocument_id,
tt1.couponnumber,
tt1.object_id
FROM
t_ticketcoupon tt1
WHERE
(
SELECT
COUNT(*)
FROM
t_ticketcoupon tt2
WHERE
tt1.ticketdocument_id = tt2.ticketdocument_id
AND tt1.couponnumber = tt2.couponnumber
)> 1
Результат на скрине. Теперь нужно удалить все дубли, в бд остались записи с максимальным objectId на каждый ticketdocument_id + couponNumber:
714051911281567336217140519112815673367
714051911281567336227140519112815673368
714051911281567336237140519112815673369
714051911281567336247140519112815673370
Подскажите плз, как это сделать?
Накидал пока что запрос на выборку всех дубликатов:
SELECT
tt1.ticketdocument_id,
tt1.couponnumber,
tt1.object_id
FROM
t_ticketcoupon tt1
WHERE
(
SELECT
COUNT(*)
FROM
t_ticketcoupon tt2
WHERE
tt1.ticketdocument_id = tt2.ticketdocument_id
AND tt1.couponnumber = tt2.couponnumber
)> 1
Результат на скрине. Теперь нужно удалить все дубли, в бд остались записи с максимальным objectId на каждый ticketdocument_id + couponNumber:
714051911281567336217140519112815673367
714051911281567336227140519112815673368
714051911281567336237140519112815673369
714051911281567336247140519112815673370
Подскажите плз, как это сделать?
Проебался с разметкой, вот нужный результат:
Вы видите копию треда, сохраненную 30 января 2023 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.