The PostgreSQL type system
    can be broken down in several ways.
    Types are divided into base types and composite  types.
    Base  types  are those, like int4, that are implemented
    in a language such as C.  They generally correspond  to
    what are often known as abstract data types; PostgreSQL
    can only operate on such types through methods provided
    by  the  user and only understands the behavior of such
    types to the extent that the user describes them.  
    Composite  types  are  created whenever the user creates a
    table.
   
    PostgreSQL  stores  these  types
    in only one way (within the
    file that stores all rows of a table)  but  the
    user can "look inside" at the attributes of these types
    from the query language and optimize their retrieval by
    (for example) defining indexes on the attributes.
    PostgreSQL  base  types are further
    divided into built-in
    types and user-defined  types.   Built-in  types  (like
    int4)  are  those  that  are  compiled
    into the system.
    User-defined types are those created by the user in the
    manner to be described later.