Обновить
50.28

SQL *

Формальный непроцедурный язык программирования

Сначала показывать
Порог рейтинга
Уровень сложности

Уровень обобщения базы данных

Время на прочтение7 мин
Количество просмотров7.8K
Несколько лет назад я попробовал сделать сайт на такой системе как MODx и мне понравилось, не смотря на опыт работы с другими CMS, а может и благодаря этому. Понравилась именно логика построения работы с ней, принципы структуры данных и многое другое, но в первую очередь, то, что фрилансеру нужно особенно часто – простота и скорость запуска проекта при высокой гибкости. Но, хотя MODx мне до сих пор по нраву, пост не совсем о ней и даже скорее совсем о другом.

Введение


На самом деле я рассматриваю эту cms только как пример, того что присутствует во многих и опенсурс, и коммерческих системах. Просто мне как фрилансеру до недавних пор приходилось работать почти всегда с разработкой сайтов по дешевле и побыстрее – может у других фрилансеров много «жирных» клиентов, я не знаю, у меня не было. Так вот такая ситуация привела к не плохому опыту работы на модыксе. Но открытие собственной компании и дальнейшее подтягивание клиентов с индивидуальными запросами, потребовало вспоминать и улучшать свой лвл в настоящем программировании и построении баз данных. И вот тут я и почувствовал какой-то дискомфорт, что ли, ну как минимум смущение при воспоминании структуры как MODx, так и некоторых других открытых систем. Далее поясняю подробнее, что именно показалось странным, но интересным.

image

Дело в том, что в MODx Revo основным понятием для построения структуры сайта являются ресурсы. Вот именно, там нет такого как, например, в том же Вордпрессе отдельно страницы сайта, отдельно записи блога. Все страницы и записи, и даже много чего еще реализуется через модель ресурсов сайта. На самом деле это удобно, особенно учитывая тот факт, что это cmf/cms, то есть система рассчитана на разработку совершенно разных сайтов и тематически и технически. Таким образом, за всей структурой сайта удобно следить в одной панели управления ресурсами. В общем, система ресурсов позволяет создавать и управлять следующими сущностями сайта (хотел было написать объектами, но в ООП это слово уже занято, так что пусть будет «сущности»):

• Обычные html-страницы;
• Разного рода категории и разделы блога или каталога;
• Товары и их категории;
• XML-документы, например, sitemap.xml для поисковых роботов;
• Текстовые документы, к примеру, robots.txt правильно сделать ресурсом, а не просто залить файлом;
• Json-страницы, которые лично я использую для того же аякс;
• Создать собственный формат текстового файла.

Постановка проблемы


Вот такое объединение множества различных «сущностей» сайта в объекте одной модели Resources и вызвало мой интерес. Разум философа зашевелился и начал выдавать множество предположений и вопросов.

Во-первых, я обратил внимание на пользователей, потому что они сделаны совершенно отдельно от ресурсов. Как бы на первый взгляд это логично, но с другой стороны, если начали такую пляску с объединением кучи всего, почему бы не сделать все до конца. Да-да, максимализм в деле. Тем более, что сделать пользователей как один из видов ресурсов не представляет большой проблемы. В случае с modx это по большей части реализуется с помощью плейсхолдеров, позволяющих расширить количество атрибутов ресурса, и «контекстов», дающих возможность выделять часть ресурсов по их назначению. Реализация же чего-то подобного на фреймворке (я имею ввиду php-фреймворки) или голой связке скриптов и реляционной базы данных совсем дело не сложное.

Во-вторых, совершенно отдельными моделями реализуются шаблоны и вся система представления и настройки сайта. Почему бы их тоже не объединить в одну модель, хотя бы чисто ради эксперимента. Чувствую летящие в меня помидоры.
Читать дальше →

Impact анализ на примере инфраструктуры корпоративного хранилища данных

Время на прочтение8 мин
Количество просмотров14K
В этой статье я хочу рассказать, как можно решать задачу impact анализа или анализа влияния в сложной, многоуровневой инфраструктуре корпоративного хранилища данных на примере нашего DWH в Тинькофф Банке.



