Proper way to map IDs: By adding additonal columns for each external column or by inserting new rows
INDEX(external_source, external_id) in that order.  This would facilitate looking up the external id to find the internal one.  Now, assuming the main use of this table is to go from "external" to "internal", then I would do

PRIMARY KEY (external_source, external_id)
INDEX(...)   -- for either `internal_id` or `id`, whichever you keep.


You have two internal ids -- internal_id and id.  Why both?  id could be AUTO_INCREMENT to take care of inventing new numbers.  internal_id would need some mechanism for inventing new numbers.

The external_* may as well be VARCHAR, since you can't trust them to stick to numbers.

I would not do the extra 'normalization' even if you have a million rows in this mapping table.  I might do it for a billion rows.  (I claim there is such a thing as "over-normalization".)