Database 如何将该数据库规范化为3nf?

Database 如何将该数据库规范化为3nf?,database,database-normalization,Database,Database Normalization,我很困惑,不知道如何处理joistcost、floorcost和projecttotal 托梁成本是单个构件的成本 楼板成本是托梁成本乘以宽度 projecttotal是项目中所有楼层的成本 我非常感谢您的帮助,我不知道如何正确地将其规范化。从我的角度来看,您不需要对JoistCost做任何事情。据我所知,此列和tblJoist候选键之间存在直接关系 至于其余部分,您需要在表中标识候选键,并确保您关注的列与候选键本身之间存在直接关系。如果现在存在间接关系,您需要将其分离到另一个表中,以获得直接关

我很困惑,不知道如何处理joistcost、floorcost和projecttotal

托梁成本是单个构件的成本

楼板成本是托梁成本乘以宽度

projecttotal是项目中所有楼层的成本


我非常感谢您的帮助,我不知道如何正确地将其规范化。

从我的角度来看,您不需要对JoistCost做任何事情。据我所知,此列和tblJoist候选键之间存在直接关系


至于其余部分,您需要在表中标识候选键,并确保您关注的列与候选键本身之间存在直接关系。如果现在存在间接关系,您需要将其分离到另一个表中,以获得直接关系。

您在规范化它时遇到了问题,因为存储这些小计是一个非规范化的设计

规范化是指确保每一条信息都存储一次,因此值不可能不同步

由于存储的
FloorCost
应为
Width
*
tblJoist.JoistCost
的乘积,因此存在一种风险,即如果JoistCost发生变化,那么FloorCost将不准确。这样存储计算结果与规范化规则冲突

事实上,你还有另一个问题:我猜托梁的成本可能每年都在变化。因此,单位成本会发生变化也就不足为奇了。当您设计这样的项目数据库时,您应该在执行项目时复制单位成本。这样,它将保留项目完成时的值,
tblJoist
中的单位成本可以随后更新

这并没有违反规范化,因为当您将单位成本复制到tblFloor时,它会变成不同的信息。这是你做这个项目时托梁的单位成本。
tblJoist
中的托梁成本是当前托梁成本,明年将有所不同

因此,我设计的
tblFloor
具有列
Width
JoistCost
(复制)和可选的
FloorCost
,您可以使用触发器保持同步,或者某些数据库具有一个功能,可以根据同一行中的其他列(例如)自动计算列

tblProject.ProjectTotal
是另一个问题。这是该项目所有楼层的总和。如果为了方便起见将其存储在
tblProject
中,则这取决于您,但这在技术上是多余的信息,因为您还应该从以下方面获得相同的结果:

SELECT SUM(FloorCost) FROM tblFloor WHERE ProjectID = ?
如果得出的总和与
tblProject.ProjectTotal
不同,则有人犯了错误。问题是:如果你发现这样的差异,哪一个是正确的


非规范化有时是值得的,但它会带来数据不同步的风险。你必须编写应用程序代码来防止这种情况发生。

那么,你的教科书是什么?它告诉你怎么做?请阅读如何提问和谷歌“StackExtange家庭作业”中的家庭作业。请解释你对什么是肯定的,为什么,为什么,为什么,为什么,你会被困在课本后面。请仅为方便补充文本和/或为文本中无法给出的内容使用图像。你的问题根本不理解,所以答案只是从绝对基础上重写你的课本。