A love affair with PostgreSQL
blog.remarkablelabs.com
blog.remarkablelabs.com
You'd have to use the @> operator and compare a partial hash.
So instead of
SELECT * FROM comics WHERE properties -> 'story_arc' = 'Throne of Atlantis'
You'd use SELECT * FROM comics WHERE properties @> 'story_arc=>Throne of Atlantis'::hstore
The first query will not use an index on properties, the second one will.See the first paragraph of F.16.3 on http://www.postgresql.org/docs/9.2/static/hstore.html
But where MySQL have always been strong has been in the PHP community. And it still seems to me that there isn't much of a change here. Wordpress is still only thinking about getting Postgres support: https://codex.wordpress.org/Using_Alternative_Databases
I know multiple people who have lost literally months of work because they tried to use Mongo in a place where a relational database made a lot more sense (incidentally, they're also using Node), and ultimately had to rebuild and migrate their entire data model layer to Postgres.
That's not a knock on Node or Mongo, just an observation. They're the right tools for some things, and the wrong tools for others. If you're choosing your tech stack based on current trends rather than spending a few minutes thinking what problems you're trying to solve, God help you.
While it could be the perfect fit for some tasks, I know there are a ton of Mongo deployments that would be better served by Postgres or MySQL.
And PostgreSQL maybe solid but developers want a solution that horizontally scales. Until this is addressed it is going to find itself increasingly marginalised.
http://instagram-engineering.tumblr.com/post/10853187575/sha...
http://postgres-xc.sourceforge.net/
http://www.pgpool.net/mediawiki/index.php/Main_Page (you can use this to transparently shard)
Instagram had to roll their own and Postgres XC, PGPool both have always seemed pretty sketchy. No official support, no notable customers, shocking complexity and everything just seems all over the place with documentation from say 2009 referencing PostgreSQL 8 e.g. PgPool beginner guide. They may be great solutions but do they really look like something that inspires confidence ?
These guys seem to have the right idea: http://www.cloudpostgres.com
It would just be nice to have something as simple and polished built into PostgreSQL.
But MySQL is still behind Postgres in features and reliability. I have being bitten by MySQL shortcomings for a year. Last month was the limit of max 64 indexes per table. Before that it was the dozens of stupid limitations in the procedures and functions. Before that it was some stupid bug that only happens in master-master replication. I can go on for days ranting about MySQL.
Think SVN vs Git. SVN can get better everyday and it does get better, but incremental upgrades will never convert SVN to Git. You scale MySQL by putting Memcached in front of it. But this makes MySQL a fast read-only DB. You can't scale MySQL in a OLTP setup.
Postgres had some performance and scalability issues about 3 or 4 years ago. But the foundations were solid. Now Postgres has fixed those issues and the foundations are better than ever. You can scale Postgres in a OLTP setup and it will eat MySQL lunch every time.
Hstore is invaluable when you want to add arbitrary attributes to rows in your tables (think: different attributes for products in different categories). It's as if every row had an unlimited (and different from other rows) amount of columns.
To do this without hstore, you can dump the additional data as a serialized blob of some kind, but then you lose the ability to efficiently[1] query or sort for those additional attributes or you use a complicated mess of join tables, which means increasing cost of querying as you add more fields to query for (one join per field).
With hstore, you get indexed querying and sorting in addition to an unlimited amount of fields.
Also: because keys and values are just strings, it's in fact possible to nest hstores, you just don't get the nice indexing or any kind of type safety past the first level of hstores.
[1] if your blob is XML or JSON (via pl/v8), you can use functional indexes to still get indexed and sorted lookups in advance without having to do the indexing inside the application logic which you would have to in case of any of the NoSQL stores.
More like I choose $SOLUTION2 that can do $FEATURE{1,2}. Maybe that's adding related tables, maybe it's using a JSON column, maybe it's something else. I think part of good engineering is picking solutions that keep your options open. It seems like your data's structure always gets more complex over time, so hstore is a risky choice.
I'm not saying it's a terrible choice: you could always manage the flatness the way people use Java properties files, with compound key names to simulate fancier data structures, but that's sort of a pain. I could definitely see myself trying out hstore in the future for something like user preferences; I just am hesitant due to its flatness.
> because keys and values are just strings, it's in fact possible to nest hstores
I don't understand this; could you elaborate? Are you saying that an hstore is really a string?
I'm not familiar with hstore but I think he means you can store some kind of reference under a key.