I personally would not use "natural" keys. Instead, there is a table of countries / currency entities:
country ------- country_id : integer not null auto_increment name : varchar(255) abbrev : varchar(255) motto : varchar(255) . . .
then use the identifiers for those listed in the crosstab:
currency_exchange ----------------- currency_exchange_id : integer not null auto_increment from_country_id : integer to_country_id : integer value : decimal(10,4) inverse_value : decimal(10,4)
This allows me to change the name of the country to a character, full name, etc., without changing the definition of the crosstab table. Join the two tables for querying conversion values.
Also, I went with decimal (10.4), and I would recommend looking at the maximum possible. It is not a headache for software updates to limit the size and later discover that you have chosen too small a size. It does not take up enough space to make sense to deal with these errors. The same goes for the cook you use for the name. Varchars are stored efficiently.
Also, isn't value always going to be 1.00? (That is, you do not always convert from 1 to some inverse in another currency?) If so, you can remove the value column from the table.
I personally like to generate identifier values ββin all tables, so I put it in a crosstab, but some people may suggest that this is not necessary. I often find later, when I decided to leave it, that I would like to add it.
I could see the presence of another table for the currency name:
currency -------- currency_id : integer not null auto_increment country_id : integer name : varchar(255) symbol : varchar(255)