How can I model and enforce constraints on a categorical item contained in a collection?
Categories and Buckets.

create table categories
(
  category_id int primary key
);

create table buckets
(
  bucket_id int primary key
);


Depending on how to interpret "an item may belong to at most 1 bucket" you need to do some different things with Items.

An item has to belong to one bucket.

create table items
(
  item_id int primary key,
  category_id int not null references categories(category_id),
  bucket_id int not null references buckets(bucket_id),
  unique (category_id, bucket_id)
);


If an item may belong to one bucket but does not have to you need to allow for null values in bucket_id and use a filtered index as the unique constraint.

create table items
(
  item_id int primary key,
  category_id int not null references categories(category_id),
  bucket_id int references buckets(bucket_id)
);

create unique index uq_items on items(category_id, bucket_id) where bucket_id is not null;





  There is a collection of items where each item belongs to 1 category.  


category_id as a foreign key in items.


  an item may belong to at most 1 bucket.


bucket_id as a foreign key in items.


  There is a collection of buckets which may contain at most 1 item from
  each category.


A unique constraint on bucket_id and category_id in items.