Upload
alexander-korotkov
View
2.065
Download
12
Embed Size (px)
Citation preview
Alexadner Korotkov
Александр Коротков, Интаро
Использование специальных
типов данных PostgreSQL в
Doctrine 2 ORM
Alexander Korotkov
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Произвольный набор свойств
• Товар (e-commerce)
• Документ (документооборот,
каталоги и т.д.)
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Подходы
• Entity-Attribute-Value
• Каждое свойство – отдельная
колонка
• СУБД-специфичные методы
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Entity-Attribute-Value (EAV)
Entity AttributeValue1 * * 1
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Entity-Attribute-Value (EAV)
• Не нужно изменять модель
• Сложные запросы
• Медленно
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
EAV
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Добавление каждого
свойства в модель
• Запросы работают быстро
• Необходимо динамически
менять модель
• Много столбцов
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Добавление каждого
свойства в модель
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
PostgreSQL
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
hstore
SQL
NoSQL
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
hstore в PostgreSQL
• Не нужно изменять модель
• Прозрачная работа со стороны PHP
• Запросы работают быстро
• СУБД-зависимое решение
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Объявление в модели
/**
* @var array $properties
*
* @ORM\Column(name="properties", type="hstore", nullable=true)
*/
private $properties;
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Сохранение данных
$product = new Product();$product->setName(‘box’);
$product->setProperties(array('w' => 80,'h' => 60
));$em->persist($product);$em->flush();
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Прозрачная работа
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Что происходит в базе
crm=# select id, name, properties from
product;
id | name | properties ----+------+----------------------
1 | box | "h"=>"60", "w"=>"80"
(1 row)
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Извлечение из базы$product = $this->getDoctrine()
->getRepository(‘Product')
->find(1);
print_r($product->getProperties());
Array (
[h] => 60
[w] => 80
)
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Функция fetchval: фильтрация
$query = $em->createQuery(“
SELECT p
FROM Product p
WHERE
fetchval(p.properties, 'w') = :value
“)->setParameter('value', '80');
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
SQL
SELECT
...
FROM
product i0_
WHERE
fetchval(i0_.properties, 'w') = ?
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Функция fetchval: сортировка
$query = $em->createQuery(“
SELECT
p,
fetchval(p.properties, 'w') AS w
FROM Product p
ORDER BY w
“);
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
SQL
SELECT...,fetchval(i0_.properties, 'w') AS sclr13,...
FROMproduct i0_
ORDER BYsclr13 ASC
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Операторы >= и <=
$query = $em->createQuery(‘
SELECT p
FROM Product p
WHERE p.properties >= :property
’)->setParameter('property',
array('w' => 80), 'hstore');
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Удобно
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Хак (((
CREATE OPERATOR <=(PROCEDURE = hs_contained,LEFTARG = hstore,RIGHTARG = hstore,COMMUTATOR = >=,RESTRICT = contsel,JOIN = contjoinsel);
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Скорости нннада?
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Index
CREATE INDEX
i_crm_product_properties_w
ON
i_crm_product
(
fetchval(properties, 'w')
);
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Index
CREATE INDEX
i_crm_product_properties
ON
i_crm_product
USING
gin
(properties);
Специальные типы данных PostgreSQL в Doctrine ORM
Alexadner Korotkov
Спасибо за внимание!