SlideShare une entreprise Scribd logo
1  sur  22
Télécharger pour lire hors ligne
PostgreSQL.
 Лучшая СУБД для Web 2.0
         Николай Самохвалов,
              ООО «Постгресмен»,
Российское сообщество пользователей PostgreSQL
PostgreSQL + Web 2.0 = ?
           PostgreSQL — самая развитая из
       открытых систем баз данных в мире

                 Используют:
Что такое Web 2.0?
Что такое Web 2.0?
      Для пользователей:
      ●
          collaborative web (UGC, комментарии,
          рейтингование и т.д.);
      ●
          веб-приложения, а не веб-сайты
          (AJAX, новый уровень интеграции)
      ●
          веб как платформа
          (интероперабельность, RSS,
          микроформаты и т.д.)
      ●
          закруглённые уголки, отражения в
          логотипах и т.д. :-)
___________________
*)
     UGC (user-generated content) — контент, созданный пользователями
Что такое Web 2.0?
 Для разработчиков:
            больше          больше        больше
         пользователей   разработчиков   проектов

                    больше конкурентов
                         на рынке

выше темпы       высокая                      пользователи,
                                 растущие
разработки,   изменчивость
                                  объёмы     хиты, TPS и пр.:
 итерации        бизнес-
  короче       требований
                                  данных            N = et

         Лучшие технологии помогают побеждать!
Почему PostgreSQL?
1. Производительность,
   масштабируемость
2. Надёжность
3. Богатые возможности
4. Соответствие стандартам,
   “правильность”
5. Свобода
Почему PostgreSQL?
                              }
1. Производительность,
   масштабируемость               Качество
2. Надёжность
3. Богатые возможности        } Эффективная разработка

                              }
4. Соответствие стандартам,
   “правильность”                 HR
5. Свобода
Как работать с UGC?
1. Таксономия
  ●
      Каталоги
2. Фолксономия
  ●
      Теги
3. Комплексный подход, два пути:
  ●
      Теги + Каталоги
  ●
      И пользователи, и редакторы управляют
      каталогами
UGC: таксономия
1. Таксономия (Каталоги)
   ●
       EAV, где таблица Атрибут [почти] неизменна
   ●
       intarray / hstore
EAV: Entity-Attribute-Value
Entity                      Value




                Attribute
contrib/intarray, contrib/hstore
                                item
              obj_id                   INT8
              item_section_id          INT8
              item_vendor_id           INT8
              item_model_id            INT8
              item_year                INT2
              item_price               NUMERIC(30,6)
              item_props               intarray




●
    Позволяет существенно сэкономить место на диске
●
    Производительность хороша, если вы сочетаете GiST и GIN
    индексы
●
    Иногда разумно кэшировать значения тегов во внешнем
    кеше (напр., Memcache; можно применять pgmemcache в
    триггерах для инвалидации кэша), если используется
    intarray => меньше соединений в SELECT-ах
UGC: фолксономия
1. Фолксономия (Теги)
   ●
       EAV (снова), таблица Атрибут под контролем
       пользователей
   ●
       intarray / hstore (снова)
UGC: комплексный подход
Два возможных варианта:
   1. Теги + Каталоги
      — часто используемый вариант
   2. И пользователи, и редакторы контролируют Каталоги
      — наиболее перспективный, но сложный для
       разработки и поддержки подход
      ●
          UGC-записи каталогов не отображаются в общих списках
          выборки <SELECT>, ждут одобрения редакторов.
      ●
          Процедура 'слияния' далеко не простая (как правильно
          объединять UGC и редакторский контент?; дубликаты;
          синонимы и т.п.).
      ●
          полнотекстовый поиск (стемминг, морфология,
          тезаурус), pg_trgm, metaphone, soundex и т.д. могут
          помочь. НО: работа человека по-прежнему необходима
UGC: подробнее о тегах
1. Используйте FTS (бывший tsearch2) для интеграции
   поиска по тегам и текстового поиска:
   ●
       категории FTS, чтобы отличать теги от обычных
       слов при поиске (когда необходимо);
   ●
       для обработки тегов можно создать отдельную
       конфигурацию FTS.
2. Используйте «префиксный поиск» для поиска по
   тегам. Решение пока не тривиально (см. следующие
   слайды ;-) )
UGC: теги и префиксный поиск
Пример префиксного поиска:




