Database design 使用以下两种数据库模式的缺点和优点是什么

Database design 使用以下两种数据库模式的缺点和优点是什么,database-design,Database Design,假设您有一家租赁电影的公司,并且您正在为数据库设计模式。客户必须选择计划、交付类型和付款期限(每月、每三个月、每六个月)。该计划有一个基本价格,并决定客户每月可以租多少部电影,以及一次租多少部电影。交付类型将根据客户的选择更改价格(定期交付将为计划价格增加一定的值,快速交付将增加更高的值。将交付类型和计费条款信息存储在计划表中还是存储在客户表中更好 假设下表: billingTerms(id, billEveryXMonths, discount) deliveryTypes(id, type,

假设您有一家租赁电影的公司,并且您正在为数据库设计模式。客户必须选择计划、交付类型和付款期限(每月、每三个月、每六个月)。该计划有一个基本价格,并决定客户每月可以租多少部电影,以及一次租多少部电影。交付类型将根据客户的选择更改价格(定期交付将为计划价格增加一定的值,快速交付将增加更高的值。将交付类型和计费条款信息存储在计划表中还是存储在客户表中更好

假设下表:

billingTerms(id, billEveryXMonths, discount)
deliveryTypes(id, type, price)
方法一:

plans(id, name, price, billingTermsId, deliveryTypeId, monthlyLimit, atHomeLimit)
customers(id, name, planId)
这种方法简单得多,但本质上是为了一个属性而复制计划。排列和组合的数量比只有两个计划要多

方法二是在客户表中存储计划id、交付类型和账单条款:

plans(id, name, price)
customers(id, name, planId, billingTermId, deliveryTypeId)

此外,monthlyLimit和atHomeLimit必须链接到一个控制表,该表每月跟踪客户的活动。

您希望使您的数据库模式尽可能接近“真实世界”因此,在本例中,由于交付类型和计费条件与单个客户相关,而不是与计划相关,因此您可以将它们包括在customers表中

我不知道为什么你甚至想考虑把类型和条款放进计划记录中,但是你会说“这种方法要简单得多”。你能详细说明一下你的意思吗?对我来说,这似乎更令人困惑。这就是为什么:

假设您为客户提供了五个不同的计划,那么相应地,您的计划表中就有五个计划。当您要创建任何类型的数据输入屏幕时,您可以从数据库中调出您的计划选项并显示它们。如果以后您决定添加新计划,您可以将其添加到数据库中,并且如果您的视图代码已编写正确地说,它只会起作用

但是,如果要在计划表中包含所有排列,则不能使用这种方法,必须在演示屏幕上对计划进行硬编码,然后在添加新计划时对其进行修改

此外,如果将术语和类型与计划分开,则可以创建过程来修改客户,而不必修改客户的计划选择。这自然是正确的做法,因为在这种情况下,客户没有修改他们的计划选择


希望这是有意义的。

您希望使您的数据库架构尽可能接近“真实世界”。因此,在这种情况下,由于交付类型和计费条件与单个客户相关,而不是与计划相关,因此您应该将其包括在customers表中

我不知道为什么你甚至想考虑把类型和条款放进计划记录中,但是你会说“这种方法要简单得多”。你能详细说明一下你的意思吗?对我来说,这似乎更令人困惑。这就是为什么:

假设您为客户提供了五个不同的计划,那么相应地,您的计划表中就有五个计划。当您要创建任何类型的数据输入屏幕时,您可以从数据库中调出您的计划选项并显示它们。如果以后您决定添加新计划,您可以将其添加到数据库中,并且如果您的视图代码已编写正确地说,它只会起作用

但是,如果要在计划表中包含所有排列,则不能使用这种方法,必须在演示屏幕上对计划进行硬编码,然后在添加新计划时对其进行修改

此外,如果将术语和类型与计划分开,则可以创建过程来修改客户,而不必修改客户的计划选择。这自然是正确的做法,因为在这种情况下,客户没有修改他们的计划选择


希望这有意义。

每个属性的函数依赖关系是什么

如果每个计划始终具有相同的计费期限,则计费期限取决于计划,并且应该是计划表的一个属性

如果无论计划如何,每个客户都可以有不同的账单期限,那么账单期限取决于客户,并且应该是客户表的一个属性

但是,如果每个计划都有一个默认的计费期限,但可以逐个客户覆盖该期限,则有两种选择:

  • 将账单术语放入每个表中,并让使用它的查询执行合并(cust.billing\u term\u id,plan.billing\u term\u id)以确定哪个是正确的

  • 有一个关联实体Customer_X_Plan(Customer_id(pk)、Plan_id(pk)、billing_term_id),您可以在其中存储每个客户与其计划相关的属性的正确信息


  • 每个属性都有权衡;这就是为什么它是设计而不是工程。

    每个属性的功能依赖性是什么

    如果每个计划始终具有相同的计费期限,则计费期限取决于计划,并且应该是计划表的一个属性

    如果无论计划如何,每个客户都可以有不同的账单期限,那么账单期限取决于客户,并且应该是客户表的一个属性

    但是,如果每个计划都有一个默认的计费期限,但可以逐个客户覆盖该期限,则有两种选择:

  • 将账单术语放入每个表中,并让使用它的查询执行合并(cust.billing\u term\u id,plan.billing\u term\u id)以确定哪个是正确的

  • 有一个关联实体Customer_X_Plan(Customer_id(pk)、Plan_id(pk)、billing_term_id),您可以在其中存储每个客户与其计划相关的属性的正确信息。