Как я понял для ID лучше выбирать int, а не smallint.
Тип необходимо выбирать соответствующий данным.
Например, для идентификатора страны int будет явно избыточен. А где-то и int мало и нужен bigint
2. Для названия акции есть тип character varying(n), varchar(n) Нужно ли задавать его длину? Или можно оставить поле пустым?
Это вопрос к вам как автору схемы базы.
3. Как влияет задание длины поля на экономию места в базе?
Никак. Это просто дополнительное ограничение данных.
varchar и text - типы с переменным размером, занимают столько места, сколько данных записано.
Например сейчас все названия акций не более 10 букв, а что будет, если в будущем появится название из 30 букв? Придется изменять длину строки? Можно ли так делать, когда база уже частично заполнена?
Увеличивать размерность возможно и это быстрая операция.
4. Для чего ставить поле -Not null?
Дополнительное ограничение на данные, запрещающее ставить специальное значение NULL, то есть "нет значения". Использовать или не использовать NULL - решение автора схемы базы.
Если вы попытаетесь записать NULL в поле отмеченное not null - будет ошибка и ничего записано не будет.