Работая с DWH все наверняка задавались хоть раз вопросами:
  • «Что будет, если поменять поле в таблице?»
  • «На каких ETL процессах это скажется?»
  • «Какие отчеты будут затронуты?»
  • «Какие бизнес процессы могут пострадать?»

Ответить на этот вопрос как правило непросто, т.к. нужно просмотреть дюжину ETL процессов, потом залезть в BI инструмент, найти нужные отчеты, что-то держать в голове, помнить о том, что что-то там строится ручным кодом и всё это выливается в большую головную боль.
Даже самое порой безобидное изменение может сказаться, например, на отчете, который каждое утро приходит на почту к председателю правления банка. Немного утрирую, конечно:)

Далее в статье я расскажу, как и с помощью чего можно уменьшить головную боль и быстро проводить impact-анализ в инфраструктуре DWH.

Читать дальше →

Как найти самый длинный непрерывный ряд событий с помощью SQL

Время на прочтение5 мин
Количество просмотров36K
Задача поиска непрерывных последовательностей событий довольно легко решается с помощью SQL. Давайте уточним, что из себя представляют эти последовательности.

Для примера возьмём Stack Overflow. Он использует клёвую систему репутации с наградами за определенные достижения. Как и во многих социальных проектах, они поощряют пользователей ежедневно посещать ресурс. Обратим внимание на эти две награды:



Нетрудно понять, что они означают. Зайдите на сайт в первый день. Затем на второй день. Затем на третий (возможно несколько раз, это не имеет значения). Не зашли на четвёртый? Начинаем считать заново.
Как отследить это с помощью SQL?

Официальный Firebird 3.0 Release Candidate 1 и бета документации для Firebird 3.0

Время на прочтение1 мин
Количество просмотров6.2K
Официальная версия Firebird 3.0 Release Candidate 1 для Windows и Linux (а также исходники) доступна для скачивания на www.firebirdsql.org.

Список новых функций и возможностей можно найти в Firebird Release Notes (идут в составе архива установщиков Firebird).

Для российских пользователей Firebird "Московская Биржа" и наша компания (IBase/IBSurgeon) приготовили специальный, очень приятный бонус — бета-версию документации по языку Firebird 3.0 (PDF).
Полная версия документации ожидается вместе с релизом Firebird 3.0.
И еще — будет второй релиз-кандидат, ориентировочно через месяц.

Игра со списком условий

Время на прочтение4 мин
Количество просмотров6.2K
В этой статье я покажу, что и как можно сделать со списком условий. Я сформулирую небольшую тестовую задачу на основе базы AdventureWorks2008R2 и один из вариантов ее решения.

Пример задачи:

Рассчитать стоимость доставки по факту по следующим условиям (обычная задача для логистических компаний).

Список условий:

  • Доставка в Берлин и Бонн байков
  • Доставка в Берлин и Бонн других товаров
  • Доставка в другие города
Читать дальше →

План обслуживания «на каждый день» – Часть 3: Автоматическое создание бекапов

Время на прочтение8 мин
Количество просмотров33K
Существует великое количество постов, в которых настойчиво призывают к одной простой истине – нужно делать бекапы на постоянной основе. Но люди всегда будут делиться на две категории: кто еще не делает бэкапы, и кто их уже делает. Первая категория, которая пренебрегает такими советами, часто можно встретить на профильных форумах с примерно одинаковыми вопросами:

– у меня полетели диски/кто-то удалил мою базу… как мне восстановить мои данные?
– у вас есть свежий бекап?
– нет

Чтобы не стать героем такой ситуации, нужно потратить минимум усилий. Во-первых, выделить дисковый массив, на который складывать резервные копии. Поскольку, хранить бекапы вместе с файлами БД – явно не наш выбор. Второе… это создать план обслуживания по резервному копированию баз данных.

Что мы и сделаем далее, а после обсудим некоторые тонкости связанные с бекапами.
Подробнее

Неофициальный инсталлятор Firebird 3.0 Release Candidate 1

Время на прочтение1 мин
Количество просмотров8K

Несколько дней назад исходные коды первого релиз-кандидата версии Firebird 3.0 были зафиксированы в репозитории Firebird Project. Обычно проходит несколько недель с момента фиксации исходного кода до выпуска официального инсталлятора, поэтому мы в IBase.ru выпускаем неофициальный инсталлятор,
Читать дальше →

