Nonsense arguments
>>You want to store the name of a customer’s parakeet? Just start adding >>that key value pair to records as you create them.
Spam unstructured rubbish into the data model (oh, there isn't one - silly me) at will you mean?
This sort of thing is trivial with an RDBMS. You can either:
ALTER TABLE "Customers" ADD ParakeetName VARCHAR(30);
Or:
CREATE TABLE CustomerStringAttributes (
AttributeName VARCHAR(20) PRIMARY KEY,
AttributeValue VARCHAR(30)
);
...and use the latter to create unlimited new "fields" in the Customers table. An RDBMS doesn't care about new columns or tables it hasn't otherwise been told about (relations, constraints etc). A client app doesn't care either unless you have hideous bad practice like:
SELECT * FROM "Customers"
if Cursor.Fields[14].AsString = 'Idiot' then...
The difference with an RDBMS is you need to be the DBA to execute DDL statements so there is some sort of pollution control and you can avoid nonsense like multiple devs/apps/users creating the same attribute with divergent meanings. NoSQL like denormalization before it is a performance optimisation that sacrifices data integrity for speed. Nothing wrong with that of course, but implying it supports features impossible with an RDBMS is nonsense. Instant NoSQL:
CREATE TABLE "NoSQL" (
RecNo AUTOINC PRIMARY KEY,
Key BLOB,
Value BLOB
);
[*] I do use MongoDB for what it is good at. Storing JSON and replicating it around the system and to the web browser (MiniMongo/Meteor).