AFAIK, есть только одно отличие: key_id должно быть int, а key_name должно быть строкой. Существуют ли какие-либо другие практические ограничения с использованием key_id против key_name?
Вы правы, что единственное отличие - это тип (1! = '1'). Обратите внимание, что это влияет на порядок результатов, если вы сортируете по ключу (как и следовало ожидать) - целые числа сортируются до строк.
Ключ - это уникальная сущность во всех приложениях, такая как "ag5kZXZ-ZmVlbG1hcmtldHIRCxILU3RvY2tQcmljZXMYZgw"
Имя ключа может быть определено вами и применимо только в пределах класса сущности. Оно может быть похоже на "john" или "mart"