Решение “в лоб” разочаровывает:
test=# EXPLAIN ANALYZE SELECT * FROM tag WHERE tag_name LIKE 'postgr%';
                         QUERY PLAN
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
 Seq Scan on tag  (cost=0.00..6182.75 rows=1 width=105) (actual
time=0.951..102.779 rows=162 loops=1)
   Filter: ((tag_name)::text ~~ 'postgr%'::text)
 Total runtime: 102.871 ms
(3 rows)

Замечание: ~300 000 уникальных тегов
Префиксный поиск: как сделать быстрее
1. Используем text_pattern_ops для ускорения LIKE 'postgr%':
test=# CREATE INDEX i_tag_prefix ON tag 
            USING btree(lower(tag_name) text_pattern_ops);
CREATE INDEX

test=# EXPLAIN ANALYZE SELECT * FROM tag 
                       WHERE lower(tag_name) LIKE lower('bla%');
                           QUERY PLAN
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
 Bitmap Heap Scan on tag  (cost=43.55..2356.16 rows=1096 width=105)
(actual time=0.164..0.791 rows=235 loops=1)
   Filter: (lower((tag_name)::text) ~~ 'postgr%'::text)
   ­>  Bitmap Index Scan on i_tag_prefix  (cost=0.00..43.28 
rows=1096
width=0) (actual time=0.116..0.116 rows=235 loops=1)
         Index Cond: ((lower((tag_name)::text) ~>=~ 'bla'::text) 
AND
(lower((tag_name)::text) ~<~ 'postgs'::text))
 Total runtime: 0.885 ms
Префиксный поиск: как сделать быстрее
2. Создаём таблицу tag_words (уникальные теги), чтобы работать
со словами, а не фразами:
CREATE TABLE tag_words AS 
    SELECT DISTINCT word 
    FROM ts_stat('SELECT to_tsvector(tag_name) FROM tag'); ­­ ждём, ждём
DROP INDEX i_tag_prefix;
CREATE INDEX i_tag_fts ON tag USING gin(to_tsvector(tag_name));
CREATE INDEX i_tag_words_prefix ON tag_words 
    USING btree(lower(word) text_pattern_ops);

test=# EXPLAIN ANALYZE 
  SELECT * FROM tag 
  WHERE to_tsvector('utf8_russian'::regconfig, tag_name::text) 
        @@ to_tsquery('utf8_russian', '(' || (
          SELECT array_to_string(array_accum(lower(word)), '|')
          FROM tag_words
          WHERE lower(word) LIKE 'postgr%') || ')'); ­­ добавляем 

         ­­'...&word1&word2', если надо
/* план опущен */
 Total runtime: 13.243 ms
(11 rows)
Комментарии и рейтинги для всего
                         obj

          obj_id                  INT8          — Не SERIAL, см. следующий слайд
          obj_status_did          INT8          — Значение из справочника
          obj_creator_obj_id      INT8          — ID создателя (если применимо)
          obj_created             TIMESTAMP
          obj_modified
          obj_commented
                                  TIMESTAMP
                                  TIMESTAMP
                                                }­ 
                                                  NOT NULL DEFAULT CURRENT_TIMESTAMP

          obj_marks_count         INT4
          obj_marks_rating        FLOAT8        }- оцениваем всё!
          obj_tsvector            tsvector     — Почти везде нужен полнотекст.


    user2obj
                                  group
