Typically, software design involves two levels of design: architectural and detailed design. The architectural design specifies the fundamental components of the software system, such as the user interface, database, reporting module, and so on, frequently using tools like Data Flow Diagrams (DFD) and Entity-Relation Diagrams (ERD). Detailed design expands on each of these components in terms of database tables and fields, graphical user interface layout and data, and often pseudo-code for any data analysis modules.