【问题标题】:Retaining volatile data in orders在订单中保留易失性数据
【发布时间】:2023-03-24 00:00:01
【问题描述】:

假设我有表:客户和订单,我想用不可更改的客户信息(如地址、姓名等)存储订单,但不想将所有这些信息复制到订单表中。共有三个选项:

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

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

【问题讨论】:

    标签: sql database database-schema historical-db


    【解决方案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,您可以在其中区分事实表和维度表。

    【讨论】:

    • 谢谢,看起来@Jeffrey L Whitledge 声称第三个选项更可取,除了跟踪有关哪个地址用于创建订单实体的直接信息,将其替换为参考客户。
    • @ololoken 我不确定我在关注吗?我在他的建议中没有看到自引用实体?
    • 我看到自我引用被反转为对新地址和客户的引用。但是一旦我们从图片中删除客户,那么保持对“父”地址的引用的最佳选择是地址表中的自我引用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    相关资源
    最近更新 更多