您好我和我的朋友不同意哪种型号的DVD租赁数据库更好。 这是我的模特。
Table: Rent
NAME TYPE
ID_Rent Integer ( Primary key )
ID_Customer Integer ( foregin key from Customer )
ID_office Integer ( foreign key from office )
Date of Rent DateTime
Date of Returning DateTime
Possibly_penalty_in_euros Integer
Table : Rented_DVD
NAME TYPE
ID_Rented_DVD Integer ( Primary key )
ID_DVD Integer ( foreign key from DVD table )
ID_Rent Integer ( foreign key from Rent )
这是他的模特
Table: Rent
NAME TYPE
ID_Rent Integer ( Primary key )
ID_Customer Integer ( foreign key from Customer )
ID_DVD Integer ( foreign key from DVD table )
ID_office Integer ( foreign key from office )
Date of Rent DateTime
Date of Returning DateTime
Possibly_penalty_in_euros Integer
我的问题是......哪种型号更好?在这两个表中,我们有客户,办公室,DVD等领域,但它们并不重要。这是关于如果有人进入我们的办公室并且将同时租用例如4张DVD的话。
在我的情况下,我将1行放入表Rent,将4行放入表Rented_DVD。它将消耗78个字节的空间。 Rented_DVD中的3个整数* 4行* 4个字节+ 4个整数* 4个字节+ 2个DateTime * 7个字节= 78个字节的空间。
我的朋友将在Rent表中输入4行,他将占用136个字节的空间(5个整数* 4个字节+ 2个DateTime * 7个字节)* 4行= 136个字节的空格。
这是否意味着我的模特比他更好?他的模型分别比我的模型消耗更多的数据空间,还是我错误地计算了?
答案 0 :(得分:4)
考虑到现代数据库很容易包含数TB的数据,我认为您对存储空间的关注 非常重要。
相反,我认为您应该更多地关注一致性和正确的规范化。在这方面,我认为你的模型更好。每个租借交易都有一个唯一的ID_Rent
,然后Rented_DVD
中有交易详情。这是在实际业务环境中规范化此类数据的更典型方式。它基本上是一个Invoice Header -> Invoice Detail
设置,通常比平面设置更好。 Invoice Header+Detail
表格模型。
以下是一些更详细的解释为何通常如此:
1)避免重复数据,例如客户ID,租赁ID,日期等。
2)更容易强制执行唯一键,例如,您可以确定 每个事务只有一个ID_Rental
,因此您可以使用唯一约束领域。
使用起来稍微复杂一点的唯一因素是,如果需要标题和详细信息,则需要在查询中添加其他联接,但与具有高效的数据库布局相比,这是非常简单的事情。