Как мне нормализовать эту базу данных до 3nf?

Как мне нормализовать эту базу данных до 3nf?

Я очень сбит с толку и не знаю, что делать с балками, перекрытиями и проектным итогом.

joistcost - стоимость отдельного компонента

floorcost - это стоимость балки, умноженная на ширину

projecttotal - это стоимость всех этажей в проекте.

Я был бы очень признателен за любую помощь, я не знаю, как это правильно нормализовать.

Что это за учебник и что он говорит? Прочтите о домашних заданиях в разделе «Как задать вопрос» и Google «stackexhange homework». Пожалуйста, объясните, в чем вы уверены, и почему и где вы застряли, следуя своему учебнику и почему. Пожалуйста, используйте текст, а не изображения / ссылки для текста (включая код, таблицы и ERD). Используйте изображение только для удобства, чтобы дополнить текст и / или для того, что нельзя передать в тексте. В вашем вопросе нет никакого понимания, поэтому ответ - это просто переписывание вашего учебника с абсолютных основ.

philipxy 21.03.2018 04:52
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
1
1
47
2

Ответы 2

С моей точки зрения, с 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, значит, кто-то ошибся. Возникает вопрос: если вы обнаружите подобное несоответствие, что правильно?

Иногда денормализация может быть полезной, но она сопряжена с риском рассинхронизации данных. Вы должны написать код приложения, чтобы этого не произошло.

Другие вопросы по теме