Передача параметров в динамический запрос в T-SQL

Время на прочтение2 мин
Количество просмотров43K
Я не раз сталкивался с необходимостью построения динамического запроса и здесь есть ряд подводных камней о которых я расскажу ниже. Пример динамического запроса:

declare @sql varchar(100) = 'select 1+1'
execute( @sql)

1. Запуск строки через Execute создает отдельный блок кода, в котором текущие переменные будут не видны, но видны все временные таблицы.

2. Обратите внимание на передачу переменных со значением NULL. Любое слияние с NULL в результате даст NULL, следовательно, вместо запроса, вы можете получить пустую строку.

declare @i int
declare @sql varchar(100) = 'select ' + cstr(@i)
execute( @sql ) -- Ошибка

3. Передачу дат и времени. Даты лучше передавать в формате ГГГГММДД. При передаче параметров со временем следует обратить внимание на потерю точности. Для сохранения точности значения лучше передавать через временную таблицу.
Читать дальше →

Библиотека, помогающая преодолеть концептуальный разрыв между ООП и БД во время тестирования при использовании ORM, — LinqTestable

Время на прочтение5 мин
Количество просмотров11K
Как известно, между объектно-ориентированной и реляционной моделью существует концептуальный разрыв, преодолеть который не в состоянии даже ORM. В основном этот разрыв влияет на то, что при использовании реляционной базы данных мы вынуждены работать над множествами, а не над конкретными объектами. Но есть и другой фактор: поведение NULL в бд отличается от поведения NULL в объектно-ориентированных языках. Это может стать проблемой, когда вы используете один и тот же запрос в двух ситуациях: 1) при запросе к бд 2) при юнит-тестировании, когда вместо таблицы из бд используется массив в оперативной памяти. Более того, это может стать проблемой, если вы обращаетесь только к бд, но мыслите о NULL в терминах ООП, а не реляционной бд!

image
Читать дальше →

Параллельная обработка большого селекта в нескольких сессиях

Время на прочтение10 мин
Количество просмотров22K
Представьте: есть селект, который возвращает записи, каждую из которых нужно обработать, и то ли много записей, то ли обработка каждой записи занимает много времени, а процесс обработки одной записи не зависит от процессов других записей.
Классический пример для того, чтобы задействовать многопоточность или в случае баз данных выполнять обработку в нескольких сессиях. В Оракле для этого используется hint /*+ parallel() */ и pipelined functions. Это здорово, но если у вас Oracle standard edition(где parallel не работает) или вы хотите обработать не каждую запись по отдельности(из соображений, что лучше накопить работу, а потом в bulk, одним ударом, выполнить), а поделить весь вывод селекта на куски и каждый обработать отдельно?
Читать дальше →

Доступна 0xDBE 1.0 Preview

Время на прочтение4 мин
Количество просмотров23K
JetBrains приближается к релизу новой IDE для работы с SQL и базами данных. Мы запустили EAP программу год назад и благодарим всех её участников. Как всегда, ваши мнения и пожелания сделали наш продукт лучше.

Мы рады представить вам 0xDBE 1.0 Preview. Это отличный шанс попробовать нашу новую IDE и поделиться впечатлениями, что поможет нам сделать 0xDBE ещё лучше к моменту релиза.



Нам нравится название 0xDBE, но оно всё же рабочее, и к релизу мы выберем другое — более читаемое.

Ещё мы хотим лучше узнать наших пользователей и понять, как вы работаете с базами данных, поэтому составили небольшой опрос. Просим пройти его, на это уйдёт 5-8 минут. Среди тех, кто принял в нём участие, мы разыграем десять годовых лицензий на 0xDBE.

Итак, вот что мы добавили с момента запуска EAP:

Быстрая и точная интроспекция

В первую очередь, мы переработали алгоритм получения мета-информации о базе данных и расширили стандартную JDBC-интроспекцию для большинства поддерживаемых СУБД. Помимо увеличения скорости это привело к улучшениям в графическом интерфейсе — теперь объекты базы данных сгруппированы по типам:



Управление объектами БД

