Compare

Side-by-side on the decisions that recur: index vs scan, normalize vs denormalize, optimistic vs pessimistic, partition vs shard, and more — with when to choose each.

RelationalDocument
Unit of workRows across normalised tablesOne nested aggregate document
JoinsFirst-classWeak ($lookup is a nested loop)
TransactionsFull, across tablesPer document; cross-document is newer and slower
SchemaEnforcedIn your code (enable validation)
Shines whenRelationships, ad-hoc queries, invariantsThe whole object is the read and write, with variable shape
Choose this whenRelationships matter, requirements will change, and you need joins and invariants — the default.The natural unit is one aggregate read and written whole, with few cross-document queries.