Verzování a publikace dat na webu za pomoci PostgreSQL

Podobné dokumenty
Databázové systémy II. KIV/DB2 LS 2007/2008. Zadání semestrální práce

Databáze II. 1. přednáška. Helena Palovská

PostgreSQL. Podpora dědičnosti Rozšiřitelnost vlastní datové typy. Univerzální nasazení ve vědecké sféře

Západočeská univerzita v Plzni Katedra informatiky a výpočetní techniky. 9. června krovacek@students.zcu.cz

InnoDB transakce, cizí klíče, neumí fulltext (a nebo už ano?) CSV v textovém souboru ve formátu hodnot oddělených čárkou

Databázové systémy. - SQL * definice dat * aktualizace * pohledy. Tomáš Skopal

Návrh a tvorba WWW stránek 1/14. PHP a databáze

Tabulka fotbalové ligy

Databáze 2011/2012 SQL DDL (CREATE/ALTER/DROP TABLE), DML (INSERT/UPDATE/DELETE) RNDr.David Hoksza, Ph.D.

PL/SQL. Jazyk SQL je jazykem deklarativním, který neobsahuje procedurální příkazy jako jsou cykly, podmínky, procedury, funkce, atd.

Databáze I. Přednáška 4

Použití databází na Webu

Zápisování dat do databáze

Databázové systémy a SQL

Databázové systémy Cvičení 5.2

Databázové systémy, MS Access. Autor: Ing. Jan Nožička SOŠ a SOU Česká Lípa VY_32_INOVACE_1130_Databázové systémy, MS Access_PWP

Obchodní akademie a Jazyková škola s právem státní jazykové zkoušky Jihlava

2. blok část B Základní syntaxe příkazů SELECT, INSERT, UPDATE, DELETE

Stored Procedures & Database Triggers, Tiskové sestavy v Oracle Reports

B0M33BDT Technologie pro velká data. Supercvičení SQL, Python, Linux

Úvod do databázových systémů

SII - Informatika. 1. Atribut relace, jehož hodnota jednoznačně určuje prvek v jiné relaci, se nazývá:

Databáze I. Přednáška 7

Virtual private database. Antonín Steinhauser

Sada 1 - PHP. 14. Úvod do jazyka SQL

PG 9.5 novinky ve vývoji aplikací

Popis souboru pro generování reportů *.report

Semestrální práce z DAS2 a WWW

RNDr. Michal Kopecký, Ph.D. Department of Software Engineering, Faculty of Mathematics and Physics, Charles University in Prague

Informační systémy 2008/2009. Radim Farana. Obsah. Jazyk SQL

Databáze 2011/2012 T-SQL - kurzory, funkce. RNDr.David Hoksza, Ph.D.

7. Integrita a bezpečnost dat v DBS

7. Integrita a bezpečnost dat v DBS

17. července :51 z moravec@yahoo.com

Základy informatiky. 08 Databázové systémy. Daniela Szturcová

Jazyk SQL databáze SQLite. připravil ing. petr polách

Databáze. Velmi stručný a zjednodušený úvod do problematiky databází pro programátory v Pythonu. Bedřich Košata

Databázové systémy I

MySQL. mysql> CREATE DATABASE nova CHARACTER SET latin2 COLLATE latin2_czech_cs; Query OK, 1 row affected (0.02 sec)

Konceptuální modelování a SQL

Vzorové příklady SQL. Tabulka: Kniha CREATE TABLE kniha (id INTEGER, název VARCHAR(50), PRIMARY KEY (id))

Databázové systémy. Dotazovací jazyk SQL - III

SQL v14. 4D Developer konference. 4D Developer conference 2015 Prague, CZ Celebrating 30 years

O Apache Derby detailněji. Hynek Mlnařík

FIREBIRD relační databázový systém. Tomáš Svoboda

Kurz Databáze. Obsah. Dotazy. Zpracování dat. Doc. Ing. Radim Farana, CSc.

Inovace a zkvalitnění výuky prostřednictvím ICT. Základní seznámení s MySQL Ing. Kotásek Jaroslav

Základy informatiky. 06 Databázové systémy. Kačmařík/Szturcová/Děrgel/Rapant

Měřící systém se vzdáleným přístupem. Databáze

Informační systémy 2008/2009. Radim Farana. Obsah. Skripty a dávky. Nastavení aktuální databáze. USE DatabaseName

