SlideShare a Scribd company logo
1 of 45
Реляционные базы данных
Модель предметной области
Модель предметной области
Совокупность сущностей и их отношений в
базе данных
Отражающая взаимосвязи между
реальными объектами предметной
области
Цели проектирования модели П.О.
Точно отразить реальные взаимосвязи
между сущностями
Упростить логическую структуру БД
Обеспечить удобное использование БД
Облегчить возможную эволюцию модели
Оптимально использовать физические
возможности машины
Терминология реляционных БД
Терминология реляционных БД
Отношение ( = таблица)
Атрибут ( = столбец)
Заголовок отношения ( = типы столбцов)
Кортеж ( = строка, запись)
Первичный ключ ( = идентификатор)
Внешний ключ ( = связь, отношение)
Нормализация
Проектирование начинается с одной
условной супертаблицы (отношения)
Нормализация - декомпозиция отношения с
выделением меньших отношений и связей
между ними
Выделяют не менее 5 нормальных форм
Задача - свести исходное отношение к
приемлемой нормальной форме
Идентификаторы
Первичный ключ (Primary Key)
Неявный ключ
Суррогатный ключ
Естественный ключ
Sequence / Serial / Identity
Вторичный ключ (Secondary Key)
Композитный ключ
Функциональный ключ
Уникальный ключ
Индекс
Физическая реализация вторичного ключа
Компактно организованная структура
Осуществляет поиск записи по значению
ключа - помогает ускорить запросы
Осуществляет проверку условия
(constraint) на пространстве ключей
Реализация индекса
Как правило, физически хранится отдельно от
таблицы
Содержит только данные ключа и ссылки на
соответствующие записи
Организован в виде структуры поиска -
дерево поиска, хеш-таблица, гистограмма
Может храниться в памяти или на диске, в
зависимости от этого - разные реализации
Взаимосвязь
Термин - внешний ключ (Foreign Key)
Столбец-ссылка, указывает на ключ в
другой таблице
Физически реализуется в виде ссылки на
индекс в другой таблице
Использование ссылок позволяет СУБД
переходить сразу к нужной записи
Типы взаимосвязи
1:(0..1) “Один к одному”. Вспомогательная
таблица либо дополнительные столбцы
1:* - “Один к многим”. Внешний ключ.
*:* - “Многие ко многим”. Промежуточная
таблица с двумя внешними ключами.
Планирование запросов
СУБД составляет план выполнения
каждого запроса с учетом физической
организации данных
В плане выполнения задействуются
индексы и связи между таблицами
При проектировании нужно убедиться, что
планы выполнения наиболее важных
запросов выстраиваются оптимально
Эффект от индексов
На построение и обновление индекса
тратится время - замедляется вставка,
удаление и модификация
Можно быстро перейти к записи по
значению вторичного ключа
При работе с внешними ключами часть
операций можно производить на индексе
Результат проектирования
Список таблиц с заголовками
Механизмы генерации идентификаторов
Запланированные индексы (с типами)
Связи между таблицами
Сводный обзор планов выполнения
важнейших запросов
Подключение к базе данных
Реляционные базы данных
SQL CLI
sql> create table animals (id integer, name varchar,
weight decimal);
sql> show tables;
TABLE_NAME | TABLE_SCHEMA
ANIMALS | PUBLIC
sql> insert into animals values (1, 'kitten', 2.5);
sql> select name from animals where weight < 3.0;
NAME
kitten
JDBC
Open DataBase Connectivity (1992) -
унифицированное API SQL баз данных
Java DataBase Connectivity (1997) -
унифицированное Java API SQL БД
Изначально JDBC просто оборачивало
ODBC, однако потом были написаны
нативные реализации
Пример JDBC
Class.forName("com.mysql.jdbc.Driver"); // Загрузка
драйвера
String url = "jdbc:mysql://localhost:3306/db_name";
Connection conn =
DriverManager.getConnection(url, user, pass);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users");
while (rs.next()) {
// Process row
}
stmt.close();
Проблема - слишком много букв
Ручное управление подключениями
Ручное управление запросами к базе
Ручное управление транзакциями
Отсутствие конкурентного доступа
Опасности при закрытии ресурсов
Низкоуровневое API для данных
Сложная работа с исключениями
Решение - Spring JDBC
Расширение Spring Framework
Управляет подключениями и запросами
Вовремя закрывает дескрипторы
Тесно интегрировано с JTA и Spring
Transactions (см далее)
Каноничная иерархия исключений
Высокоуровневое API для запросов
Пример Spring JDBC
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
int updated = jdbcTemplate.update(
"insert into animals " +
"(id, name, weight) " +
"values (1, 'kitten', 2.5)");
List<String> names = jdbcTemplate.queryForList(
"select name from animals " +
"where weight < 3.0", String.class);
jdbcTemplate.execute("alter table animals " +
"add column (height decimal)");
Реляционные базы данных
Устройство Spring JDBC
DataSource
<bean id="dataSource" class=
"org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
DataSource
@Bean
public DataSource dataSource(
@Value("${jdbc.url}") String url,
@Value("${jdbc.username}") String username,
@Value("${jdbc.password}") String password) {
return new DriverManagerDataSource(url, username,
password);
}
Connection Pooling
Spring DataSource на каждый запрос
открывает новые подключения
Выгодно многократно переиспользовать
созданные подключения
Это сложная задача с массой нюансов
Есть готовые реализации - C3P0, DBCP,
BoneCP
<bean id="dataSource"
class="com.jolbox.bonecp.BoneCPDataSource" destroy-
method="close">
<property name="driverClassName" value="${jdbc.driver}"
/>
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
Пример BoneCP Datasource
JDBC Template
JdbcTemplate - класс-фасад, центральный
класс Spring JDBC
Предоставляет методы для упрощенной
работы с JDBC
Создается вокруг конкретного DataSource
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
Методы JDBC Template
jdbcTemplate.execute(
“alter table users add column (last_login timestamp)”);
int count = jdbcTemplate.queryForObject(
“select count(*) from table”, Integer.class);
String userName = jdbcTemplate.queryForObject(
“select name from users where uid = 1”, String.class);
List<String> admins = jdbcTemplate.queryForList(
“select name from users where is_admin = 1”,
String.class);
Map<String, Object> row3 = jdbcTemplate.queryForMap(
“select * from rows where row = 3”);
Методы JDBC Template
int inserted = jdbcTemplate.update(
“insert into animals (id, name, weight) ” +
“values (1, ‘kitten’, 2.5)”);
int updated = jdbcTemplate.update(
“update animals set is_heavy = 1 where weight > 50”);
int deleted = jdbcTemplate.update(
“delete from animals where is_heavy = 0”);
Реляционные базы данных
Возможности Spring JDBC
Row Mapper
List<Animal> animals = jdbcTemplate.query(
"select * from animals", new RowMapper<Animal>() {
public Animal mapRow(ResultSet rs, int rowNum)
throws SQLException {
Animal animal = new Animal();
animal.setId(rs.getInt("id"));
animal.setName(rs.getString("name"));
animal.setWeight(rs.getDouble("weight"));
return animal;
}
});
Row Mapper
List<Animal> animals = jdbcTemplate.query(
"select * from animals", (rs, rowNum) -> {
Animal animal = new Animal();
animal.setId(rs.getInt("id"));
animal.setName(rs.getString("name"));
animal.setWeight(rs.getDouble("weight"));
return animal;
});
Row Callback
class MeanCallback implements RowCallbackHandler {
double sum = 0;
int count = 0;
public double getMean() { return sum/count; }
public void processRow(ResultSet rs) {
sum += rs.getDouble(1);
count += 1;
}
}
Row Callback
MeanCallback callback = new MeanCallback();
String sql = "select weight from animals where in_zoo =
1";
jdbcTemplate.query(sql, callback);
double mean = callback.getMean();
Стандартизация исключений
В JDBC фигурирует checked SQLException
У каждого вендора свой подход к ошибкам
Исключения в транзакционной среде
требуют внимательной обработки
Spring берет на себя разбор исключений
Он использует свою unchecked иерархию
Маппинги пишутся отдельно к каждому
вендору (много доступно из коробки)
Prepared Statement
Стадии обработки SQL-запроса:
Передача текста запроса
Парсинг в синтаксическое дерево
Построение плана выполнения
Выполнение (вжжжж!)
Для массовых однотипных запросов
“планировочные” стадии несут оверхед
Есть возможность избежать этого
Prepared Statement
Запрос с Placeholder’ами:
select count(*) from animals where
weight >= ? and weight < ? and
country_id = 4;
Отправим запрос на сервер:
Передача текста запроса
Парсинг в синтаксическое дерево
Построение плана выполнения
Запомним ID запроса
Prepared Statement
Для запроса достаточно отправить только
ID и значения Placeholder’ов
Экономия на передаче данных, парсинге
текста и построении плана
Для легких запросов это >50% времени
Prepared Statement
static ANIMAL_ROW_MAPPER = new RowMapper<Animal>() {...}
for (int animalId : animalIds) {
Animal animal = jdbcTemplate.queryForObject(
"select * from animals where id = ? ",
animalId, ANIMAL_ROW_MAPPER);
animalsInZoo.add(animal);
jdbcTemplate.update(
"update animals set in_zoo = 1 where id = ? ",
animalId);
}
Batch Update
List<Object[]> batchArgs = new ArrayList<>();
batchArgs.add(new Object[] {2, "Panther", 200.0});
batchArgs.add(new Object[] {3, "Leon", 250.0});
batchArgs.add(new Object[] {4, "Tiger", 300.0});
jdbcTemplate.batchUpdate(
"insert into animals values (?, ?, ?)",
batchArgs);
Ручные Statement Setter’ы
List<Animal> animals = ...;
int batchSize = ...;
String query = "insert into animals values (?, ?, ?)";
jdbcTemplate.batchUpdate(query, animals, batchSize,
new ParameterizedPreparedStatementSetter<Animal>() {
public void setValues(PreparedStatement ps, Animal
animal) throws SQLException {
ps.setInt(1, animal.getId());
ps.setString(2, animal.getName());
ps.setDouble(3, animal.getWeight());
}});
Ручные Statement Setter’ы
List<Animal> animals = ...;
int batchSize = ...;
String query = "insert into animals values (?, ?, ?";
jdbcTemplate.batchUpdate(query, animals, batchSize,
(ps, animal) -> {
ps.setInt(1, animal.getId());
ps.setString(2, animal.getName());
ps.setDouble(3, animal.getWeight());
});
Maven dependencies
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.0.6.RELEASE</version>
</dependency>
<dependency>
<groupId>com.jolbox</groupId>
<artifactId>bonecp</artifactId>
<version>0.8.0.RELEASE</version>
</dependency>
Рекомендуемая литература
Рекомендуемая литература
Кристофер Дейт.
Введение в системы баз данных.
Восьмое (!) издание.

