在订单中保留易变数据
Retaining volatile data in orders
假设我有 tables: 客户和订单,我想用不可更改的客户信息(如地址、姓名等)存储订单,但不想将所有这些信息复制到订单table。共有三个选项:
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
所以问题是:从数据库设计、可读性、实现复杂性等不同角度来看,哪种方法更可取?
我推荐类似于@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,您可以在其中区分事实表和维度表。
假设我有 tables: 客户和订单,我想用不可更改的客户信息(如地址、姓名等)存储订单,但不想将所有这些信息复制到订单table。共有三个选项:
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
所以问题是:从数据库设计、可读性、实现复杂性等不同角度来看,哪种方法更可取?
我推荐类似于@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,您可以在其中区分事实表和维度表。