Database design 是否为事务历史信息使用外键或保留数据?
下面是一个场景 你有一个向客户销售的电子商务网站。 显然有交易 e、 g.对于每次销售,您都要记录有关销售的信息。 因此,让我们有一个“购买”表。 应该有哪些栏目 1) 是否应该使用“customer_id”为“customer”表提供一个外键? 或 2) 保留一个快照,如“客户名称”、“客户地址”……都作为VARCHAR(x) 或 3) 两者 或 4) 将“购买”表分为多个表? 或 还有别的 请给出你的意见和原因。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) 将“购买”表分为多个表? 或 还有别的 请给出你的意见和原因。 干杯关于采购表应包含的列,这在很大程度上取决于您的要求。通常情况下,您至少会有
干杯关于采购表应包含的列,这在很大程度上取决于您的要求。通常情况下,您至少会有某种采购代码、采购日期和采购客户,以及采购中的项目列表(单独的表格) 关于您提到的选项,我猜您这里有一个关系数据库,而不是NoSQL解决方案 在这种情况下,我将放弃选项(2)。它不适合关系模式,因为您可能会在多个记录中复制客户信息。出于同样的原因,我也会放弃选项(3) 选项(1)更适合关系数据库方法。您可以进行购买,每个购买都与自己的客户关联。这使您可以轻松了解:
- 某个特定客户已购买的产品
- 哪个客户进行了具体的购买
- 根据某些条件指定的客户进行采购搜索
- 根据某些标准给出的购买情况进行客户搜索
- 等等
HTH如果时间是问题域的固有概念,而对于电子商务来说,时间是一个固有概念,那么您也应该将其视为方案中的一流设计概念 我的首选方案是在表上设置一个“有效期”指示器,该指示器可以随时间变化。例如,下面是customer表的外观:
CUSTOMER
---------------
CustomerID pk
RecordVersion pk
Name
EmailAddress
HomeAddressID fk
HomeAddressRecordVersion fk
ValidFrom
ValidUntil
然后,“购买”表通过指定customerID和RecordVersion列连接到customers表。这样,如果您想查看客户下订单时使用的电子邮件地址,可以从customer表中检索该数据
您将知道客户使用的其他电子邮件地址,这不仅仅是因为您可以在某些购买数据中找到这些地址,还因为它是您客户记录的一部分
这个模型可能会变得非常复杂,并且很难查询-所以要谨慎使用它。但特别是对于产品、价格、折扣、送货地址等,它非常有用,尤其是在电子商务解决方案中 与存储快照相比,这种方法听起来是一种很棒的方法。它确实保持了数据的时间维度的相关性。我想,就像你说的,查询将更加复杂,你应该考虑在一个集中的位置创建一个函数库来为你实现这一点。干杯