10th November 2022:
PostgreSQL 15.1, 14.6, 13.9, 12.13, 11.18, and 10.23 Released!

Unsupported versions:
7.0

This documentation is for an unsupported version of PostgreSQL.

You may want to view the same page for the current version, or one of the other supported versions listed above instead.

You may want to view the same page for the current version, or one of the other supported versions listed above instead.

The mathematical concept underlying the relational model is the
set-theoretic *relation* which is a subset
of the Cartesian product of a list of domains. This set-theoretic
relation gives the model its name (do not confuse it with the
relationship from the *Entity-Relationship
model*). Formally a domain is simply a set of values. For
example the set of integers is a domain. Also the set of character
strings of length 20 and the real numbers are examples of
domains.

The *Cartesian product* of domains
`D _{1}`,

For example, when we have `k`=2,
`D _{1}`=

A Relation is any subset of the Cartesian product of one or more
domains: `R` ⊆ `D _{1}` ×

For example `{(0,a),(0,b),(1,a)}` is a
relation; it is in fact a subset of `D _{1}` ×

The members of a relation are called tuples. Each relation of
some Cartesian product `D _{1}`
×

A relation can be viewed as a table (as we already did, remember
The Suppliers and Parts
Database where every tuple is represented by a row and every
column corresponds to one component of a tuple. Giving names
(called attributes) to the columns leads to the definition of a
*relation scheme*.

A *relation scheme* `R` is a finite set of attributes `A _{1}`,

Note:Arelation schemeis just a kind of template whereas arelationis an instance of arelation scheme. The relation consists of tuples (and can therefore be viewed as a table); not so the relation scheme.

We often talked about *domains* in the
last section. Recall that a domain is, formally, just a set of
values (e.g., the set of integers or the real numbers). In terms of
database systems we often talk of *data
types* instead of domains. When we define a table we have to
make a decision about which attributes to include. Additionally we
have to decide which kind of data is going to be stored as
attribute values. For example the values of `SNAME` from the table `SUPPLIER` will be character strings, whereas
`SNO` will store integers. We define this
by assigning a data type to each attribute. The type of `SNAME` will be VARCHAR(20) (this is the SQL type for character strings of length <=
20), the type of `SNO` will be
INTEGER. With the assignment of a data
type we also have selected a domain for an attribute. The domain of
`SNAME` is the set of all character
strings of length <= 20, the domain of `SNO` is the set of all integer numbers.