При нажатии Ctrl+F6 (Cmd-F6 для OS X) на имени таблицы в текстовом редакторе или в окне Database view открывается окно Modify Table, в котором можно добавлять и удалять столбцы, менять их свойства, добавлять и удалять ключи и индексы. В реальном времени генерируется DDL-скрипт, который будет выполнен для этих изменений:



Текстовый поиск

Теперь доступен текстовый поиск по результату запроса. Например, вам нужно найти данные, а столбец забыли. Есть поддержка регулярных выражений:


Читать дальше →

Немного об оптимизации запросов

Время на прочтение3 мин
Количество просмотров41K
Хочу на простом примере рассказать о том, как иногда можно сильно оптимизировать вполне простые на первый взгляд запросы. Возьмем такой код, для примера на PostgreSQL 9.3, но принцип подходит ко всем субд, в которых присутствует hash join.

Задача простая — сджойнить две таблицы — одна весьма большая, другая маленькая — но джоин не простой, а золотой с OR. (Как реальный кейс — джоин таблицы проводок по счетам к самим счетам, учитывая, что в проводке два поля со счетом — для дебета и кредита.)
Читать дальше →

Регулярные выражения Oracle. Опасный диапазон

Время на прочтение4 мин
Количество просмотров47K


Разработчик Oracle, часто использующий в коде регулярные выражения, особенно на базах с православными настройками, рано или поздно может столкнуться с явлением, которое, кроме как мистикой, никак не назовешь. Длительные поиски причин возникновения проблемы могут привести к потере веса, аппетита и спровоцировать различного рода психосоматические расстройства — все это я сейчас и попробую предотвратить. А поможет мне в этом функция regexp_replace. Она может иметь до 6 аргументов:

REGEXP_REPLACE (
  1. исходная_строка,
  2. шаблон,
  3. заменяющая_строка,
  4. позиция начала поиска совпадения с шаблоном (по умолчанию 1),
  5. номер вхождения шаблона в исходную строку (по умолчанию 0 – все вхождения),
  6. модификатор (пока что темная лошадка)
)
Возвращает измененную исходную_строку, в которой все вхождения шаблона заменены значением, переданным в параметре заменяющая_строка. Зачастую пользуются короткой версией функции, где заданы 3 первых аргумента, что бывает достаточно для решения многих задач. Я тоже так сделаю. Допустим, нам нужно в строке 'MASK: lower case' замаскировать все строчные символы звездочками. Для задания диапазона строчных символов должен подойти шаблон '[a-z]'. Проверяем

select regexp_replace('MASK: lower case', '[a-z]', '*') as result from dual

Ожидание
+------------------+
| RESULT           |
+------------------+
| MASK: ***** **** |
+------------------+

Реальность
+------------------+
| RESULT           |
+------------------+
| *A**: ***** **** |
+------------------+

Если на вашей базе это явление не воспроизвелось, значит вам пока повезло. Но чаще начинаются копания в кодировках, конвертации строк из одного набора символов в другой и со временем наступает примерно такое состояние
Читать дальше →

Ближайшие события

Oracle, типичные задачи SQL. Гарантированный выбор

Время на прочтение3 мин
Количество просмотров24K


На носу выборы, а это значит, что сегодня мы будем выбирать губернатора. А точнее назначать барьер прохождения кандидатов в следующий тур. Но сначала надо определиться с терминами.

Что такое гарантированный выбор в SQL? Допустим, что в условии запроса к таблице выполняется сравнение какого-либо поля с какой-нибудь переменной. В зависимости от значения этой переменной запрос может вернуть строки из таблицы, а может и не вернуть их вовсе. Если выпадает такое значение переменной, что строки из таблицы не возвращаются, то для этого случая надо специально сгенерировать заранее определенный левый результат. То есть в любом случае общий запрос должен гарантированно что-нибудь да вернуть. Сам термин взят отсюда. Однако задача усложняется тем (а может и наоборот, упрощается), что вместо одной простой ячейки со значением, нам нужно гарантировано вернуть полноценную строку.

Привожу данные центризбиркома. Первый тур голосования закончился с такими результатами
Читать дальше →

Oracle, типичные задачи SQL. Трансформация перечисленных в колонке значений в строки таблицы

