Open Source SQL databases enter millions queries per second era
Использование специальных типов данных PostgreSQL в ORM Doctrine
1. Использование специальных
типов данных PostgreSQL в
Александр Коротков, Интаро
Doctrine 2 ORM
Alexander Korotkov
aekorotkov@gmail.com
Alexadner Korotkov
2. Специальные типы данных PostgreSQL в Doctrine ORM
Произвольный набор свойств
• Товар (e-commerce)
• Документ (документооборот,
каталоги и т.д.)
Alexadner Korotkov
3. Специальные типы данных PostgreSQL в Doctrine ORM
Подходы
• Entity-Attribute-Value
• Каждое свойство – отдельная
колонка
• СУБД-специфичные методы
Alexadner Korotkov
4. Специальные типы данных PostgreSQL в Doctrine ORM
Entity-Attribute-Value (EAV)
1 * * 1
Entity Value Attribute
Alexadner Korotkov
5. Специальные типы данных PostgreSQL в Doctrine ORM
Entity-Attribute-Value (EAV)
• Не нужно изменять модель
• Сложные запросы
• Медленно
Alexadner Korotkov
7. Специальные типы данных PostgreSQL в Doctrine ORM
Добавление каждого
свойства в модель
• Запросы работают быстро
• Необходимо динамически
менять модель
• Много столбцов
Alexadner Korotkov
8. Специальные типы данных PostgreSQL в Doctrine ORM
Добавление каждого
свойства в модель
Alexadner Korotkov
11. Специальные типы данных PostgreSQL в Doctrine ORM
hstore в PostgreSQL
• Не нужно изменять модель
• Прозрачная работа со стороны
PHP
• Запросы работают быстро
• СУБД-зависимое решение
Alexadner Korotkov
12. Специальные типы данных PostgreSQL в Doctrine ORM
Объявление в модели
/**
* @var array $properties
*
* @ORMColumn(name="properties",
type="hstore", nullable=true)
*/
private $properties;
Alexadner Korotkov
13. Специальные типы данных PostgreSQL в Doctrine ORM
Сохранение данных
$product = new Product();
$product->setName(‘box’);
$product->setProperties(array(
'w' => 80,
'h' => 60
));
$em->persist($product);
$em->flush();
Alexadner Korotkov
15. Специальные типы данных PostgreSQL в Doctrine ORM
Что происходит в базе
crm=# select id, name, properties from
product;
id | name | properties
----+------+----------------------
1 | box | "h"=>"60", "w"=>"80"
(1 row)
Alexadner Korotkov
16. Специальные типы данных PostgreSQL в Doctrine ORM
Извлечение из базы
$product = $this->getDoctrine()
->getRepository(‘Product')
->find(1);
print_r($product->getProperties());
Array (
[h] => 60
[w] => 80
)
Alexadner Korotkov
17. Специальные типы данных PostgreSQL в Doctrine ORM
Функция fetchval: фильтрация
$query = $em->createQuery(“
SELECT p
FROM Product p
WHERE
fetchval(p.properties, 'w') =
:value
“)->setParameter('value', '80');
Alexadner Korotkov
18. Специальные типы данных PostgreSQL в Doctrine ORM
SQL
SELECT
...
FROM
product i0_
WHERE
fetchval(i0_.properties, 'w') = ?
Alexadner Korotkov
19. Специальные типы данных PostgreSQL в Doctrine ORM
Функция fetchval: сортировка
$query = $em->createQuery(“
SELECT
p,
fetchval(p.properties, 'w') AS w
FROM Product p
ORDER BY w
“);
Alexadner Korotkov
20. Специальные типы данных PostgreSQL в Doctrine ORM
SQL
SELECT
...,
fetchval(i0_.properties, 'w') AS sclr13,
...
FROM
product i0_
ORDER BY
sclr13 ASC
Alexadner Korotkov
21. Специальные типы данных PostgreSQL в Doctrine ORM
Операторы >= и <=
$query = $em->createQuery(‘
SELECT p
FROM Product p
WHERE p.properties >= :property
’)->setParameter('property',
array('w' => 80), 'hstore');
Alexadner Korotkov
25. Специальные типы данных PostgreSQL в Doctrine ORM
Index
CREATE INDEX
i_crm_product_properties_w
ON
i_crm_product
(
fetchval(properties, 'w')
);
Alexadner Korotkov
26. Специальные типы данных PostgreSQL в Doctrine ORM
Index
CREATE INDEX
i_crm_product_properties
ON
i_crm_product
USING
gin
(properties);
Alexadner Korotkov