Ни один из них на самом деле не лучший (с точки зрения того, как думают администраторы баз данных). Лучшим будет (при условии, что RefNo уникален и, следовательно, является первичным ключом):
Receivables:
RefNo
Date
ReceivableDollarVals:
RefNo
Type
Amount
Если RefNo / Date является первичным ключом, добавьте дату и ко второй таблице.
Это позволяет минимизировать пространство хранения для тех строк, которые не имеют всех трех типов (хотя экономия минимальна). Затем вы используете предложения WHERE
, объединяющие две таблицы (или JOIN
s) для выполнения ваших запросов.
Это также позволяет добавлять другие типы по желанию без реструктуризации базы данных.
Однако вам нужно помнить, что третья нормальная форма - это идеал. Вполне допустимо нарушать правила, чтобы повысить производительность, если вы понимаете последствия.
100 000 записей на самом деле довольно малы, поэтому, если вы не собираетесь добавлять больше типов в ближайшем будущем, я бы выбрал вариант 2 и использовал бы нули для тех значений, которые не существуют. NULL, скорее всего, сделают ваши запросы немного сложнее.