Skip to main content

Собеседования: БД и работа с ними

1. Реляционная БД
Построена на реляционной модели данных, на отношениях. Отношение - математический термин, согласно wiki это подмножество декартова произведения множеств, называемых доменами. Например, отношение Человек может быть подмножеством произведения домена Имя (Андрей, Сергей) и Фамилия (Иванов, Смирнов). Таблица (множество кортежей) - это представление отношения.

2. Нормализация
Процесс приведения к нормальной форме. Есть несколько нормальных форм.
1НФ - все атрибуты атомарны. "ФИО, Телефоны". Телефонов может быть несколько, этот атрибут не атомарен - должен быть разделен.
2НФ - все столбцы, не входящие в полный первичный ключ, должны зависеть от полного первичного ключа. Если ключ составной (Покупатель, Товар), то поля должны зависеть от всего ключа: Количество - хорошо, ФИО Покупателя - плохо - зависит только от Покупателя.
3НФ - все столбцы, не входящие в полный первичный ключ, должны зависеть от него и не должны зависеть друг от друга. Машина, Производитель, Брэнд производителя.

3. Индексы
Key и Index - синонимы в MySQL. Primary key и Unique key однозначно определяют строки таблицы. Может быть не более одного primary key и сколько угодно unique key. Primary / unique key автоматически индексируются в MySQL.
По индексу база находит "указатель на строку". Это может быть значение primary key (InnoDB), смещение в файле (MyISAM).

4. MyISAM, InnoDB
Таблицы и индексы InnoDB хранятся в специальном пространстве памяти, которое может состоять из нескольких файлов. В этом заключается отличие InnoDB от, например, таблиц MyISAM: каждая таблица MyISAM хранится в отдельном файле.
InnoDB - storage engine по умолчанию, начиная с MySQL 5.5.

4. null в базе

4. Внутренний и внешний join

5. Многие-ко-многим. Выборка.

6. Отличие стандарта SQL от MySQL

7. В чем преимущества и недостатки использования ORM.

8. Как исполняется SQL-запрос? Порядок выполнения:
Сначала синтаксический разбор запроса, то есть сервер переводит запрос из SQL-языка в какой-то свой внутренний формат. Синтаксический разбор - долгая операция, некоторые СУБД умеют кэшировать (какие?). Потом выполнение — составление плана запроса, формирование индексов, сканирование таблиц и т.д.
Порядок выполненияя?

9. PreparedStatement
Подготовленные выражения отделяют запрос от данных.
MySQL:
PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
SET @a = 3;
SET @b = 4;
EXECUTE stmt1 USING @a, @b;
DEALLOCATE PREPARE stmt1;

JDBC:
String selectSQL = "SELECT USER_ID, USERNAME FROM DBUSER WHERE USER_ID = ?"; 
PreparedStatement preparedStatement = dbConnection.prepareStatement(selectSQL); 
preparedStatement.setInt(1, 1001); 
ResultSet rs = preparedStatement.executeQuery(selectSQL );

Hibernate:
return currentSession()
 .createQuery("FROM Student student WHERE student.status = :status")
 .setParameter("status", status)
 .list();

Примеры:

1. JDBC (Java Database Connectivity) - это Java API для работы с БД. Позволяет получать доступ к базе по URL, с помощью т.н. драйверов (для каждой БД - свой).
Пример:
// имя драйвера, путь к БД, логин, пароль
String jdbcDriverName = "com.mysql.jdbc.Driver";
String dbUrl = "jdbc:mysql://localhost/mydb";
String userName = "username";
String password = "password";

Connection conn = null;
Statement stmt = null;
try{
    // Какой драйвер?
    Class.forName("com.mysql.jdbc.Driver");

    // Открыть соединение. Connection - это сеанс работы с БД.
    conn = DriverManager.getConnection(dbUrl, userName, password);

    // Выполнить запрос. Statement = sql-запрос.
    stmt = conn.createStatement();

    String sql = "SELECT id, name FROM students";
    // ResultSet обеспечивает приложению построчный доступ 
    // к результатам запросов в базе данных. Во время обработки запроса
    // ResultSet поддерживает указатель на текущую обрабатываемую строку.
    // Приложение последовательно перемещается по результатам, пока они
    // не будут все обработаны или не будет закрыт ResultSet.
    ResultSet rs = stmt.executeQuery(sql);

    // Получить данные из result set'a
    while(rs.next()){

        String name = rs.getString("name");
    }
    // Закрыть соединение и не только
    rs.close();
    stmt.close();
    conn.close();
} catch(SQLException se) {
    // Ошибка JDBC
} catch(Exception e) {
    // Ошибка Class.forName
} finally{

    // Освободить ресурсы

    try { if (stmt != null) stmt.close(); } catch(SQLException se2) { }

    try { if (conn != null) conn.close(); } catch(SQLException se){ }
}

3 типа Statement и их использование:  Урок JDBC в примерах