More Related Content

What's hot

Введение в hibernate
Введение в hibernateВведение в hibernate
Введение в hibernateUnguryan Vitaliy
 
Клиент-серверное взаимодействие под android в деталях
Клиент-серверное взаимодействие под android в деталяхКлиент-серверное взаимодействие под android в деталях
Клиент-серверное взаимодействие под android в деталяхKirill Zotin
 
ук 03.002.01 2011
ук 03.002.01 2011ук 03.002.01 2011
ук 03.002.01 2011etyumentcev
 
Лекция Android. БД SQLite, ContentProvider, Loader
Лекция Android. БД SQLite, ContentProvider, LoaderЛекция Android. БД SQLite, ContentProvider, Loader
Лекция Android. БД SQLite, ContentProvider, LoaderАлександр Брич
 
Android - 13 - Database
Android - 13 - DatabaseAndroid - 13 - Database
Android - 13 - DatabaseNoveo
 
Java осень 2013 лекция 8
Java осень 2013 лекция 8Java осень 2013 лекция 8
Java осень 2013 лекция 8Technopark
 
Java весна 2013 лекция 8
Java весна 2013 лекция 8Java весна 2013 лекция 8
Java весна 2013 лекция 8Technopark
 
C# Web. Занятие 04.
C# Web. Занятие 04.C# Web. Занятие 04.
C# Web. Занятие 04.Igor Shkulipa
 
