Использование специальных типов данных postgresql в orm doctrine
TRANSCRIPT
![Page 1: Использование специальных типов данных PostgreSQL в ORM Doctrine](https://reader031.vdocuments.pub/reader031/viewer/2022012400/5558e9e4d8b42ad7138b5256/html5/thumbnails/1.jpg)
Alexadner Korotkov
Александр Коротков, Интаро
Использование специальных
типов данных PostgreSQL в
Doctrine 2 ORM
Alexander Korotkov
![Page 2: Использование специальных типов данных PostgreSQL в ORM Doctrine](https://reader031.vdocuments.pub/reader031/viewer/2022012400/5558e9e4d8b42ad7138b5256/html5/thumbnails/2.jpg)
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Произвольный набор свойств
• Товар (e-commerce)
• Документ (документооборот,
каталоги и т.д.)
![Page 3: Использование специальных типов данных PostgreSQL в ORM Doctrine](https://reader031.vdocuments.pub/reader031/viewer/2022012400/5558e9e4d8b42ad7138b5256/html5/thumbnails/3.jpg)
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Подходы
• Entity-Attribute-Value
• Каждое свойство – отдельная
колонка
• СУБД-специфичные методы
![Page 4: Использование специальных типов данных PostgreSQL в ORM Doctrine](https://reader031.vdocuments.pub/reader031/viewer/2022012400/5558e9e4d8b42ad7138b5256/html5/thumbnails/4.jpg)
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Entity-Attribute-Value (EAV)
Entity AttributeValue1 * * 1
![Page 5: Использование специальных типов данных PostgreSQL в ORM Doctrine](https://reader031.vdocuments.pub/reader031/viewer/2022012400/5558e9e4d8b42ad7138b5256/html5/thumbnails/5.jpg)
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Entity-Attribute-Value (EAV)
• Не нужно изменять модель
• Сложные запросы
• Медленно
![Page 6: Использование специальных типов данных PostgreSQL в ORM Doctrine](https://reader031.vdocuments.pub/reader031/viewer/2022012400/5558e9e4d8b42ad7138b5256/html5/thumbnails/6.jpg)
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
EAV
![Page 7: Использование специальных типов данных PostgreSQL в ORM Doctrine](https://reader031.vdocuments.pub/reader031/viewer/2022012400/5558e9e4d8b42ad7138b5256/html5/thumbnails/7.jpg)
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Добавление каждого
свойства в модель
• Запросы работают быстро
• Необходимо динамически
менять модель
• Много столбцов
![Page 8: Использование специальных типов данных PostgreSQL в ORM Doctrine](https://reader031.vdocuments.pub/reader031/viewer/2022012400/5558e9e4d8b42ad7138b5256/html5/thumbnails/8.jpg)
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Добавление каждого
свойства в модель
![Page 9: Использование специальных типов данных PostgreSQL в ORM Doctrine](https://reader031.vdocuments.pub/reader031/viewer/2022012400/5558e9e4d8b42ad7138b5256/html5/thumbnails/9.jpg)
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
PostgreSQL
![Page 10: Использование специальных типов данных PostgreSQL в ORM Doctrine](https://reader031.vdocuments.pub/reader031/viewer/2022012400/5558e9e4d8b42ad7138b5256/html5/thumbnails/10.jpg)
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
hstore
SQL
NoSQL
![Page 11: Использование специальных типов данных PostgreSQL в ORM Doctrine](https://reader031.vdocuments.pub/reader031/viewer/2022012400/5558e9e4d8b42ad7138b5256/html5/thumbnails/11.jpg)
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
hstore в PostgreSQL
• Не нужно изменять модель
• Прозрачная работа со стороны PHP
• Запросы работают быстро
• СУБД-зависимое решение
![Page 12: Использование специальных типов данных PostgreSQL в ORM Doctrine](https://reader031.vdocuments.pub/reader031/viewer/2022012400/5558e9e4d8b42ad7138b5256/html5/thumbnails/12.jpg)
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Объявление в модели
/**
* @var array $properties
*
* @ORM\Column(name="properties", type="hstore", nullable=true)
*/
private $properties;
![Page 13: Использование специальных типов данных PostgreSQL в ORM Doctrine](https://reader031.vdocuments.pub/reader031/viewer/2022012400/5558e9e4d8b42ad7138b5256/html5/thumbnails/13.jpg)
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Сохранение данных
$product = new Product();$product->setName(‘box’);
$product->setProperties(array('w' => 80,'h' => 60
));$em->persist($product);$em->flush();
![Page 14: Использование специальных типов данных PostgreSQL в ORM Doctrine](https://reader031.vdocuments.pub/reader031/viewer/2022012400/5558e9e4d8b42ad7138b5256/html5/thumbnails/14.jpg)
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Прозрачная работа
![Page 15: Использование специальных типов данных PostgreSQL в ORM Doctrine](https://reader031.vdocuments.pub/reader031/viewer/2022012400/5558e9e4d8b42ad7138b5256/html5/thumbnails/15.jpg)
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Что происходит в базе
crm=# select id, name, properties from
product;
id | name | properties ----+------+----------------------
1 | box | "h"=>"60", "w"=>"80"
(1 row)
![Page 16: Использование специальных типов данных PostgreSQL в ORM Doctrine](https://reader031.vdocuments.pub/reader031/viewer/2022012400/5558e9e4d8b42ad7138b5256/html5/thumbnails/16.jpg)
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Извлечение из базы$product = $this->getDoctrine()
->getRepository(‘Product')
->find(1);
print_r($product->getProperties());
Array (
[h] => 60
[w] => 80
)
![Page 17: Использование специальных типов данных PostgreSQL в ORM Doctrine](https://reader031.vdocuments.pub/reader031/viewer/2022012400/5558e9e4d8b42ad7138b5256/html5/thumbnails/17.jpg)
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Функция fetchval: фильтрация
$query = $em->createQuery(“
SELECT p
FROM Product p
WHERE
fetchval(p.properties, 'w') = :value
“)->setParameter('value', '80');
![Page 18: Использование специальных типов данных PostgreSQL в ORM Doctrine](https://reader031.vdocuments.pub/reader031/viewer/2022012400/5558e9e4d8b42ad7138b5256/html5/thumbnails/18.jpg)
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
SQL
SELECT
...
FROM
product i0_
WHERE
fetchval(i0_.properties, 'w') = ?
![Page 19: Использование специальных типов данных PostgreSQL в ORM Doctrine](https://reader031.vdocuments.pub/reader031/viewer/2022012400/5558e9e4d8b42ad7138b5256/html5/thumbnails/19.jpg)
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Функция fetchval: сортировка
$query = $em->createQuery(“
SELECT
p,
fetchval(p.properties, 'w') AS w
FROM Product p
ORDER BY w
“);
![Page 20: Использование специальных типов данных PostgreSQL в ORM Doctrine](https://reader031.vdocuments.pub/reader031/viewer/2022012400/5558e9e4d8b42ad7138b5256/html5/thumbnails/20.jpg)
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
SQL
SELECT...,fetchval(i0_.properties, 'w') AS sclr13,...
FROMproduct i0_
ORDER BYsclr13 ASC
![Page 21: Использование специальных типов данных PostgreSQL в ORM Doctrine](https://reader031.vdocuments.pub/reader031/viewer/2022012400/5558e9e4d8b42ad7138b5256/html5/thumbnails/21.jpg)
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Операторы >= и <=
$query = $em->createQuery(‘
SELECT p
FROM Product p
WHERE p.properties >= :property
’)->setParameter('property',
array('w' => 80), 'hstore');
![Page 22: Использование специальных типов данных PostgreSQL в ORM Doctrine](https://reader031.vdocuments.pub/reader031/viewer/2022012400/5558e9e4d8b42ad7138b5256/html5/thumbnails/22.jpg)
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Удобно
![Page 23: Использование специальных типов данных PostgreSQL в ORM Doctrine](https://reader031.vdocuments.pub/reader031/viewer/2022012400/5558e9e4d8b42ad7138b5256/html5/thumbnails/23.jpg)
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Хак (((
CREATE OPERATOR <=(PROCEDURE = hs_contained,LEFTARG = hstore,RIGHTARG = hstore,COMMUTATOR = >=,RESTRICT = contsel,JOIN = contjoinsel);
![Page 24: Использование специальных типов данных PostgreSQL в ORM Doctrine](https://reader031.vdocuments.pub/reader031/viewer/2022012400/5558e9e4d8b42ad7138b5256/html5/thumbnails/24.jpg)
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Скорости нннада?
![Page 25: Использование специальных типов данных PostgreSQL в ORM Doctrine](https://reader031.vdocuments.pub/reader031/viewer/2022012400/5558e9e4d8b42ad7138b5256/html5/thumbnails/25.jpg)
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Index
CREATE INDEX
i_crm_product_properties_w
ON
i_crm_product
(
fetchval(properties, 'w')
);
![Page 26: Использование специальных типов данных PostgreSQL в ORM Doctrine](https://reader031.vdocuments.pub/reader031/viewer/2022012400/5558e9e4d8b42ad7138b5256/html5/thumbnails/26.jpg)
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Index
CREATE INDEX
i_crm_product_properties
ON
i_crm_product
USING
gin
(properties);
![Page 27: Использование специальных типов данных PostgreSQL в ORM Doctrine](https://reader031.vdocuments.pub/reader031/viewer/2022012400/5558e9e4d8b42ad7138b5256/html5/thumbnails/27.jpg)
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Спасибо за внимание!