Patterns of Enterprise Application Architecture. Martin Fowler.