I must admit, I'm having more of a go at SQL than I really feel. SQL nailed transactional semantics, indexes and querying.
My argument isn't that "old stuff is bad and I like JSON". Its that when I'm modelling data in my program, sometimes I have objects which reference each other (via key or shared pointer). And sometimes I have objects which contain another object. Eg, a struct with a vec inside. Real code is packed full of this stuff.
SQL lets me directly model relationships between objects. And it lets me model records with scalar fields. But it does not let me model records with variable size fields. This restriction seems totally arbitrary. There is no technical reason for it that I can think of. And it makes it needlessly complex to map data from my programming language to my SQL database.
I've named this problem 3 times in this thread now. For all your moaning about us kids being lazy, you still haven't given a single technical reason for this deficiency in SQL.
I largely agree with you about JSON. I don't actually want JSON fields in my database. I want something strongly typed, with well defined semantics and a good query system. SQL has a great track record of providing just that. And it has a perfectly serviceable type system already. So why on earth is it missing this important, obvious feature?
I just want my database to be able to express embedded lists and records, like I do in almost every programming language I've ever used, every messaging format I've used (protobuf, msgpack, json, xml, etc). And in many other databases (couchdb, mongo, foundationdb, etc).
> I ask you with JSON, how do you encode "add a single item to the list attached to a customer"
I can think of dozens of ways to express that. Postgres already supports that operation for embedded JSON fields using this ugly syntax:
UPDATE <table> SET <field-name> = <field-name> || '{"a": 1}'::jsonb
Mongodb expresses it like this:
{ $push: { <field1>: <value1>, ... } }
Rethinkdb:
r.table('marvel').get('IronMan')('equipment').append('newBoots').run(conn, callback)
... Do you need more examples? Basically every database natively supports this except for "raw" SQL databases.
Edit: Apparently (according to other comments in this thread) some SQL databases are already moving in this direction anyway. How wonderful!