2. ORM (object relational mapping) - отображение объектов объектно-ориентированного языка на структуру БД. Примеры: Hibernate, Spring DAO, ...

Пример использования Hibernate:
sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
//Data access code
session.save(newCustomer);
tx.commit();
session.close();
Архитектура приложения с Hibernate: http://www.tutorialspoint.com/hibernate/hibernate_architecture.htm

Используется Многоуровневая архитектура:
  • Слой инфраструктуры (источники данных, менеджер транзакций и т.д.)
  • Слой доступа к данным (DAO)
  • Слой бизнес-логики (сервисы)
  • Слой интерфейса (например, Spring MVC)

DAO - data access object - шаблон для отделения бизнес-логики от работы с источником данных (например, от кода, связанного с hibernate).
1. Весь доступ к DB через DAO для скрытия работы с DB.
2. Каждый DAO отвечает за одну сущность.
3. DAO отвечает за CRUD.
4. DAO может разрешать запросы по критерию, отличному от первичного ключа.
5. Не занимается обработкой транзакций, сессий или соединений. Для гибкости это делается вне DAO.
Пример написания DAO: http://habrahabr.ru/post/29694/

3. JPA - Java Persistence API — API, входящий в состав платформ Java SE и Java EE, предоставляет возможность объектно-реляционного отображения (Java-объекты в базу данных и обратно). Это спецификация, то есть не умеет ни сохранять, ни управлять объектами, но определяет КАК должно работать, описывает интерфейсы и так далее.

Существует несколько реализаций этого интерфейса, одна из самых популярных использует для этого Hibernate.

Поддержка сохранности данных, предоставляемая JPA, покрывает области:
1. Непосредственно API, заданный в пакете javax.persistence. Набор интерфейсов, которые должна поддерживать конкретная реализация.
2. Объектный язык запросов Java Persistence Query Language.
3. Метаданные - описание объектов и связей между ними. Набор аннотаций или xml файл.

4. JTA - сокращение от Java Transaction API. Этот API позволяет:
- размечать транзакции способом, не зависящим от реализации менеджера транзакций;
- работать с распределенными транзакциями.
 J2EE SDK реализует менеджер транзакций при помощи Java Transaction Service ("JTS"). Но ваш код не вызывает методы JTS напрямую. Вместо этого он вызывает методы JTA, которые потом вызывают низкоуровневые процедуры JTS.
Распределенные транзакции (XA) - транзакции, охватывающие несколько источников данных. Есть разные реализации, в т.ч. open source.

TODO: Spring DAO

Comments

Popular posts from this blog

Блочный, строчный, ...

Сборник советов: 1. Прижать элемент к нижнему краю контейнера: 2 . Две колонки: 3 . Что означает символ ">" в селекторе? Означает, что будут выбраны только прямые потомки. По-умному, direct descendant combinator. Иными словами, если есть: То "div a {color: blue;}" изменит цвет всех ссылок, а "div > a {color: blue;}" - только первой и третьей. 4 . TODO

Hibernate

1. Hibernate Session . Javadoc называет её главным интерфейсом между java-приложением и Hibernate. Иногда её называют единицей работы или логической транзакцией. Основная функция сессии - обеспечить операции создания, чтения, удаления объектов. Объекты могут находиться в одном из 3 состояний (см. 2) Сессия создается с помощью SessionFactory. SessionFactory знает конфигурацию ORM, её внутреннее состояния immutable. При вызове Configuration().configure() загружается файл hibernate.cfg.xml. После того, как конфигурация загружена, можно изменить настройки программно. Данные корректировки возможны только до создания экземпляра фабрики сессий. // Initialize the Hibernate environment Configuration cfg = new Configuration().configure(); // Create the session factory ServiceRegistryBuilder srb = new ServiceRegistryBuilder(); ServiceRegistry sr = srb.applySettings(cfg.getProperties()).buildServiceRegistry(); SessionFactory factory = cfg.buildSessionFactory(sr); // Obtain the new session obj...

Первые шаги в Selenium

Цель расплывчата: понять и сделать хоть что-нибудь =) Selenium Selenium - группа продуктов. Отличное описание в статье Что такое Selenium? Selenium IDE - плагин для Firefox, позволяет записать тест, выполняя действия в браузере. Казалось бы, Selenium WebDriver должен дать больше возможностей: всё таки не из графического интерфейса тесты пишем, а с помощью языка программирования, но интересная мысль в другой статье того же автора  Что такое Selenium WebDriver? : "... WebDriver не имеет прямого отношения к тестированию. Он всего лишь предоставляет автотестам доступ к браузеру. На этом его функции заканчиваются.Структурирование, группировку и запуск тестов, а также генерацию отчётов о тестировании, обеспечивает фреймворк тестирования, такой как JUnit или TestNG для Java, .."  Локаторы Выбрать элемент на странице можно используя локаторы. Локаторы (в Selenium IDE в поле target) используют DOM, XPath или CSS (или просто ищут по id/name). Полезное: XPath: XML Path La...