保留订单中的易失数据

时间:2018-03-23 11:02:18

标签: sql database database-schema historical-db

让我们假设我有表:客户和订单,我想存储具有不可更改的客户信息(如地址,名称等)的订单,但不想将所有这些信息复制到订单表。有三种选择:

a) Mapping table for base customers
orders
    ....
    customer_id; link to the customers table
    baseCustomer_id; link to the customers_base table
    ....
customers
    id; 
    base_id; link to the base customers table;
    ....
customers_base
    id
    ....

b) Versioning: (if new customer, create version 0 for base customer, and version 1 to have permament record)
orders
    ....
    customer_id
    customer_version
    ....
customers
   id
   version
   ....
c) Create a copy of customer info for each order and store it into the same table; 
orders
   ....
   customer_id
   ....
customers
   id
   ....
   copy_of; refers to the customers.id if null represents base customer entity

所以问题是:从数据库设计,可读性,实现复杂性等不同角度来看,哪种方法更受欢迎?

1 个答案:

答案 0 :(得分:1)

我推荐类似于@Jeffrey L Whitledge在database-structure-for-storing-historical-data

中提出的建议
Customer
--------
CustomerId (PK)
Name
AddressId (FK)
PhoneNumber
Email

Order
-----
OrderId (PK)
CustomerId (FK)
ShippingAddressId (FK)
BillingAddressId (FK)
TotalAmount

Address
-------
AddressId (PK)
AddressLine1
AddressLine2
City
Region
Country
PostalCode

etc.

每个可以更改的数据都应该被分组,例如地址在这里,如果地址发生任何变化,它很容易生成新实体,订单行可以继续引用旧实体。

在数据仓库术语中,这通常称为star schema,您可以在其中区分事实和维度表。