First-class array columns
PostgreSQL has native array types — TEXT[], INTEGER[], even JSONB[] if you must. Arrays are great for short, rarely-modified lists where the order matters and you query by membership.
The array operators
=exact array equality.@>contains:tags @> ARRAY['red','wool'].<@contained by:ARRAY['red'] <@ tags.&&any element in common:tags && ARRAY['red','blue'].unnest()turns an array into rows for joining/aggregating.
Arrays vs junction tables
Arrays save a join table when the list is small and conceptually part of the row. They become awkward when the items have their own attributes (then you want a junction table) or when the list grows large (rewriting an array on every insert is O(n)).