Once upon a midnight dreary, while I pondered, weak and weary, Over many a quaint and curious volume of forgotten lore-- While I nodded, nearly napping, suddenly there came a tapping, As of some one gently rapping, rapping at my chamber door. "'Tis some visiter," I muttered, "tapping at my chamber door-- Only this and nothing more."
Jaime González García Enthusiastic Software developer! Works at Medius R&D building a SPA... ... but also started jaimegonzalezgarcia.com Blogs at barbarianmeetscoding.com likes... fantasy sci-fi drawing Malin ???
What is NoSql today? • Big term used to refer to all non relational DBs (RDMBS’s) • Big hype • In general: • No relational • No schema • High availability and scalability (Web Scale) • Eventual consistency • No SQL (generally) …just like html5… Villaine hipsters!
Why Nosql ? Why Document Stores? • Simplicity • Developer friendly • No impedance mismatch (SQL != OOD) • No schema, less friction • Scalability: replication and sharding • Great APIs • Right tool for the job Databases for developers??
Ravendb • ACID document transactions • BASE index querying • Self-optimizes based on usage • High scalability • Replication and sharding out of the box • Safe by default
Ravendb documents • Each document has its own unique document ID • If we try to store two entities with the same id -> overwrite • By convention ID = collectionName/entityId (users/1) • By default entity id’s are generated (auto-incremented)
Modeling in Ravendb • Documents are not flat, you can store complex structures • RavenDB is not relational • A document is an independent entity • Include all details you need within the document • This is good for sharding • References are not enforced by the DB • If following DDD, an Aggregrate is a document • This pretty much enforces DDD uses of aggregates from the dB • Use aggregate to enforce invariants to store information safely
Ravendb .net api • Unit of Work • Change tracking, transactions, batching, etc • Feels like Entity Framework or NHibernate • IDocumentSession (unit of work) • IDocumentStore (session factory, singleton) • Query with LINQ • Works with pure POCOs • Available on NuGet
A Poco’s life in Ravendb C# class Public class Raven { public string Name {get;set;} } POCO var myCuteRaven= new Raven {Name = “Kiwi”} (Plain Old CLR Object) Document instantiate ravens/1 { “Name”: “Kiwi” }
Ravendb .net api – Querying • Every query uses and index • Static indexes persisted in the DB • Dynamic indexes created on the fly • Based on the queries that you do • Self-optimization based on usage • Eventual Consistency • Stale better than offline • BASE (Basically Available, Soft State, Eventual Consistency)
Ravendb .net api – Other cool stuff • Uses Lucene as search engine • Can easily add attachments to documents • Profiling • Fully customizable • cache • Max number of request per session • Key generator • conventions • etc...
Ravendb Rest api • Documents in RavenDB feel a lot like resources... • Built-in REST api for CRUD operations over documents! You could run your whole single page application against Ravendb!
Installing Ravendb • Client-Server • Install and start the service manually • Install as a windows service • Deploy it on IIS • DaaS (Database as a Service) (IaaS ) • Embedded in your .NET Application
Scaling Ravendb • Replication and Sharding out of the box • Sharding • Native • Partition contents of a ravendb database across several machines • Replication • Replicate contents of a ravendb database • As a bundle • Can replicate to SQL Server http://ravendb.net/docs/2.5/server/scaling-out