Nasazení Object Relation Mapping nástrojů nad legacy datovým modelem

MySQL sežere vaše data

Databáze I. 5. přednáška. Helena Palovská

PostgreSQL Novinky (a JSONB) Tomáš Vondra, GoodData (tomas.vondra@gooddata.com) (tomas@pgaddict.

Kód v databázi. RNDr. Ondřej Zýka

DATABÁZOVÉ A INFORMAČNÍ SYSTÉMY

Uložené procedury Úvod ulehčit správu zabezpečení rychleji

SQL - trigger, Databázové modelování

Databázové a informační systémy Jana Šarmanová

Vkládání, aktualizace, mazání

Transakce. Ing. Marek Sušický, RNDr. Ondřej Zýka

Kapitola 6: Omezení integrity. Omezení domény

Object-relational mapping (JPA, Hibernate)

Virtual Private Database (VPD) Jaroslav Kotrč

VYSOKÁ ŠKOLA BÁŇSKÁ TECHNICKÁ UNIVERZITA OSTRAVA HORNICKO GEOLOGICKÁ FAKULTA INSTITUT GEOINFORMATIKY. Prostorové databáze

Databázové systémy. Integritní omezení. Vilém Vychodil. V. Vychodil (KMI/DATA1, Přednáška 9) Integritní omezení Databázové systémy 1 / 33

SQL. Pohledy, ochrana dat,... Pavel Tyl

Jazyk SQL 3 - DML, DDL, TCL, DCL

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4.

Michal Krátký, Miroslav Beneš

Gymnázium a Střední odborná škola, Rokycany, Mládežníků 1115

Novinky v PostgreSQL 9.4. Tomáš Vondra, 2ndQuadrant

Databázové systémy a SQL

Administrace Oracle. Práva a role, audit

Databázové systémy. Cvičení 6: SQL

Text úlohy. Systémový katalog (DICTIONARY):

Jazyk SQL slajdy k přednášce NDBI001

5. POČÍTAČOVÉ CVIČENÍ

SQL injection jak ji možná neznáte Roman Kümmel

Inovace a zkvalitnění výuky prostřednictvím ICT Databázové systémy MySQL základní pojmy, motivace Ing. Kotásek Jaroslav

cstore_fdw column store pro PostgreSQL Prague PostgreSQL Developer Day 2015 Jan Holčapek

NÁVRH A TVORBA HUDEBNÍ DATABÁZE

SQL injection princip a ochrana

Rezervační systém Tvorba WWW stránek

KMI / TMA Tvorba mobilních aplikací. 6. seminář ZS 2016/2017 Středa 13:15-15:45

Dotazovací jazyk SQL I

- sloupcové integritní omezení

Databázové a informační systémy

zobrazení délky ve výpisu v psql

Audit DB. Referát. Vypracoval: Zdeněk Doležal MFF UK Praha 11/5/06

Univerzita Pardubice. Centrální správa dokumentů

CSPUG 2011-květen. GridSQL a pg-pool II. Vratislav Beneš benes@optisolutions.cz

Univerzita Pardubice. Fakulta elektrotechniky a informatiky

Internet cvičení. ZS 2009/10, Cvičení 3., Tomáš Pop. DISTRIBUTED SYSTEMS RESEARCH GROUP

Tvorba aplikací v Oracle Application Express

Marian Kamenický. Syntea software group a.s. marian.kamenicky. MFFUK Praha 2012/13

TimescaleDB. Pavel Stěhule 2018

PL/pgSQL. Pavel

Optimalizace dotazů a databázové transakce v Oracle

Gymnázium a Střední odborná škola, Rokycany, Mládežníků 1115

Transkript:

Prague PostgreSQL Developers' Day 2013 Verzování a publikace dat na webu za pomoci PostgreSQL Jan Pěček

Kdo jsem? Jan Pěček Programátor PostgreSQL Jyxo, s.r.o. (Blog.cz) MAFRA, a.s. - Internet Trading PHP, Java... pokladník CSPUG, o.s. pokročilý uživatel Student http://www.pecek.cz http://linkedin.com/janpecek http://facebook.com/janpecek http://twitter.com/janpecek

Pár informací...

Obsah Proces schvalování Přihlášený uživatel Verzování údajů Publikace dat, evoluce Přechod na PostgreSQL

Agenda Proces schvalování Přihlášený uživatel Verzování údajů Publikace dat, evoluce Přechod na PostgreSQL

Proces schvalování ADMIT

Proces schvalování ADMIT

Stavy záznamu zakázáno Úprava, operátor - schváleno Nový, klient - neschváleno Úprava, operátor - kontrola Úprava, klient - neschváleno Firma, a.s. Nový, operátor - neschváleno Úprava, klient - kontrola Nový, operátor - schváleno Import - schváleno Spuštěno - schváleno

Nové stavy záznamu Smazáno Čeká na schválení Firma, a.s. Schváleno

Schvalování Hlídání změn Kontrola údajů Různá práva Rozdělení odpovědnosti

Agenda Proces schvalování Přihlášený uživatel Verzování údajů Publikace dat, evoluce Přechod na PostgreSQL

Problém uživatele ADMIT user / passwd DB login / heslo

Problém uživatele DB User = login Temp tabulka PL/Perl custom_variable_classes

DB User = login Jednotky uživatelů + Jednoduše získaný uživatel Tisíce uživatelů Uložení údajů Dvojí přihlašování do DB Bezpečnost Ošetření v aplikaci Přidávání uživatelů

Temp tabulka CREATE TEMPORARY TABLE tmp_vars ( name varchar(10) PRIMARY KEY, value varchar ); INSERT INTO tmp_vars VALUES ('userid', 42); DECLARE userid int; BEGIN SELECT value INTO userid FROM tmp_vars WHERE name = 'userid';

PL/Perl Global Values CREATE FUNCTION set_var(name text, val text) RETURNS text AS $$ if ($_SHARED{$_[0]} = $_[1]) { return 'ok'; } else { return "cannot set shared variable $_[0] to $_[1]"; } $$ LANGUAGE plperl; CREATE FUNCTION get_var(name text) RETURNS text AS $$ return ($_SHARED{$_[0]}; $$ LANGUAGE plperl; SELECT set_var('userid', 42); SELECT get_var('userid'); http://www.postgresql.org/docs/9.2/static/plperl-global.html

custom_variable_classes postgresql.conf: custom_variable_classes = 'myvar' SET myvar.userid = 42; PERFORM set_config('myvar.userid'::text, '42'::text, false); DECLARE userid int; BEGIN SELECT current_setting('myvar.userid') INTO userid; http://postgres.cz/wiki/postgresql_sql_tricks#any_other_session_variables

Porovnání rychlosti 60 52,99 48,95 50 Time [ms] 40 31,24 30 33,29 26,42 Time per request Elapsed time 20 10 3,34 0 PL/Perl Session TEMP table $ ab -n 200 -c 100 'http://localhost/p2d2/type.php' Requests Number: 200 Concurrency Level: 100 $ php TYPE.php SELECT TYPE_setvar('userId', '42'); SELECT TYPE_getvar('userId')

Agenda Proces schvalování Přihlášený uživatel Verzování údajů Publikace dat, evoluce Přechod na PostgreSQL

Verzování dat Kdo? Kdy? Původní hodnota Nová hodnota ID položky #123

Schéma databáze

Revize Operace v tabulce = 1 revize #rev. 15 Seskupování revizí Schválení / odmítnutí revize #rev. 13 Kompletní historie #rev. 11 Revertování změn Rekonstrukce stavu #rev. 14 #rev. 12 #rev. 10 #rev. 9

Tabulka změn CREATE TABLE journal ( firm_id integer, revision integer DEFAULT 1, tablename varchar NOT NULL, changes changeset[] NOT NULL, itemid integer, create_user_id integer, process_user_id varchar, created timestamp NOT NULL, processed timestamp, confirmed boolean, PRIMARY KEY(firm_id, revision) );

Typ changeset CREATE TYPE changeset ( colname varchar, oldvalue varchar, newvalue varchar ); CREATE FUNCTION changeset_op_eq (changeset[], varchar) RETURNS boolean AS $$ SELECT count(*) > 0 FROM (SELECT unnest($1) AS col) x WHERE (col).colname = $2; $$ LANGUAGE sql; CREATE OPERATOR = ( PROCEDURE = changeset_op_eq, LEFTARG = changeset[], RIGHTARG = varchar, NEGATOR =!= );

Záznam změn ADMIT AFTER INSERT AFTER UPDATE BEFORE DELETE add_revision(firm_id, changes)

Uložená data journal firm_id revision tablename changes itemid create_user_id process_user_id created processed confirmed 2910 1 firm_web {"(url,,http://www.mafra.cz)","(position,,0)"} 123 42 null 2013-04-01 01:22:53 null null

Schválení změn ADMIT confirm_revision(firm_id, revision) process_revision(firm_id, revision, true)

Zamítnutí změn ADMIT decline_revision(firm_id, revision) revert_revision(firm_id, revision) process_revision(firm_id, revision, false)

Revertování firm_phone INSERT EXECUTE 'DELETE FROM ' tablename ' WHERE id = ' quote_literal(itemid); id firm_id phone type 1 2910 225061234 1 2 2910 737123456 2 3 1188 800123456 3 4 1188 222222222 1 journal firm_id revision tablename changes itemid 1188 2 firm_phone {"(phone,,222222222)","(type,,1)"} 4

Revertování firm_phone DELETE EXECUTE 'INSERT INTO ' tablename '(id) ' 'VALUES (' quote_literal(itemid) ');' EXECUTE 'UPDATE ' tablename ' SET ' array_to_string( sqldata, ', ') ' WHERE id = ' quote_literal(itemid); id firm_id phone type 1 2910 225061234 1 2 2910 737123456 2 3 1188 800123456 3 4 4 1188 1188 222222222 222222222 1 1 journal firm_id revision tablename changes itemid 1188 2 firm_phone {"(phone,222222222,)","(type,1,)"} 4

Revertování firm_phone UPDATE sqldata := array_append( sqldata, format( '%I = %L', changes.colname, changes.oldvalue ) ); EXECUTE 'UPDATE ' tablename ' SET ' array_to_string( sqldata, ', ') ' WHERE id = ' quote_literal(itemid); id firm_id phone type 1 2910 225061234 1 2 2910 737123456 2 3 1188 800123456 3 4 1188 222222222 222111111 1 journal firm_id revision tablename changes itemid 1188 2 firm_phone {"(phone,222222222,222111111)"} 4

Úskalí revertování NOT NULL, UNIQUE, FOREIGN KEY Smazat? Vložit? Upravit? Item ID název sloupce id category_id Výjimky z pravidel Konzistence Ťuk ťuk, rekurze address_id firm_id tag_id language_id daynum

Agenda Proces schvalování Přihlášený uživatel Verzování údajů Publikace dat, evoluce Přechod na PostgreSQL

Trocha historie MySQL Firebird MySQL MySQL MySQL

Publikace dat VIEWs takeit topkontakt publish

Publikace dat ADMIT events publish memcached

Ve vývoji PostgreSQL MySQL PostgreSQL PostgreSQL

Publisher nyní events Publisher PHP MySQL takeit MySQL topkontakt MySQL publish PostgreSQL topkontakt

Publisher nově confirm_revision(firm_id, revision) ADMIT events

Publisher nově events publish_firm(firm_id) Publisher python MySQL publish PostgreSQL publish PostgreSQL topkontakt

Databáze publish Spojení zdrojů dat Denormalizace SELECT * Optimalizace pro čtení (indexy) Předzpracovaná data Zdroj pro fulltext (a další) Zdvojená data Rozdílnosti FROM firm; SELECT * FROM category; SELECT * FROM product; SELECT * FROM firm_data;

Agenda Proces schvalování Přihlášený uživatel Verzování údajů Publikace dat, evoluce Přechod na PostgreSQL

Přechod na PostgreSQL Přepis aplikací Nová struktura nová technologie Návrat k Databázi Využít dostupné možnosti Normalizace, čištění Příprava pro další rozvoj

Technologie pgbouncer DB1 pgbouncer haproxy DB2 ADMIT pgbouncer DB3

Aplikace PHP >=5.3 & Nette 2 Frameworky (dibi, Doctrine2) Úprava vrstvy v modelu Cache vrstva Optimalizace (EXPLAIN)

Agenda Proces schvalování Přihlášený uživatel Verzování údajů Publikace dat, evoluce Přechod na PostgreSQL

Co říci závěrem DB může znát uživatele aplikace Verzování dat přímo uvnitř DB Rekonstrukce stavu dat Publikace uvnitř DB nožičky not směrem dolů

Otázky...

Děkuji za pozornost http://www.pecek.cz