Database design 是否为事务历史信息使用外键或保留数据?

Database design 是否为事务历史信息使用外键或保留数据?,database-design,relational-database,database-schema,Database Design,Relational Database,Database Schema,下面是一个场景 你有一个向客户销售的电子商务网站。 显然有交易 e、 g.对于每次销售,您都要记录有关销售的信息。 因此,让我们有一个“购买”表。 应该有哪些栏目 1) 是否应该使用“customer_id”为“customer”表提供一个外键? 或 2) 保留一个快照,如“客户名称”、“客户地址”……都作为VARCHAR(x) 或 3) 两者 或 4) 将“购买”表分为多个表? 或 还有别的 请给出你的意见和原因。 干杯关于采购表应包含的列,这在很大程度上取决于您的要求。通常情况下,您至少会有

下面是一个场景

你有一个向客户销售的电子商务网站。 显然有交易 e、 g.对于每次销售,您都要记录有关销售的信息。 因此,让我们有一个“购买”表。 应该有哪些栏目

1) 是否应该使用“customer_id”为“customer”表提供一个外键? 或 2) 保留一个快照,如“客户名称”、“客户地址”……都作为VARCHAR(x) 或 3) 两者 或 4) 将“购买”表分为多个表? 或 还有别的

请给出你的意见和原因。
干杯

关于采购表应包含的列,这在很大程度上取决于您的要求。通常情况下,您至少会有某种采购代码、采购日期和采购客户,以及采购中的项目列表(单独的表格)

关于您提到的选项,我猜您这里有一个关系数据库,而不是NoSQL解决方案

在这种情况下,我将放弃选项(2)。它不适合关系模式,因为您可能会在多个记录中复制客户信息。出于同样的原因,我也会放弃选项(3)

选项(1)更适合关系数据库方法。您可以进行购买,每个购买都与自己的客户关联。这使您可以轻松了解:

  • 某个特定客户已购买的产品
  • 哪个客户进行了具体的购买
  • 根据某些条件指定的客户进行采购搜索
  • 根据某些标准给出的购买情况进行客户搜索
  • 等等
如果您需要能够记录给定日期内的客户数据,则始终可以选择创建客户历史记录表并将其链接到客户表。给定一个购买日期,您就可以知道在进行购买时哪些客户数据处于“活动”状态

关于选项(4),我不知道你的意思,所以我无法回答


HTH

如果时间是问题域的固有概念,而对于电子商务来说,时间是一个固有概念,那么您也应该将其视为方案中的一流设计概念

我的首选方案是在表上设置一个“有效期”指示器,该指示器可以随时间变化。例如,下面是customer表的外观:

CUSTOMER
---------------
CustomerID   pk
RecordVersion pk
Name
EmailAddress
HomeAddressID fk
HomeAddressRecordVersion fk
ValidFrom
ValidUntil
然后,“购买”表通过指定customerID和RecordVersion列连接到customers表。这样,如果您想查看客户下订单时使用的电子邮件地址,可以从customer表中检索该数据

您将知道客户使用的其他电子邮件地址,这不仅仅是因为您可以在某些购买数据中找到这些地址,还因为它是您客户记录的一部分


这个模型可能会变得非常复杂,并且很难查询-所以要谨慎使用它。但特别是对于产品、价格、折扣、送货地址等,它非常有用,尤其是在电子商务解决方案中

与存储快照相比,这种方法听起来是一种很棒的方法。它确实保持了数据的时间维度的相关性。我想,就像你说的,查询将更加复杂,你应该考虑在一个集中的位置创建一个函数库来为你实现这一点。干杯