我必须存放具有渐进累计运行成本的租赁汽车,例如:
主要数据:
Id: 123
Model: Ford Transit
yom: 2013
毕业变量运行成本:
kilometers/year utilities tires service misc
10,000 80 400 50 30
12,000 100 400 55 35
14,000 120 400 60 40
...
100,000 500 1,500 150 100
因此,对于2,000和4种不同的成本类型,以10,000到100,000的步长,这导致50 x 4 = 200个数据字段。
将它建模为1:n关系或者我的汽车表(MySql)中有超过200列可以更好吗?有什么优点和缺点?
如果是1:n,每当输入新的汽车记录时,触发器是否可以在变量成本表中创建200个字段?
提前感谢任何提示
答案 0 :(得分:2)
因此,对于2,000和4种不同的成本类型,分为10,000到100,000,这导致50 x 4 = 200个数据字段。
是。当它是标准化时,每个记录的200个字段将转换为每个标准化行4列。
将它建模为1:n关系是否更好?或者我的汽车表(MySql)中有超过200列可以吗?
好吧,如果您正在考虑关系, 是1 :: n关系。
在数据库中实现非规范化记录(例如,在您的情况下,200个字段之一)是绝对不可接受的。
存在哪些利弊?
我不能在这里给出一个教程,但一般来说,规范化的行有(a)关系完整性,(b)关系能力[你会注意到以连接减少的形式],(c)关系速度(d)易于扩展[添加/更改数据库],以及(e)编码的简易性。没有哪个非标准化记录提供,它们提供相反的结果。
如果是1:n,只要输入新的汽车记录,触发器是否可以在变量成本表中创建200个字段?
通常,关系数据库中不需要触发器。只有在需要做奇怪的事情时才需要它们,并且奇怪的事情是不归一化数据的结果。
在您的情况下,添加新车的200个值是未知的,因此触发器无论如何都不会起作用。
不,在ACID交易中,当用户添加新车并且每公里步骤填充四列时,请正确执行。您可能有4个默认值自动填充屏幕上的字段,但在用户点击“添加”按钮之前,不应将其保存到数据库中。
以下是您需要的数据模型。
我已对数据进行了规范化,但没有说明步骤或过程,这是最终结果。
Ford Transit
不是Atomic,我通过分隔Manufacturer
和Model.
强制性/可选费用:
如果每个Maintenance
(Kilometre
步骤)行显示四个费用字段,则需要右侧的模型
如果任何费用字段是可选的,则需要左侧的模型。我认为服务是强制性的,即。它发生在每公里进入。
我已经为您提供了关系密钥,从而为您提供了关系完整性。如果您不使用复合键,您将失去完整性。例如:
Model
(例如Transit
)不是独立存在的,它仅存在于Manufacturer
的上下文中(例如Ford
)。< / p>
ModelYear
(例如2013
)不是独立存在的,它仅存在于Model
的上下文中(例如Ford Transit
)。< / p>
如果您认为名称代码过宽,则可以替换名称代码。
The Maintenance
表需要一个简单的CHECK
约束,以确保Kilometre
步骤为模2000.
这是一款IDEF1X型号。 IDEF1X是关系数据库建模的标准。请注意每一个小嘀嗒声;缺口;并标记;乌鸦脚;实线与虚线;广场与圆角;意味着非常具体和重要的东西。请参阅IDEF1X Notation。如果您不理解符号,您将无法理解或工作模型。
请注意,现在很多人都不了解如何根据 Relational Model 的要求创建具有唯一行的Relational表。它们创建文件,通常每个都有一个记录ID,并允许大量重复。请阅读this Answer,从顶部到假教师。并尝试其中给出和链接的代码。
佐哈鲁:
我还建议一个汽车模型的查找表,以便cars表中的每一行都有一个模型ID而不是模型名称。
这种建议来自那些阅读了假教师的书籍,并且应用它并提供建议但没有任何实际知识或经验的人。它让每个人都陷入了1970年以前的ISAM记录文件系统,同时认为他们有一个关系数据库&#34;。
他们根本不知道他们缺少的关系完整性,权力和速度。如果有人提出问题,我会提供答案。不在这里,这个答案已经完成。
答案 1 :(得分:-1)
您可以使用具有预先填充的查找表(右侧)的数据模型。然后将该维护应用于实际车辆(左侧)