Это зависит от того, что вы собираетесь делать с данными.
Для многих целей целесообразно хранить под каждой единицей цену за единицу этой единицы, купленное количество и расширенную цену. Расширенная цена - это количество, умноженное на цену за единицу. Это избыточно? Ну да. Это нарушает какую-то нормальную форму? Ну да. Но это работает довольно хорошо.
Зачем хранить цену в строке товара (записи), а не полагаться только на те же данные о цене, которые хранятся в таблице основного продукта? Потому что, если вы измените цену после этой продажи, вы не захотите менять цену, которую этот клиент понес при покупке. Зачем хранить расширенную цену, поскольку ее можно пересчитать на лету? Потому что это упрощает агрегирование (сумму или среднее значение) по некоторому набору элементов позже.
Если вы сохраняете расширенную цену, вы можете использовать эти точки и щелкнуть, развернуть инструменты анализа (см. OLAP) для последующего анализа без дальнейшего программирования. Если вы рассчитываете пересчитать расширенную цену тогда, когда вам это нужно, вы можете обнаружить, что инструмент детализации не достаточно умен, чтобы выполнить умножение за вас.
«предметы» обычно являются детьми какой-то более крупной единицы работы. В системе выставления счетов товар является частью счета. В системе Главной книги элемент является частью транзакции. Элементы не сбалансированы, но сделка есть. В наши дни во многих коммерческих системах функции выставления счетов и учета ведутся из одной и той же базы данных, но это выходит за рамки вашего вопроса.
Обычно я стараюсь нормализовать свои данные. Это то место, где многие эксперты намеренно отклоняются от требований чистой нормализации.