Yii development
Yii developmentYii development
Yii developmentMageCloud
 
работа с потоками ввода вывода
работа с потоками ввода выводаработа с потоками ввода вывода
работа с потоками ввода выводаmetaform
 
C# Web. Занятие 12.
C# Web. Занятие 12.C# Web. Занятие 12.
C# Web. Занятие 12.Igor Shkulipa
 
Работа с БД в Java
Работа с БД в JavaРабота с БД в Java
Работа с БД в Javametaform
 
Мировые информационные ресурсы. Лекция 4
Мировые информационные ресурсы. Лекция 4Мировые информационные ресурсы. Лекция 4
Мировые информационные ресурсы. Лекция 4Dmitriy Krukov
 
базы данных в Delphi
базы данных в Delphiбазы данных в Delphi
базы данных в DelphiAeka227
 
JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.Igor Shkulipa
 
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"Yandex
 
Java осень 2013 лекция 7
Java осень 2013 лекция 7Java осень 2013 лекция 7
Java осень 2013 лекция 7Technopark
 

What's hot (20)

Введение в hibernate
Введение в hibernateВведение в hibernate
Введение в hibernate
 
Клиент-серверное взаимодействие под android в деталях
Клиент-серверное взаимодействие под android в деталяхКлиент-серверное взаимодействие под android в деталях
Клиент-серверное взаимодействие под android в деталях
 
ук 03.002.01 2011
ук 03.002.01 2011ук 03.002.01 2011
ук 03.002.01 2011
 
