YOU ARE DOWNLOADING DOCUMENT

Please tick the box to continue:

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

Related Documents