使用外键或保留数据以获取交易历史信息?

时间:2012-04-20 03:35:53

标签: database-design relational-database database-schema

这是一个场景。

您有一个向客户销售的电子商务网站。 显然有交易 例如对于每次销售,您都会记录有关销售的信息。 所以我们有一个'购买'表。 它应该有哪些列?

1)它是否只有'customer_id'的'customer'表的外键? 要么 2)保存快照,例如'customer_name','customer_address'......两者都为VARCHAR(x) 要么 3)两个 要么 4)将'购买'表分成多个表? 要么 别的什么。

请提出您的意见和原因。 欢呼声

2 个答案:

答案 0 :(得分:0)

关于“购买”表应具有的列,它很大程度上取决于您的要求。通常,您会购买某种购买代码,购买日期和购买客户,以及购买中的商品列表(单独的表格)。

关于你提到的选项,我猜你在这里有一个关系数据库而且没有找到NoSQL解决方案。

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

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

    购买给定客户的
  • 已经完成。
  • 哪位客户已经具体购买。
  • 根据某些标准给出的客户进行购买搜索。
  • 根据某些标准提供的购买进行客户搜索。

如果您需要能够在给定日期记录客户数据,您可以随时选择创建客户历史记录表并将其链接到Customer表。根据购买日期,您可以在购买时知道哪些客户数据“有效”。

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

HTH

答案 1 :(得分:0)

如果时间是您的问题域的固有概念 - 而且电子商务也是如此 - 您应该将其视为架构中的一流设计概念。

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

CUSTOMER
---------------
CustomerID   pk
RecordVersion pk
Name
EmailAddress
HomeAddressID fk
HomeAddressRecordVersion fk
ValidFrom
ValidUntil

然后,“purchase”表通过指定customerID和RecordVersion列连接到customers表。这样,如果您想查看客户在下订单时使用的电子邮件地址,您可以从客户表中检索该数据。

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

这个模型可能变得非常复杂,难以查询 - 因此请谨慎使用。但特别是对于产品,价格,折扣,送货地址等,这是非常有用的。在电子商务解决方案中。