27
Alexadner Korotkov Александр Коротков, Интаро Использование специальных типов данных PostgreSQL в Doctrine 2 ORM Alexander Korotkov [email protected]

Использование специальных типов данных PostgreSQL в ORM Doctrine

Embed Size (px)

Citation preview

Page 1: Использование специальных типов данных PostgreSQL в ORM Doctrine

Alexadner Korotkov

Александр Коротков, Интаро

Использование специальных

типов данных PostgreSQL в

Doctrine 2 ORM

Alexander Korotkov

[email protected]

Page 2: Использование специальных типов данных PostgreSQL в ORM Doctrine

Специальные типы данных PostgreSQL в Doctrine ORM

Alexadner Korotkov

Произвольный набор свойств

• Товар (e-commerce)

• Документ (документооборот,

каталоги и т.д.)

Page 3: Использование специальных типов данных PostgreSQL в ORM Doctrine

Специальные типы данных PostgreSQL в Doctrine ORM

Alexadner Korotkov

Подходы

• Entity-Attribute-Value

• Каждое свойство – отдельная

колонка

• СУБД-специфичные методы

Page 4: Использование специальных типов данных PostgreSQL в ORM Doctrine

Специальные типы данных PostgreSQL в Doctrine ORM

Alexadner Korotkov

Entity-Attribute-Value (EAV)

Entity AttributeValue1 * * 1

Page 5: Использование специальных типов данных PostgreSQL в ORM Doctrine

Специальные типы данных PostgreSQL в Doctrine ORM

Alexadner Korotkov

Entity-Attribute-Value (EAV)

• Не нужно изменять модель

• Сложные запросы

• Медленно

Page 6: Использование специальных типов данных PostgreSQL в ORM Doctrine

Специальные типы данных PostgreSQL в Doctrine ORM

Alexadner Korotkov

EAV

Page 7: Использование специальных типов данных PostgreSQL в ORM Doctrine

Специальные типы данных PostgreSQL в Doctrine ORM

Alexadner Korotkov

Добавление каждого

свойства в модель

• Запросы работают быстро

• Необходимо динамически

менять модель

• Много столбцов

Page 8: Использование специальных типов данных PostgreSQL в ORM Doctrine

Специальные типы данных PostgreSQL в Doctrine ORM

Alexadner Korotkov

Добавление каждого

свойства в модель

Page 9: Использование специальных типов данных PostgreSQL в ORM Doctrine

Специальные типы данных PostgreSQL в Doctrine ORM

Alexadner Korotkov

PostgreSQL

Page 10: Использование специальных типов данных PostgreSQL в ORM Doctrine

Специальные типы данных PostgreSQL в Doctrine ORM

Alexadner Korotkov

hstore

SQL

NoSQL

Page 11: Использование специальных типов данных PostgreSQL в ORM Doctrine

Специальные типы данных PostgreSQL в Doctrine ORM

Alexadner Korotkov

hstore в PostgreSQL

• Не нужно изменять модель

• Прозрачная работа со стороны PHP

• Запросы работают быстро

• СУБД-зависимое решение

Page 12: Использование специальных типов данных PostgreSQL в ORM Doctrine

Специальные типы данных PostgreSQL в Doctrine ORM

Alexadner Korotkov

Объявление в модели

/**

* @var array $properties

*

* @ORM\Column(name="properties", type="hstore", nullable=true)

*/

private $properties;

Page 13: Использование специальных типов данных PostgreSQL в ORM Doctrine

Специальные типы данных 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

Специальные типы данных PostgreSQL в Doctrine ORM

Alexadner Korotkov

Прозрачная работа

Page 15: Использование специальных типов данных PostgreSQL в ORM Doctrine

Специальные типы данных 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

Специальные типы данных 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

Специальные типы данных 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

Специальные типы данных PostgreSQL в Doctrine ORM

Alexadner Korotkov

SQL

SELECT

...

FROM

product i0_

WHERE

fetchval(i0_.properties, 'w') = ?

Page 19: Использование специальных типов данных PostgreSQL в ORM Doctrine

Специальные типы данных 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

Специальные типы данных PostgreSQL в Doctrine ORM

Alexadner Korotkov

SQL

SELECT...,fetchval(i0_.properties, 'w') AS sclr13,...

FROMproduct i0_

ORDER BYsclr13 ASC

Page 21: Использование специальных типов данных PostgreSQL в ORM Doctrine

Специальные типы данных 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

Специальные типы данных PostgreSQL в Doctrine ORM

Alexadner Korotkov

Удобно

Page 23: Использование специальных типов данных PostgreSQL в ORM Doctrine

Специальные типы данных PostgreSQL в Doctrine ORM

Alexadner Korotkov

Хак (((

CREATE OPERATOR <=(PROCEDURE = hs_contained,LEFTARG = hstore,RIGHTARG = hstore,COMMUTATOR = >=,RESTRICT = contsel,JOIN = contjoinsel);

Page 24: Использование специальных типов данных PostgreSQL в ORM Doctrine

Специальные типы данных PostgreSQL в Doctrine ORM

Alexadner Korotkov

Скорости нннада?

Page 25: Использование специальных типов данных PostgreSQL в ORM Doctrine

Специальные типы данных 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

Специальные типы данных PostgreSQL в Doctrine ORM

Alexadner Korotkov

Index

CREATE INDEX

i_crm_product_properties

ON

i_crm_product

USING

gin

(properties);

Page 27: Использование специальных типов данных PostgreSQL в ORM Doctrine

Специальные типы данных PostgreSQL в Doctrine ORM

Alexadner Korotkov

Спасибо за внимание!