
Я очень сбит с толку и не знаю, что делать с балками, перекрытиями и проектным итогом.
joistcost - стоимость отдельного компонента
floorcost - это стоимость балки, умноженная на ширину
projecttotal - это стоимость всех этажей в проекте.
Я был бы очень признателен за любую помощь, я не знаю, как это правильно нормализовать.

С моей точки зрения, с JoistCost ничего делать не нужно. Насколько я понимаю, существует прямая связь между этим столбцом и кандидатным ключом tblJoist.
Что касается остального, вам необходимо определить ключи-кандидаты в своих таблицах и убедиться, что существует прямая связь между столбцом, который вас интересует, и самим ключом-кандидатом. Если есть косвенное отношение прямо сейчас, вам нужно разделить его в другую таблицу, чтобы иметь прямую.
У вас возникли проблемы с его нормализацией, потому что хранение этих промежуточных итогов по определению является денормализованным дизайном.
Нормализация заключается в том, чтобы убедиться, что каждая часть информации сохраняется один раз, и поэтому значения не могут рассинхронизироваться.
Поскольку вы храните FloorCost, который должен быть продуктом Width * tblJoist.JoistCost, существует риск того, что при изменении JoistCost значение FloorCost будет неточным. Сохранение результата подобных вычислений противоречит правилам нормализации.
На самом деле у вас есть другая проблема: я предполагаю, что стоимость балки может меняться из года в год. Поэтому неудивительно, что стоимость единицы товара изменится. Когда вы разрабатываете такую базу данных проекта, вы должны копировать единичной стоимости при выполнении проекта. Таким образом, он сохраняет ценность на момент завершения проекта, а стоимость единицы в tblJoist может быть впоследствии обновлена.
Это не нарушает нормализацию, потому что при копировании стоимости единицы в tblFloor она становится другой информацией. Это стоимость единицы балки на дату завершения проекта. Стоимость балок в tblJoist - это стоимость балок Текущий, которая в следующем году изменится.
Поэтому я бы спроектировал tblFloor со столбцами Width, JoistCost (скопировано) и, необязательно, FloorCost, которые вы могли бы синхронизировать с помощью триггера, или в некоторых базах данных есть функция, позволяющая автоматически вычислять столбец на основе других столбцов в том же строка (например, Сгенерированные MySQL столбцы).
tblProject.ProjectTotal - другая проблема. Это сумма всех этажей в этом проекте. Если вы сохраните ее в tblProject для удобства, это зависит от вас, но это технически избыточная информация, потому что вы также должны получить тот же результат от:
SELECT SUM(FloorCost) FROM tblFloor WHERE ProjectID = ?
Если это дает другую сумму, чем tblProject.ProjectTotal, значит, кто-то ошибся. Возникает вопрос: если вы обнаружите подобное несоответствие, что правильно?
Иногда денормализация может быть полезной, но она сопряжена с риском рассинхронизации данных. Вы должны написать код приложения, чтобы этого не произошло.
Что это за учебник и что он говорит? Прочтите о домашних заданиях в разделе «Как задать вопрос» и Google «stackexhange homework». Пожалуйста, объясните, в чем вы уверены, и почему и где вы застряли, следуя своему учебнику и почему. Пожалуйста, используйте текст, а не изображения / ссылки для текста (включая код, таблицы и ERD). Используйте изображение только для удобства, чтобы дополнить текст и / или для того, что нельзя передать в тексте. В вашем вопросе нет никакого понимания, поэтому ответ - это просто переписывание вашего учебника с абсолютных основ.