как все это разбить на конкретные сущности?
см. ниже
Какое общее название индексы или ключи?
это синонимы. исторически сложилось что в скле достаточно много синонимов, т.к. часть из них это стандарт скл, а часть - фишки конкретной субд.
ForeignKey это тоже индекс/ключ?
нет, foreign key != индекс. индекс = вообще отдельная структура которая хранится отдельно от самих данных. foreign key = просто ссылка на другую таблицу, и создание внешнего ключа это по сути создание уникального constraint (таблица1.колонка1, таблица2.колонка2). Потенциально СУБД может сама создавать индекс при создании внешнего ключа (т.к. почти всегда это имеет смысл), но это уже нюанс конкретной реализации
В чем отличие ForeignKey от Reference?
что такое "Reference"? если вы про конструкцию
FOREIGN KEY (ColumnName) REFERENCES TableName(ColumnName)
так это просто ключевое слово. скл первоначально проектировался как язык на котором не-программисты смогут писать запросы к базам, потому он достаточно многословный.
Unique индекс это отдельный индекс или просто флаг unique к обычному индексу?
это обычный индекс + ограничение на уникальность. и это ограничение в будущем можно как удалить, так и добавить (правда с добавлением не все так просто).