Время на прочтение3 мин
Количество просмотров40K
Добро пожаловать в Голливуд. Представляю вам сегодняшних героинь

image

Сперва мы узнаем, кто был в мужьях у этих красоток. А потом с помощью незамысловатых спецэффектов я вам покажу, в каком порядке они друг с другом бракосочетались. Так что юным девам эта статья будет особенно интересна.

Создадим и заполним базовую таблицу
create table hollywood 
as 
with t (id, actress, husbands) as (
  select 1, 'Анджелина Джоли', 'Джонни Ли Миллер, Билли Боб Торнтон, Брэд Питт' from dual union all
  select 2, 'Шарлиз Терон', null from dual union all
  select 3, 'Пенелопа Крус', 'Хавьер Бардем' from dual
)  
select * from t;

alter table hollywood add primary key (id);
Читать дальше →

Oracle, типичные задачи SQL. Размножение строк таблицы в зависимости от значения числа в колонке

Время на прочтение3 мин
Количество просмотров44K
image

На носу зима, приближаются морозы, а это значит, что сегодня мы будем мариновать бананы. Для этого нам понадобятся следующие ингредиенты:
ID INGREDIENT MEASURE QUANTITY
1 Банан Штука 3
2 Петрушка Ветка 2
3 Вода Литр 3
4 Соль Ложка 1
5 Уксус Ложка 2
Читать дальше →

Как посчитать всё на свете одним SQL-запросом. Оконные функции PostgreSQL

Время на прочтение5 мин
Количество просмотров616K

Я с удивлением обнаружил, что многие разработчики, даже давно использующие postgresql, не понимают оконные функции, считая их какой-то особой магией для избранных. Ну или в лучшем случае «копипастят» со StackOverflow выражения типа «row_number() OVER ()», не вдаваясь в детали. А ведь оконные функции — полезнейший функционал PostgreSQL.
Попробую по-простому объяснить, как можно их использовать.


Читать дальше →

Adminer — веб-интерфейс для баз данных размером в один .php файл

Время на прочтение1 мин
Количество просмотров85K


В свете недавнего поста про сравнение PostgreSQL и MySQL, в комментариях возникла проблема выбора удобного интерфейса для работы с постгресом. Я сам столкнулся с такой проблемой, решив поискать альтернативы всем известному phpMyAdmin / php*Admin, который считается стандартом у веб-мастеров.
Читать дальше →

Переход из SQL на NoSQL: опыт проекта СМЭВ 2.0

Время на прочтение4 мин
Количество просмотров36K
В последние годы NoSQL и BigData стали очень популярными в ИТ-индустрии, и на базе NoSQL успешно реализованы тысячи проектов. Часто на разных конференциях и форумах слушатели задают вопрос о том, как модернизировать или перенести старые системы (legacy) в NoSQL. К счастью, у нас был опыт перехода из SQL на NoSQL в крупном проекте СМЭВ 2.0, о котором я и расскажу под катом.


Читать дальше →

12 типичных ошибок при бэкапе баз данных

Время на прочтение8 мин
Количество просмотров126K

Изначально эта статья задумывалась только для разработчиков и администраторов СУБД Firebird, но после общения с администраторами других БД выяснилось, что большинство ошибок общие, и на очень похожие грабли наступают буквально все. Если Вы можете что-то добавить к этому списку (пусть даже специфическое для конкретной СУБД), пишите в личную почту или в комментариях.
In English: 12 Common Mistakes while Backing Up Databases

Наша компания занимается инструментами восстановления, резервного копирования, оптимизации и поддержкой СУБД (в основном Firebird, но есть и MSSQL, PostgreSQL, InterBase и др.) и, как результат многочисленных аудитов и ремонтов, накопила коллекцию ошибок, связанных с резервным копированием. Все пункты ниже изложены по мотивам реальных случаев с повреждением баз, потерей и повреждением бэкапов, дисков, сбоями серверов, и прочих «радостей» администраторов БД.

Хотелось бы о них рассказать, чтобы администраторы и разработчики могли поменять свои подходы к управлению бэкапами и предупредить возможные проблемы.

Итак, приступим.
Читать дальше →

Вклад авторов