Лекция Android. БД SQLite, ContentProvider, Loader
Лекция Android. БД SQLite, ContentProvider, LoaderЛекция Android. БД SQLite, ContentProvider, Loader
Лекция Android. БД SQLite, ContentProvider, Loader
 
Android - 13 - Database
Android - 13 - DatabaseAndroid - 13 - Database
Android - 13 - Database
 
Java осень 2013 лекция 8
Java осень 2013 лекция 8Java осень 2013 лекция 8
Java осень 2013 лекция 8
 
Java весна 2013 лекция 8
Java весна 2013 лекция 8Java весна 2013 лекция 8
Java весна 2013 лекция 8
 
PGDBObject
PGDBObjectPGDBObject
PGDBObject
 
C# Web. Занятие 04.
C# Web. Занятие 04.C# Web. Занятие 04.
C# Web. Занятие 04.
 
Yii development
Yii developmentYii development
Yii development
 
работа с потоками ввода вывода
работа с потоками ввода выводаработа с потоками ввода вывода
работа с потоками ввода вывода
 
C# Web. Занятие 12.
C# Web. Занятие 12.C# Web. Занятие 12.
C# Web. Занятие 12.
 
Лекция #7. Django ORM
Лекция #7. Django ORMЛекция #7. Django ORM
Лекция #7. Django ORM
 
Работа с БД в Java
Работа с БД в JavaРабота с БД в Java
Работа с БД в Java
 
Мировые информационные ресурсы. Лекция 4
Мировые информационные ресурсы. Лекция 4Мировые информационные ресурсы. Лекция 4
Мировые информационные ресурсы. Лекция 4
 
базы данных в Delphi
базы данных в Delphiбазы данных в Delphi
базы данных в Delphi
 
JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.
 
Jdbc in java
Jdbc in javaJdbc in java
Jdbc in java
 
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
 
Java осень 2013 лекция 7
Java осень 2013 лекция 7Java осень 2013 лекция 7
Java осень 2013 лекция 7
 

Viewers also liked

Programming Java - Lection 06 - Multithreading - Lavrentyev Fedor
Programming Java - Lection 06 - Multithreading - Lavrentyev FedorProgramming Java - Lection 06 - Multithreading - Lavrentyev Fedor
Programming Java - Lection 06 - Multithreading - Lavrentyev FedorFedor Lavrentyev
 
Programming Java - Lection 04 - Generics and Lambdas - Lavrentyev Fedor
Programming Java - Lection 04 - Generics and Lambdas - Lavrentyev FedorProgramming Java - Lection 04 - Generics and Lambdas - Lavrentyev Fedor
Programming Java - Lection 04 - Generics and Lambdas - Lavrentyev FedorFedor Lavrentyev
 
Programming Java - Lection 07 - Puzzlers - Lavrentyev Fedor
Programming Java - Lection 07 - Puzzlers - Lavrentyev FedorProgramming Java - Lection 07 - Puzzlers - Lavrentyev Fedor
Programming Java - Lection 07 - Puzzlers - Lavrentyev FedorFedor Lavrentyev
 
Programming Java - Lection 01 - Basics - Lavrentyev Fedor
Programming Java - Lection 01 - Basics - Lavrentyev FedorProgramming Java - Lection 01 - Basics - Lavrentyev Fedor
Programming Java - Lection 01 - Basics - Lavrentyev FedorFedor Lavrentyev
 
Programming Java - Lection 03 - Classes - Lavrentyev Fedor
Programming Java - Lection 03 - Classes - Lavrentyev FedorProgramming Java - Lection 03 - Classes - Lavrentyev Fedor
Programming Java - Lection 03 - Classes - Lavrentyev FedorFedor Lavrentyev
 
Programming Java - Lecture 02 - Objects - Lavrentyev Fedor
Programming Java - Lecture 02 - Objects - Lavrentyev FedorProgramming Java - Lecture 02 - Objects - Lavrentyev Fedor
Programming Java - Lecture 02 - Objects - Lavrentyev FedorFedor Lavrentyev
 
Practica 6 gerardo
Practica 6 gerardoPractica 6 gerardo
Practica 6 gerardogerardd98
 
Semantic web: An overview
Semantic web: An overviewSemantic web: An overview
Semantic web: An overviewAndré Mazayev
 
Actividad 2 sistemas
Actividad 2 sistemasActividad 2 sistemas
Actividad 2 sistemasgerardd98
 

Viewers also liked (13)

Programming Java - Lection 06 - Multithreading - Lavrentyev Fedor
Programming Java - Lection 06 - Multithreading - Lavrentyev FedorProgramming Java - Lection 06 - Multithreading - Lavrentyev Fedor
Programming Java - Lection 06 - Multithreading - Lavrentyev Fedor
 