u2o_user_obj_id                                       comment
u2o_obj_obj_id
u2o_mark                   user               comment_author_obj_id
u2o_is_favorite                               comment_text
Комментарии и рейтинги для всего
create table comment (
   obj_id INT8 not null default (((nextval('comment_obj_id_seq'::regclass
                                     * 223072849) % (1000000000)::bigint
     constraint c_obj_comment_obj_id check 
        (obj_id between 41000000000 and 41999999999),
   comment_author_obj_id INT8,
   comment_body VARCHAR (2000) NOT NULL,
   constraint PK_MESSAGE primary key (obj_id)
)
inherits (obj);

­­ Как генерируются ID:
­­ nextID = (N mod Y) * X + S, 
­­        where X & Y are co­primes, and S is an interval shift 

­­ Используем отдельный sequence для каждой таблицы!

­­ не забыть:
SET constraint_exclusion ON;
Google Maps mashup: с PostgreSQL
               это просто!
Как хранить и индексировать гео-данные в PostgreSQL:
   – two integer columns and B-tree
  – point column and R-tree
  – PostGIS
  – pgSphere           GiST
  – Q3C
Итоги
PostgreSQL обладает отличными
 возможностями, отвечающими
 нуждам Web 2.0 разработчиков
PostgreSQL позволяет разрабатывать
 быстро, без потери качества
Создавайте Web 2.0 проекты с PostgreSQL!
Контакты
nikolay@samokhvalov.com
Blog: http://nikolay.samokhvalov.com
XMPP/GTalk: samokhvalov@gmail.com
Skype: samokhvalov OR postgresmen
+7 905 783 9804



                        Спасибо!

                       Вопросы?

Contenu connexe

En vedette

#PostgreSQLRussia в банке Тинькофф, доклад №1
#PostgreSQLRussia в банке Тинькофф, доклад №1#PostgreSQLRussia в банке Тинькофф, доклад №1
#PostgreSQLRussia в банке Тинькофф, доклад №1Nikolay Samokhvalov
 
PostgreSQL Moscow Meetup - September 2014 - Oleg Bartunov and Alexander Korotkov
PostgreSQL Moscow Meetup - September 2014 - Oleg Bartunov and Alexander KorotkovPostgreSQL Moscow Meetup - September 2014 - Oleg Bartunov and Alexander Korotkov
PostgreSQL Moscow Meetup - September 2014 - Oleg Bartunov and Alexander KorotkovNikolay Samokhvalov
 
2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, ParallelsNikolay Samokhvalov
 
PostgreSQL Moscow Meetup - September 2014 - Ilya Kosmodemyansky
PostgreSQL Moscow Meetup - September 2014 - Ilya KosmodemyanskyPostgreSQL Moscow Meetup - September 2014 - Ilya Kosmodemyansky
PostgreSQL Moscow Meetup - September 2014 - Ilya KosmodemyanskyNikolay Samokhvalov
 
PostgreSQL Moscow Meetup - September 2014 - Nikolay Samokhvalov
PostgreSQL Moscow Meetup - September 2014 - Nikolay SamokhvalovPostgreSQL Moscow Meetup - September 2014 - Nikolay Samokhvalov
PostgreSQL Moscow Meetup - September 2014 - Nikolay SamokhvalovNikolay Samokhvalov
 
2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4
2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.42014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4
2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4Nikolay Samokhvalov
 
2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussia
2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussia2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussia
2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussiaNikolay Samokhvalov
 
2014.10.15 Сергей Бурладян, Avito.ru
2014.10.15 Сергей Бурладян, Avito.ru2014.10.15 Сергей Бурладян, Avito.ru
2014.10.15 Сергей Бурладян, Avito.ruNikolay Samokhvalov
 

En vedette (9)

#PostgreSQLRussia в банке Тинькофф, доклад №1
#PostgreSQLRussia в банке Тинькофф, доклад №1#PostgreSQLRussia в банке Тинькофф, доклад №1
#PostgreSQLRussia в банке Тинькофф, доклад №1
 
PostgreSQL Moscow Meetup - September 2014 - Oleg Bartunov and Alexander Korotkov
PostgreSQL Moscow Meetup - September 2014 - Oleg Bartunov and Alexander KorotkovPostgreSQL Moscow Meetup - September 2014 - Oleg Bartunov and Alexander Korotkov
PostgreSQL Moscow Meetup - September 2014 - Oleg Bartunov and Alexander Korotkov
 
2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels
 
PostgreSQL Moscow Meetup - September 2014 - Ilya Kosmodemyansky
PostgreSQL Moscow Meetup - September 2014 - Ilya KosmodemyanskyPostgreSQL Moscow Meetup - September 2014 - Ilya Kosmodemyansky
PostgreSQL Moscow Meetup - September 2014 - Ilya Kosmodemyansky
 
PostgreSQL Moscow Meetup - September 2014 - Nikolay Samokhvalov
PostgreSQL Moscow Meetup - September 2014 - Nikolay SamokhvalovPostgreSQL Moscow Meetup - September 2014 - Nikolay Samokhvalov
PostgreSQL Moscow Meetup - September 2014 - Nikolay Samokhvalov
 
2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4
2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.42014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4
2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4
 
2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussia
2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussia2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussia
2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussia
 
2014.10.15 Сергей Бурладян, Avito.ru
2014.10.15 Сергей Бурладян, Avito.ru2014.10.15 Сергей Бурладян, Avito.ru
2014.10.15 Сергей Бурладян, Avito.ru
 
20071113 Msu Vasenin Seminar
20071113 Msu Vasenin Seminar20071113 Msu Vasenin Seminar
20071113 Msu Vasenin Seminar
 

Plus de Nikolay Samokhvalov

Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
 Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва... Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...Nikolay Samokhvalov
 
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данныхПромышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данныхNikolay Samokhvalov
 
The Art of Database Experiments – PostgresConf Silicon Valley 2018 / San Jose
The Art of Database Experiments – PostgresConf Silicon Valley 2018 / San JoseThe Art of Database Experiments – PostgresConf Silicon Valley 2018 / San Jose
The Art of Database Experiments – PostgresConf Silicon Valley 2018 / San JoseNikolay Samokhvalov
 
Nancy CLI. Automated Database Experiments
Nancy CLI. Automated Database ExperimentsNancy CLI. Automated Database Experiments
Nancy CLI. Automated Database ExperimentsNikolay Samokhvalov
 
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросыNikolay Samokhvalov
 
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросыNikolay Samokhvalov
 
Database First! О распространённых ошибках использования РСУБД
Database First! О распространённых ошибках использования РСУБДDatabase First! О распространённых ошибках использования РСУБД
Database First! О распространённых ошибках использования РСУБДNikolay Samokhvalov
 
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6Nikolay Samokhvalov
 
SFPUG 2015.11.20 lightning talk "PostgreSQL in Russia"
SFPUG 2015.11.20 lightning talk "PostgreSQL in Russia"SFPUG 2015.11.20 lightning talk "PostgreSQL in Russia"
SFPUG 2015.11.20 lightning talk "PostgreSQL in Russia"Nikolay Samokhvalov
 
2014.10.15 блиц-доклад PostgreSQL kNN search
2014.10.15 блиц-доклад PostgreSQL kNN search2014.10.15 блиц-доклад PostgreSQL kNN search
2014.10.15 блиц-доклад PostgreSQL kNN searchNikolay Samokhvalov
 
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)Nikolay Samokhvalov
 
20080424 Cdb2008 Postgresql8.3 Samokhvalov
20080424 Cdb2008 Postgresql8.3 Samokhvalov20080424 Cdb2008 Postgresql8.3 Samokhvalov
20080424 Cdb2008 Postgresql8.3 SamokhvalovNikolay Samokhvalov
 
20080330 Postgresqlconference2008 Pg In Web2.0 Samokhvalov
20080330 Postgresqlconference2008 Pg In Web2.0 Samokhvalov20080330 Postgresqlconference2008 Pg In Web2.0 Samokhvalov
20080330 Postgresqlconference2008 Pg In Web2.0 SamokhvalovNikolay Samokhvalov
 

Plus de Nikolay Samokhvalov (14)

Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
 Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва... Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
 
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данныхПромышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
 
The Art of Database Experiments – PostgresConf Silicon Valley 2018 / San Jose
The Art of Database Experiments – PostgresConf Silicon Valley 2018 / San JoseThe Art of Database Experiments – PostgresConf Silicon Valley 2018 / San Jose
The Art of Database Experiments – PostgresConf Silicon Valley 2018 / San Jose
 
Nancy CLI. Automated Database Experiments
Nancy CLI. Automated Database ExperimentsNancy CLI. Automated Database Experiments
Nancy CLI. Automated Database Experiments
 
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
 
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
 
Database First! О распространённых ошибках использования РСУБД
Database First! О распространённых ошибках использования РСУБДDatabase First! О распространённых ошибках использования РСУБД
Database First! О распространённых ошибках использования РСУБД
 
2016.10.13 PostgreSQL in Russia
2016.10.13 PostgreSQL in Russia2016.10.13 PostgreSQL in Russia
2016.10.13 PostgreSQL in Russia
 
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
 
SFPUG 2015.11.20 lightning talk "PostgreSQL in Russia"
SFPUG 2015.11.20 lightning talk "PostgreSQL in Russia"SFPUG 2015.11.20 lightning talk "PostgreSQL in Russia"
SFPUG 2015.11.20 lightning talk "PostgreSQL in Russia"
 
2014.10.15 блиц-доклад PostgreSQL kNN search
2014.10.15 блиц-доклад PostgreSQL kNN search2014.10.15 блиц-доклад PostgreSQL kNN search
2014.10.15 блиц-доклад PostgreSQL kNN search
 
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
 
20080424 Cdb2008 Postgresql8.3 Samokhvalov
20080424 Cdb2008 Postgresql8.3 Samokhvalov20080424 Cdb2008 Postgresql8.3 Samokhvalov
20080424 Cdb2008 Postgresql8.3 Samokhvalov
 
20080330 Postgresqlconference2008 Pg In Web2.0 Samokhvalov
20080330 Postgresqlconference2008 Pg In Web2.0 Samokhvalov20080330 Postgresqlconference2008 Pg In Web2.0 Samokhvalov
20080330 Postgresqlconference2008 Pg In Web2.0 Samokhvalov
 

20080415 Rit2008 Pgsql Web20 Samokhvalov

  • 1. PostgreSQL. Лучшая СУБД для Web 2.0 Николай Самохвалов, ООО «Постгресмен», Российское сообщество пользователей PostgreSQL
  • 2. PostgreSQL + Web 2.0 = ? PostgreSQL — самая развитая из открытых систем баз данных в мире Используют:
  • 4. Что такое Web 2.0? Для пользователей: ● collaborative web (UGC, комментарии, рейтингование и т.д.); ● веб-приложения, а не веб-сайты (AJAX, новый уровень интеграции) ● веб как платформа (интероперабельность, RSS, микроформаты и т.д.) ● закруглённые уголки, отражения в логотипах и т.д. :-) ___________________ *) UGC (user-generated content) — контент, созданный пользователями
  • 5. Что такое Web 2.0? Для разработчиков: больше больше больше пользователей разработчиков проектов больше конкурентов на рынке выше темпы высокая пользователи, растущие разработки, изменчивость объёмы хиты, TPS и пр.: итерации бизнес- короче требований данных N = et Лучшие технологии помогают побеждать!
  • 6. Почему PostgreSQL? 1. Производительность, масштабируемость 2. Надёжность 3. Богатые возможности 4. Соответствие стандартам, “правильность” 5. Свобода
  • 7. Почему PostgreSQL? } 1. Производительность, масштабируемость Качество 2. Надёжность 3. Богатые возможности } Эффективная разработка } 4. Соответствие стандартам, “правильность” HR 5. Свобода
  • 8. Как работать с UGC? 1. Таксономия ● Каталоги 2. Фолксономия ● Теги 3. Комплексный подход, два пути: ● Теги + Каталоги ● И пользователи, и редакторы управляют каталогами
  • 9. UGC: таксономия 1. Таксономия (Каталоги) ● EAV, где таблица Атрибут [почти] неизменна ● intarray / hstore
  • 11. contrib/intarray, contrib/hstore item obj_id INT8 item_section_id INT8 item_vendor_id INT8 item_model_id INT8 item_year INT2 item_price NUMERIC(30,6) item_props intarray ● Позволяет существенно сэкономить место на диске ● Производительность хороша, если вы сочетаете GiST и GIN индексы ● Иногда разумно кэшировать значения тегов во внешнем кеше (напр., Memcache; можно применять pgmemcache в триггерах для инвалидации кэша), если используется intarray => меньше соединений в SELECT-ах
  • 12. UGC: фолксономия 1. Фолксономия (Теги) ● EAV (снова), таблица Атрибут под контролем пользователей ● intarray / hstore (снова)
  • 13. UGC: комплексный подход Два возможных варианта: 1. Теги + Каталоги — часто используемый вариант 2. И пользователи, и редакторы контролируют Каталоги — наиболее перспективный, но сложный для разработки и поддержки подход ● UGC-записи каталогов не отображаются в общих списках выборки <SELECT>, ждут одобрения редакторов. ● Процедура 'слияния' далеко не простая (как правильно объединять UGC и редакторский контент?; дубликаты; синонимы и т.п.). ● полнотекстовый поиск (стемминг, морфология, тезаурус), pg_trgm, metaphone, soundex и т.д. могут помочь. НО: работа человека по-прежнему необходима
  • 14. UGC: подробнее о тегах 1. Используйте FTS (бывший tsearch2) для интеграции поиска по тегам и текстового поиска: ● категории FTS, чтобы отличать теги от обычных слов при поиске (когда необходимо); ● для обработки тегов можно создать отдельную конфигурацию FTS. 2. Используйте «префиксный поиск» для поиска по тегам. Решение пока не тривиально (см. следующие слайды ;-) )
  • 15. UGC: теги и префиксный поиск Пример префиксного поиска: Решение “в лоб” разочаровывает: test=# EXPLAIN ANALYZE SELECT * FROM tag WHERE tag_name LIKE 'postgr%';                          QUERY PLAN ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­  Seq Scan on tag  (cost=0.00..6182.75 rows=1 width=105) (actual time=0.951..102.779 rows=162 loops=1)    Filter: ((tag_name)::text ~~ 'postgr%'::text)  Total runtime: 102.871 ms (3 rows) Замечание: ~300 000 уникальных тегов
  • 16. Префиксный поиск: как сделать быстрее 1. Используем text_pattern_ops для ускорения LIKE 'postgr%': test=# CREATE INDEX i_tag_prefix ON tag              USING btree(lower(tag_name) text_pattern_ops); CREATE INDEX test=# EXPLAIN ANALYZE SELECT * FROM tag                         WHERE lower(tag_name) LIKE lower('bla%');                            QUERY PLAN ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­  Bitmap Heap Scan on tag  (cost=43.55..2356.16 rows=1096 width=105) (actual time=0.164..0.791 rows=235 loops=1)    Filter: (lower((tag_name)::text) ~~ 'postgr%'::text)    ­>  Bitmap Index Scan on i_tag_prefix  (cost=0.00..43.28  rows=1096 width=0) (actual time=0.116..0.116 rows=235 loops=1)          Index Cond: ((lower((tag_name)::text) ~>=~ 'bla'::text)  AND (lower((tag_name)::text) ~<~ 'postgs'::text))  Total runtime: 0.885 ms
  • 17. Префиксный поиск: как сделать быстрее 2. Создаём таблицу tag_words (уникальные теги), чтобы работать со словами, а не фразами: CREATE TABLE tag_words AS      SELECT DISTINCT word      FROM ts_stat('SELECT to_tsvector(tag_name) FROM tag'); ­­ ждём, ждём DROP INDEX i_tag_prefix; CREATE INDEX i_tag_fts ON tag USING gin(to_tsvector(tag_name)); CREATE INDEX i_tag_words_prefix ON tag_words      USING btree(lower(word) text_pattern_ops); test=# EXPLAIN ANALYZE    SELECT * FROM tag    WHERE to_tsvector('utf8_russian'::regconfig, tag_name::text)          @@ to_tsquery('utf8_russian', '(' || (           SELECT array_to_string(array_accum(lower(word)), '|')           FROM tag_words           WHERE lower(word) LIKE 'postgr%') || ')'); ­­ добавляем  ­­'...&word1&word2', если надо /* план опущен */  Total runtime: 13.243 ms (11 rows)
  • 18. Комментарии и рейтинги для всего obj obj_id      INT8 — Не SERIAL, см. следующий слайд obj_status_did INT8 — Значение из справочника obj_creator_obj_id INT8 — ID создателя (если применимо) obj_created TIMESTAMP obj_modified obj_commented TIMESTAMP TIMESTAMP }­  NOT NULL DEFAULT CURRENT_TIMESTAMP obj_marks_count INT4 obj_marks_rating FLOAT8 }- оцениваем всё! obj_tsvector tsvector — Почти везде нужен полнотекст. user2obj group u2o_user_obj_id comment u2o_obj_obj_id u2o_mark user comment_author_obj_id u2o_is_favorite comment_text
  • 19. Комментарии и рейтинги для всего create table comment (    obj_id INT8 not null default (((nextval('comment_obj_id_seq'::regclass * 223072849) % (1000000000)::bigint      constraint c_obj_comment_obj_id check          (obj_id between 41000000000 and 41999999999),    comment_author_obj_id INT8,    comment_body VARCHAR (2000) NOT NULL,    constraint PK_MESSAGE primary key (obj_id) ) inherits (obj); ­­ Как генерируются ID: ­­ nextID = (N mod Y) * X + S,  ­­        where X & Y are co­primes, and S is an interval shift  ­­ Используем отдельный sequence для каждой таблицы! ­­ не забыть: SET constraint_exclusion ON;
  • 20. Google Maps mashup: с PostgreSQL это просто! Как хранить и индексировать гео-данные в PostgreSQL: – two integer columns and B-tree – point column and R-tree – PostGIS – pgSphere GiST – Q3C
  • 21. Итоги PostgreSQL обладает отличными возможностями, отвечающими нуждам Web 2.0 разработчиков PostgreSQL позволяет разрабатывать быстро, без потери качества Создавайте Web 2.0 проекты с PostgreSQL!