Сохранение волатильных данных в заказах

Предположим, у меня есть таблицы: клиенты и заказы, я хотел бы хранить заказ с неизменяемой информацией о клиенте (например, адрес, имя и т. Д.), Но не хочу копировать всю эту информацию в таблицу заказов. Есть три варианта:

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 ответ

Решение

Я рекомендую что-то похожее на то, что @Jeffrey L Whitledge предлагает в базе данных-структура-для-хранения-исторических данных.

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.

Все данные, которые могут быть изменены, должны быть сгруппированы, например, адрес находится здесь, если что-то меняется в адресе, легко сгенерировать новую сущность, и строка заказа может продолжать ссылаться на старую сущность.

В терминах хранилища данных это обычно называется звездообразной схемой, в которой вы различаете таблицы фактов и измерений.

Другие вопросы по тегам