Programming Java - Lection 04 - Generics and Lambdas - Lavrentyev Fedor
Programming Java - Lection 04 - Generics and Lambdas - Lavrentyev FedorProgramming Java - Lection 04 - Generics and Lambdas - Lavrentyev Fedor
Programming Java - Lection 04 - Generics and Lambdas - Lavrentyev Fedor
 
Programming Java - Lection 07 - Puzzlers - Lavrentyev Fedor
Programming Java - Lection 07 - Puzzlers - Lavrentyev FedorProgramming Java - Lection 07 - Puzzlers - Lavrentyev Fedor
Programming Java - Lection 07 - Puzzlers - Lavrentyev Fedor
 
Programming Java - Lection 01 - Basics - Lavrentyev Fedor
Programming Java - Lection 01 - Basics - Lavrentyev FedorProgramming Java - Lection 01 - Basics - Lavrentyev Fedor
Programming Java - Lection 01 - Basics - Lavrentyev Fedor
 
Programming Java - Lection 03 - Classes - Lavrentyev Fedor
Programming Java - Lection 03 - Classes - Lavrentyev FedorProgramming Java - Lection 03 - Classes - Lavrentyev Fedor
Programming Java - Lection 03 - Classes - Lavrentyev Fedor
 
Programming Java - Lecture 02 - Objects - Lavrentyev Fedor
Programming Java - Lecture 02 - Objects - Lavrentyev FedorProgramming Java - Lecture 02 - Objects - Lavrentyev Fedor
Programming Java - Lecture 02 - Objects - Lavrentyev Fedor
 
Portafolio de producto
Portafolio de productoPortafolio de producto
Portafolio de producto
 
Practica 6 gerardo
Practica 6 gerardoPractica 6 gerardo
Practica 6 gerardo
 
Historia de los computadores
Historia de los computadoresHistoria de los computadores
Historia de los computadores
 
Semantic web: An overview
Semantic web: An overviewSemantic web: An overview
Semantic web: An overview
 
Actividad 2 sistemas
Actividad 2 sistemasActividad 2 sistemas
Actividad 2 sistemas
 
Lenguaje ensamblador
Lenguaje ensambladorLenguaje ensamblador
Lenguaje ensamblador
 
Robot
RobotRobot
Robot
 

Similar to Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavrentyev Fedor

Основы Java. 5. Databases
Основы Java. 5. DatabasesОсновы Java. 5. Databases
Основы Java. 5. DatabasesSergey Nemchinsky
 
Java осень 2012 лекция 8
Java осень 2012 лекция 8Java осень 2012 лекция 8
Java осень 2012 лекция 8Technopark
 
Реляционные базы данных
Реляционные базы данныхРеляционные базы данных
Реляционные базы данныхLevon Avakyan
 
Александр Сычев "Разделяй и властвуй: CQRS в iOS"
Александр Сычев "Разделяй и властвуй: CQRS в iOS"Александр Сычев "Разделяй и властвуй: CQRS в iOS"
Александр Сычев "Разделяй и властвуй: CQRS в iOS"IT Event
 
Новости Global summit 2015
Новости Global summit 2015Новости Global summit 2015
Новости Global summit 2015Timur Safin
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Alex Ott
 
Паттерны проектирования источников данных
Паттерны проектирования источников данныхПаттерны проектирования источников данных
Паттерны проектирования источников данныхAlex Polorotov
 
паттерны проектирования источников данных
паттерны проектирования источников данныхпаттерны проектирования источников данных
паттерны проектирования источников данныхVitaliy Trenkenshu
 
Scala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentScala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentAnton Kirillov
 
Alasql.js - SQL сервер на JavaScript
Alasql.js - SQL сервер на JavaScriptAlasql.js - SQL сервер на JavaScript
Alasql.js - SQL сервер на JavaScriptAndrey Gershun
 
Василий Захарченко: "Взгляд на queryDsl-sql фреймворк как альтернатива Hiber...
Василий Захарченко: "Взгляд на  queryDsl-sql фреймворк как альтернатива Hiber...Василий Захарченко: "Взгляд на  queryDsl-sql фреймворк как альтернатива Hiber...
Василий Захарченко: "Взгляд на queryDsl-sql фреймворк как альтернатива Hiber...Provectus
 
Стажировка-2013, разработчики, занятие 11. Базы данных
Стажировка-2013, разработчики, занятие 11. Базы данныхСтажировка-2013, разработчики, занятие 11. Базы данных
Стажировка-2013, разработчики, занятие 11. Базы данных7bits
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6Technopark
 
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Magneta AI
 
