Boa tarde, Bety! Tudo joia?
Entendo sua dúvida, e é realmente um ponto interessante a ser discutido.
O Sequelize, por padrão, assume que a chave estrangeira (foreignKey) que você está definindo se relaciona com o campo 'id' na outra tabela. Isso acontece porque, na maioria dos casos, o 'id' é a chave primária (PK) da tabela e é comum usá-lo para criar relações entre as tabelas.
No entanto, você pode especificar um campo diferente para se relacionar, se necessário. Para isso, você pode usar a propriedade 'targetKey'. Por exemplo, se você quisesse que 'estudante_id' se relacionasse com o campo 'CPF' na tabela 'Pessoa', você poderia fazer algo assim:
Matricula.belongsTo(models.Pessoa, { foreignKey: 'estudante_id', targetKey: 'CPF' });
E, para o contrário, seria algo como:
Pessoa.hasMany(models.Matricula, { foreignKey: 'estudante_id', sourceKey: 'CPF' });
No exemplo acima, 'targetKey' e 'sourceKey' são usados para especificar o campo na outra tabela com o qual 'estudante_id' deve se relacionar.
Para mais informações, leia o seguinte trecho da documentação do Sequelize: Creating associations referencing a field which is not the primary key.
Então, para responder sua pergunta, não é uma limitação do Sequelize ou do SGBD, é apenas uma convenção comum usar o campo 'id' para relações, mas você tem a flexibilidade de especificar um campo diferente se necessário.
Espero ter ajudado e bons estudos!
Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.