Top Banner
Inspiring people to share Inspiring people to share Using Document Databases with TYPO3 Flow
50
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Using Document Databases with TYPO3 Flow

Inspiring people to

shareInspiring people to

share

Using Document Databases with

TYPO3 Flow

Page 2: Using Document Databases with TYPO3 Flow

Karsten Dambekalns

TYPO3 Neos and Flow developer

35 years old

lives in Lübeck, Germany

1 wife, 3 sons

1 espresso machine

likes canoeing & climbing

Page 3: Using Document Databases with TYPO3 Flow

Persistence Basicsin Flow

Page 4: Using Document Databases with TYPO3 Flow

Flow uses Doctrine 2 ORM

MySQL PostgreSQL SQLite Oracle

Native and PDO DB drivers

Doctrine DBAL

Doctrine ORM

TYPO3 Flow

Page 5: Using Document Databases with TYPO3 Flow

Flow provides a centralized PersistenceManager

Native and PDO DB drivers

Doctrine DBAL

Doctrine ORM

Doctrine\PersistenceManager

Repository Doctrine\Repository

Page 6: Using Document Databases with TYPO3 Flow

Repositories encapsulate persistence concerns

Doctrine\PersistenceManager

Repository Doctrine\Repository

Your Application Code

Page 7: Using Document Databases with TYPO3 Flow

Models do not know about persistence

Page 8: Using Document Databases with TYPO3 Flow

Models do not know (a lot)

about persistence(internals)

Page 9: Using Document Databases with TYPO3 Flow

Properties