AlaSQL - SQL библиотека на JavaScript (выступление на PiterJS)
AlaSQL - SQL библиотека на JavaScript (выступление на PiterJS)AlaSQL - SQL библиотека на JavaScript (выступление на PiterJS)
AlaSQL - SQL библиотека на JavaScript (выступление на PiterJS)Andrey Gershun
 
MongoDB. Фокус на тестирование
MongoDB. Фокус на тестированиеMongoDB. Фокус на тестирование
MongoDB. Фокус на тестированиеUladzimir Kryvenka
 
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 08
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 08Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 08
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 087bits
 
Multimodel Database Caché
Multimodel Database CachéMultimodel Database Caché
Multimodel Database CachéTimur Safin
 

Similar to Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavrentyev Fedor (20)

Основы Java. 5. Databases
Основы Java. 5. DatabasesОсновы Java. 5. Databases
Основы Java. 5. Databases
 
Расширение библиотеки Slick
Расширение библиотеки SlickРасширение библиотеки Slick
Расширение библиотеки Slick
 
Java осень 2012 лекция 8
Java осень 2012 лекция 8Java осень 2012 лекция 8
Java осень 2012 лекция 8
 
Реляционные базы данных
Реляционные базы данныхРеляционные базы данных
Реляционные базы данных
 
Александр Сычев "Разделяй и властвуй: CQRS в iOS"
Александр Сычев "Разделяй и властвуй: CQRS в iOS"Александр Сычев "Разделяй и властвуй: CQRS в iOS"
Александр Сычев "Разделяй и властвуй: CQRS в iOS"
 
Новости Global summit 2015
Новости Global summit 2015Новости Global summit 2015
Новости Global summit 2015
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)
 
Паттерны проектирования источников данных
Паттерны проектирования источников данныхПаттерны проектирования источников данных
Паттерны проектирования источников данных
 
паттерны проектирования источников данных
паттерны проектирования источников данныхпаттерны проектирования источников данных
паттерны проектирования источников данных
 
Scala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentScala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application Development
 
Alasql.js - SQL сервер на JavaScript
Alasql.js - SQL сервер на JavaScriptAlasql.js - SQL сервер на JavaScript
Alasql.js - SQL сервер на JavaScript
 
Василий Захарченко: "Взгляд на queryDsl-sql фреймворк как альтернатива Hiber...
Василий Захарченко: "Взгляд на  queryDsl-sql фреймворк как альтернатива Hiber...Василий Захарченко: "Взгляд на  queryDsl-sql фреймворк как альтернатива Hiber...
Василий Захарченко: "Взгляд на queryDsl-sql фреймворк как альтернатива Hiber...
 
Стажировка-2013, разработчики, занятие 11. Базы данных
Стажировка-2013, разработчики, занятие 11. Базы данныхСтажировка-2013, разработчики, занятие 11. Базы данных
Стажировка-2013, разработчики, занятие 11. Базы данных
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
 
AlaSQL - SQL библиотека на JavaScript (выступление на PiterJS)
AlaSQL - SQL библиотека на JavaScript (выступление на PiterJS)AlaSQL - SQL библиотека на JavaScript (выступление на PiterJS)
AlaSQL - SQL библиотека на JavaScript (выступление на PiterJS)
 
Введение в Oracle
Введение в OracleВведение в Oracle
Введение в Oracle
 
MongoDB. Фокус на тестирование
MongoDB. Фокус на тестированиеMongoDB. Фокус на тестирование
MongoDB. Фокус на тестирование
 
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 08
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 08Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 08
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 08
 
