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.