/** * @Flow\Entity */class Organisation {

/** * The name * @var string * @Flow\Validate(type="NotEmpty") * @Flow\Validate(type="StringLength", options={"maximum"=40}) * @ORM\Column(length=40) */ protected $name;

Page 10: Using Document Databases with TYPO3 Flow

Relations

/** * @Flow\Entity */class Organisation {

/** * @var \Doctrine\Common\Collections\Collection <\Acme\Demo\Domain\Model\Alias> * @ORM\OneToMany(mappedBy="organisation",cascade={"persist"}) * @ORM\OrderBy({"name" = "ASC"}) * @Flow\Lazy */ protected $aliases;

Page 11: Using Document Databases with TYPO3 Flow

Document Databases

Provide some powerful advantages

• schema-less storage

• usually scale well

• really good for non-relational data

No more Object-Relational Mapping, now you have Object-Document Mapping

Queries, but not as you know them

•Most document databases do not allow queries on arbitary properties

Page 12: Using Document Databases with TYPO3 Flow

Which Database to Choose

Many different document databases exist

Which one is right for your project depends on many factors

•MongoDB: For most things that you would do with MySQL or PostgreSQL, but having predefined columns really holds you back.

• CouchDB: For accumulating, occasionally changing data, on which pre-defined queries are to be run. Places where versioning is important.

A nice overview with much more can be found onhttp://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis

Page 13: Using Document Databases with TYPO3 Flow

CouchDB

Is one of the more widespread products

Stores documents in JSON

Provides a REST interface

Provides master-master replication and MVCC

Page 14: Using Document Databases with TYPO3 Flow

Futon on CouchDB

Page 15: Using Document Databases with TYPO3 Flow

CouchDB REST API

Create a database

curl -X PUT http://127.0.0.1:5984/demo

{"ok":true}

Create documents

curl -H 'Content-Type: application/json' \ -X POST http://127.0.0.1:5984/demo \ -d '{"company": "Example, Inc."}'

{"ok":true,"id":"8843faaf0b831d364278331bc3001bd8","rev":"1-33b9fbce46930280dab37d672bbc8bb9"}

Page 16: Using Document Databases with TYPO3 Flow

CouchDB Basics

Fetch a document

curl -X GET http://127.0.0.1:5984/demo/8843faaf0b831d364278331bc3001bd8

{"_id":"8843faaf0b831d364278331bc3001bd8","_rev":"1-33b9fbce46930280dab37d672bbc8bb9","company":"Example, Inc."}

Page 17: Using Document Databases with TYPO3 Flow

CouchDB Basics

Create a database using Futon or with

curl -X PUT http://127.0.0.1:5984/demo

Create documents using Futon or with

curl -H 'Content-Type: application/json' \ -X POST http://127.0.0.1:5984/demo \ -d '{"company": "Example, Inc."}'

Fetch documents using Futon

If you do manual work on the shell, try HTTPie instead of cURL

Read guide.couchdb.org and docs.couchdb.org

Page 18: Using Document Databases with TYPO3 Flow

CouchDB Basics

Read guide.couchdb.org and docs.couchdb.org

Learn about views and map/reduce

Page 19: Using Document Databases with TYPO3 Flow

Hint: A better cURL

If you do manual work on the shell, try HTTPie instead of cURL

Page 20: Using Document Databases with TYPO3 Flow

TYPO3.CouchDB

Developed for Rossmann by networkteam

Fully replaces the ORM persistence

Model annotations stay the same

Provides basic QOM-to-View mapping

Note: Not working with TYPO3 Flow 2.0 right now

Page 21: Using Document Databases with TYPO3 Flow

Installation

cd Packages/Applicationgit clone git://git.typo3.org/FLOW3/Packages/TYPO3.CouchDB.git

No composer package, so just clone it

Page 22: Using Document Databases with TYPO3 Flow

Configuration

TYPO3: FLOW3: persistence: # Options for the CouchDB backend backendOptions: # database: 'database_name' dataSourceName: 'http://127.0.0.1:5984' username: ~ password: ~ enableCouchdbLucene: no driver: ~ path: ~

Page 23: Using Document Databases with TYPO3 Flow

Usage – Repository

class TestEntityRepository extends Repository {

/** * @param string $name * @return \TYPO3\FLOW3\Persistence\QueryResultInterface */ public function findByNameLike($name) { $query = $this->testIndex->createQuery(); $query->matching( $query->like('name', $name) ); return $query->execute(); }}

Page 24: Using Document Databases with TYPO3 Flow

Usage – LuceneIndex

class MyIndex extends \TYPO3\CouchDB\Domain\Index\LuceneIndex {

/** * Configure the index * * @return void */ public function configure() { $this->forEntity('Acme\Demo\Domain\Model\SomeEntity') ->indexProperty('name') ->indexProperty('relatedValueObject.color'); }

}

Page 25: Using Document Databases with TYPO3 Flow

Usage – Views & Design Docs

Views can be defined by

• implementing TYPO3\CouchDB\ViewInterface

•configuring TYPO3\CouchDB\QueryView

Design documents can be defined by extending TYPO3\CouchDB\DesignDocument

Page 26: Using Document Databases with TYPO3 Flow

Now for somebad news

Page 28: Using Document Databases with TYPO3 Flow

One Backend at a Time

Doctrine DBAL

Doctrine ORM

Doctrine\PersistenceManager

Repository Doctrine\Repository

Page 29: Using Document Databases with TYPO3 Flow

One Backend at a Time

Doctrine DBAL

Doctrine ORM

Doctrine\PersistenceManager

Repository Doctrine\Repository

Page 30: Using Document Databases with TYPO3 Flow

You can work around this!

In your repositories you can basically do what you want

• Open a direct database connection

• Read CSV files

• Connect to a Solr server

• Instantiate another Doctrine EntityManager

Do something more advanced, let Radmiraal.CouchDB inspire you

As long as you encapsulate nicely!

Page 31: Using Document Databases with TYPO3 Flow

And now somegood news

Page 32: Using Document Databases with TYPO3 Flow

Radmiraal.CouchDB

Page 33: Using Document Databases with TYPO3 Flow

Radmiraal.CouchDB

Developed for some projects having similar needs

Started out as an extension to TYPO3.CouchDB

Since then refactored & now based on Doctrine 2 CouchDB ODM

Can be used alongside the usual ORM

Page 34: Using Document Databases with TYPO3 Flow

Radmiraal.CouchDB

Page 35: Using Document Databases with TYPO3 Flow

Radmiraal.CouchDB

Page 36: Using Document Databases with TYPO3 Flow

"repositories": [ { "type": "git", "url": "https://github.com/radmiraal/Radmiraal.CouchDB.git" }],

"require": { "radmiraal/couchdb": "dev-doctrine",}

Installation

Page 37: Using Document Databases with TYPO3 Flow

TYPO3: Flow: persistence: backendOptions: … as usual

Radmiraal: CouchDB: persistence: backendOptions: databaseName: 'mycouchdb' username: 'mycouchuser' password: 'mycouchpassw0rd'

Configuration

Page 38: Using Document Databases with TYPO3 Flow

Usage – Models

use Doctrine\ODM\CouchDB\Mapping\Annotations as ODM;

/** * @ODM\Document(indexed=true) */class DataSet {

/** * @var string * @ODM\Id(type="string") */ protected $id;

/** * @var \Acme\Demo\Domain\Model\Organisation * @ODM\Field(type="string") * @ODM\Index */ protected $organisation;

/** * @var \DateTime * @ODM\Field(type="datetime") * @ODM\Index */ protected $creationDateTime;

Page 39: Using Document Databases with TYPO3 Flow

Usage – Models

/** * @var \Acme\Demo\Domain\Model\Organisation * @ODM\Field(type="string") * @ODM\Index */ protected $organisation;

/** * @var \DateTime * @ODM\Field(type="datetime") * @ODM\Index */ protected $creationDateTime;

Page 40: Using Document Databases with TYPO3 Flow

Usage – Repository

class OrganisationBoundaryRepository extends \Radmiraal\CouchDB\Persistence\AbstractRepository {

public function findAll() { return $this->createQuery( 'organisationboundaries', 'by_organisation_id') ->execute(); }}

Page 41: Using Document Databases with TYPO3 Flow

Usage – Repository

class DataSetRepository extends \Radmiraal\CouchDB\Persistence\AbstractRepository {

public function findByQuux(Quux $quux) { return $this->createQuery('datasets', 'most_recent', 'native') ->setStartKey(array($this->getQueryMatchValue($quux))) ->setGroup(TRUE) ->setGroupLevel(1) ->setLimit(1) ->execute()}

Page 42: Using Document Databases with TYPO3 Flow

Usage – Views & Design Docs

Page 43: Using Document Databases with TYPO3 Flow

And now someeven better news

Page 44: Using Document Databases with TYPO3 Flow

Multiple backends in parallel

Doctrine DBAL

Doctrine ORM

PersistenceManager

Doctrine\Repository

MongoDB\Repository

Doctrine MongoDB

MongoDB ODM

Doctrine\Repository

Page 45: Using Document Databases with TYPO3 Flow

The Future

TYPO3 Flow will support multiple persistence backends in parallel:

•of the same type: 2 MySQL and 1 PostgreSQL databases

•of different types: MySQL and MongoDB

Page 46: Using Document Databases with TYPO3 Flow

The Future

Configuration extended but backwards compatible

Consistent use independent of backend used:Annotations, result interfaces & queries stay consistent

References across persistence backends? Eventually, but not right away…

Page 47: Using Document Databases with TYPO3 Flow

You can help, too…

The work on a proper ODM integration so far has been done and made possible by (applause!):

•Beech IT

•BKWI

•Rens Admiraal

•myself

More work is needed, so if you think this is the way to go… contact me!

Page 48: Using Document Databases with TYPO3 Flow

questionsyour

now!

Page 50: Using Document Databases with TYPO3 Flow