Multimodel Database Caché
Multimodel Database CachéMultimodel Database Caché
Multimodel Database Caché
 

Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavrentyev Fedor

  • 1. Реляционные базы данных Модель предметной области
  • 2. Модель предметной области Совокупность сущностей и их отношений в базе данных Отражающая взаимосвязи между реальными объектами предметной области
  • 3. Цели проектирования модели П.О. Точно отразить реальные взаимосвязи между сущностями Упростить логическую структуру БД Обеспечить удобное использование БД Облегчить возможную эволюцию модели Оптимально использовать физические возможности машины
  • 5. Терминология реляционных БД Отношение ( = таблица) Атрибут ( = столбец) Заголовок отношения ( = типы столбцов) Кортеж ( = строка, запись) Первичный ключ ( = идентификатор) Внешний ключ ( = связь, отношение)
  • 6. Нормализация Проектирование начинается с одной условной супертаблицы (отношения) Нормализация - декомпозиция отношения с выделением меньших отношений и связей между ними Выделяют не менее 5 нормальных форм Задача - свести исходное отношение к приемлемой нормальной форме
  • 7. Идентификаторы Первичный ключ (Primary Key) Неявный ключ Суррогатный ключ Естественный ключ Sequence / Serial / Identity Вторичный ключ (Secondary Key) Композитный ключ Функциональный ключ Уникальный ключ
  • 8. Индекс Физическая реализация вторичного ключа Компактно организованная структура Осуществляет поиск записи по значению ключа - помогает ускорить запросы Осуществляет проверку условия (constraint) на пространстве ключей
  • 9. Реализация индекса Как правило, физически хранится отдельно от таблицы Содержит только данные ключа и ссылки на соответствующие записи Организован в виде структуры поиска - дерево поиска, хеш-таблица, гистограмма Может храниться в памяти или на диске, в зависимости от этого - разные реализации
  • 10. Взаимосвязь Термин - внешний ключ (Foreign Key) Столбец-ссылка, указывает на ключ в другой таблице Физически реализуется в виде ссылки на индекс в другой таблице Использование ссылок позволяет СУБД переходить сразу к нужной записи
  • 11. Типы взаимосвязи 1:(0..1) “Один к одному”. Вспомогательная таблица либо дополнительные столбцы 1:* - “Один к многим”. Внешний ключ. *:* - “Многие ко многим”. Промежуточная таблица с двумя внешними ключами.
  • 12. Планирование запросов СУБД составляет план выполнения каждого запроса с учетом физической организации данных В плане выполнения задействуются индексы и связи между таблицами При проектировании нужно убедиться, что планы выполнения наиболее важных запросов выстраиваются оптимально
  • 13. Эффект от индексов На построение и обновление индекса тратится время - замедляется вставка, удаление и модификация Можно быстро перейти к записи по значению вторичного ключа При работе с внешними ключами часть операций можно производить на индексе
  • 14. Результат проектирования Список таблиц с заголовками Механизмы генерации идентификаторов Запланированные индексы (с типами) Связи между таблицами Сводный обзор планов выполнения важнейших запросов
  • 15. Подключение к базе данных Реляционные базы данных
  • 16. SQL CLI sql> create table animals (id integer, name varchar, weight decimal); sql> show tables; TABLE_NAME | TABLE_SCHEMA ANIMALS | PUBLIC sql> insert into animals values (1, 'kitten', 2.5); sql> select name from animals where weight < 3.0; NAME kitten
  • 17. JDBC Open DataBase Connectivity (1992) - унифицированное API SQL баз данных Java DataBase Connectivity (1997) - унифицированное Java API SQL БД Изначально JDBC просто оборачивало ODBC, однако потом были написаны нативные реализации
  • 18. Пример JDBC Class.forName("com.mysql.jdbc.Driver"); // Загрузка драйвера String url = "jdbc:mysql://localhost:3306/db_name"; Connection conn = DriverManager.getConnection(url, user, pass); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM users"); while (rs.next()) { // Process row } stmt.close();
  • 19. Проблема - слишком много букв Ручное управление подключениями Ручное управление запросами к базе Ручное управление транзакциями Отсутствие конкурентного доступа Опасности при закрытии ресурсов Низкоуровневое API для данных Сложная работа с исключениями
  • 20. Решение - Spring JDBC Расширение Spring Framework Управляет подключениями и запросами Вовремя закрывает дескрипторы Тесно интегрировано с JTA и Spring Transactions (см далее) Каноничная иерархия исключений Высокоуровневое API для запросов
  • 21. Пример Spring JDBC JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); int updated = jdbcTemplate.update( "insert into animals " + "(id, name, weight) " + "values (1, 'kitten', 2.5)"); List<String> names = jdbcTemplate.queryForList( "select name from animals " + "where weight < 3.0", String.class); jdbcTemplate.execute("alter table animals " + "add column (height decimal)");
  • 23. DataSource <bean id="dataSource" class= "org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean>
  • 24. DataSource @Bean public DataSource dataSource( @Value("${jdbc.url}") String url, @Value("${jdbc.username}") String username, @Value("${jdbc.password}") String password) { return new DriverManagerDataSource(url, username, password); }
  • 25. Connection Pooling Spring DataSource на каждый запрос открывает новые подключения Выгодно многократно переиспользовать созданные подключения Это сложная задача с массой нюансов Есть готовые реализации - C3P0, DBCP, BoneCP
  • 26. <bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy- method="close"> <property name="driverClassName" value="${jdbc.driver}" /> <property name="jdbcUrl" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean> Пример BoneCP Datasource
  • 27. JDBC Template JdbcTemplate - класс-фасад, центральный класс Spring JDBC Предоставляет методы для упрощенной работы с JDBC Создается вокруг конкретного DataSource JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
  • 28. Методы JDBC Template jdbcTemplate.execute( “alter table users add column (last_login timestamp)”); int count = jdbcTemplate.queryForObject( “select count(*) from table”, Integer.class); String userName = jdbcTemplate.queryForObject( “select name from users where uid = 1”, String.class); List<String> admins = jdbcTemplate.queryForList( “select name from users where is_admin = 1”, String.class); Map<String, Object> row3 = jdbcTemplate.queryForMap( “select * from rows where row = 3”);
  • 29. Методы JDBC Template int inserted = jdbcTemplate.update( “insert into animals (id, name, weight) ” + “values (1, ‘kitten’, 2.5)”); int updated = jdbcTemplate.update( “update animals set is_heavy = 1 where weight > 50”); int deleted = jdbcTemplate.update( “delete from animals where is_heavy = 0”);
  • 31. Row Mapper List<Animal> animals = jdbcTemplate.query( "select * from animals", new RowMapper<Animal>() { public Animal mapRow(ResultSet rs, int rowNum) throws SQLException { Animal animal = new Animal(); animal.setId(rs.getInt("id")); animal.setName(rs.getString("name")); animal.setWeight(rs.getDouble("weight")); return animal; } });
  • 32. Row Mapper List<Animal> animals = jdbcTemplate.query( "select * from animals", (rs, rowNum) -> { Animal animal = new Animal(); animal.setId(rs.getInt("id")); animal.setName(rs.getString("name")); animal.setWeight(rs.getDouble("weight")); return animal; });
  • 33. Row Callback class MeanCallback implements RowCallbackHandler { double sum = 0; int count = 0; public double getMean() { return sum/count; } public void processRow(ResultSet rs) { sum += rs.getDouble(1); count += 1; } }
  • 34. Row Callback MeanCallback callback = new MeanCallback(); String sql = "select weight from animals where in_zoo = 1"; jdbcTemplate.query(sql, callback); double mean = callback.getMean();
  • 35. Стандартизация исключений В JDBC фигурирует checked SQLException У каждого вендора свой подход к ошибкам Исключения в транзакционной среде требуют внимательной обработки Spring берет на себя разбор исключений Он использует свою unchecked иерархию Маппинги пишутся отдельно к каждому вендору (много доступно из коробки)
  • 36. Prepared Statement Стадии обработки SQL-запроса: Передача текста запроса Парсинг в синтаксическое дерево Построение плана выполнения Выполнение (вжжжж!) Для массовых однотипных запросов “планировочные” стадии несут оверхед Есть возможность избежать этого
  • 37. Prepared Statement Запрос с Placeholder’ами: select count(*) from animals where weight >= ? and weight < ? and country_id = 4; Отправим запрос на сервер: Передача текста запроса Парсинг в синтаксическое дерево Построение плана выполнения Запомним ID запроса
  • 38. Prepared Statement Для запроса достаточно отправить только ID и значения Placeholder’ов Экономия на передаче данных, парсинге текста и построении плана Для легких запросов это >50% времени
  • 39. Prepared Statement static ANIMAL_ROW_MAPPER = new RowMapper<Animal>() {...} for (int animalId : animalIds) { Animal animal = jdbcTemplate.queryForObject( "select * from animals where id = ? ", animalId, ANIMAL_ROW_MAPPER); animalsInZoo.add(animal); jdbcTemplate.update( "update animals set in_zoo = 1 where id = ? ", animalId); }
  • 40. Batch Update List<Object[]> batchArgs = new ArrayList<>(); batchArgs.add(new Object[] {2, "Panther", 200.0}); batchArgs.add(new Object[] {3, "Leon", 250.0}); batchArgs.add(new Object[] {4, "Tiger", 300.0}); jdbcTemplate.batchUpdate( "insert into animals values (?, ?, ?)", batchArgs);
  • 41. Ручные Statement Setter’ы List<Animal> animals = ...; int batchSize = ...; String query = "insert into animals values (?, ?, ?)"; jdbcTemplate.batchUpdate(query, animals, batchSize, new ParameterizedPreparedStatementSetter<Animal>() { public void setValues(PreparedStatement ps, Animal animal) throws SQLException { ps.setInt(1, animal.getId()); ps.setString(2, animal.getName()); ps.setDouble(3, animal.getWeight()); }});
  • 42. Ручные Statement Setter’ы List<Animal> animals = ...; int batchSize = ...; String query = "insert into animals values (?, ?, ?"; jdbcTemplate.batchUpdate(query, animals, batchSize, (ps, animal) -> { ps.setInt(1, animal.getId()); ps.setString(2, animal.getName()); ps.setDouble(3, animal.getWeight()); });
  • 45. Рекомендуемая литература Кристофер Дейт. Введение в системы баз данных. Восьмое (!) издание.