PostgreSQL has support for creating custom types. When you need something more expressive than the built-in types and you don't want your data spread across multiple columns, you can instead create a custom type.
create type dimensions as (
width integer,
height integer,
depth integer
);
This new type can then be used in the definition of a new table
create table moving_boxes (
id serial primary key,
dims dimensions not null
);
and when inserting data
insert into moving_boxes (dims) values (row(3,4,5)::dimensions);
See the create type
docs for
more details.