我不太确定我是否理解这个问题。以您的客户和订单为例,您可以
CREATE TABLE address (
address_id NUMBER PRIMARY KEY,
street VARCHAR2(100),
...
);
CREATE TABLE customer (
customer_id NUMBER PRIMARY KEY,
first_name VARCHAR2(100),
...
address_id NUMBER REFERENCES address( address_id )
);
CREATE TABLE orders (
order_id NUMBER PRIMARY KEY,
...
customer_id NUMBER REFERENCES customer( customer_id ),
address_id NUMBER REFERENCES address( address_id )
);
如果ADDRESS
是一级表,则两者ORDERS
都CUSTOMER
可以引用特定的地址。 CUSTOMER
可以参考客户的当前地址,ORDERS
可以参考订单被切到的地址,该地址可能是客户当时的当前地址,或者可能是他们为之下订单的人的地址(即我下的鲜花订单是我已经在母亲节寄到我妈妈家)。 ADDRESS
then 变为不可变的,因此ADDRESS
您无需更新行,只需INSERT
使用 new执行ADDRESS_ID
并更新CUSTOMER
表中的行以指向 new ADDRESS
。
如果您想跟踪客户地址的历史记录,您只需将表address_id
移出customer
并放入customer_address
具有某种版本相关信息的新映射表中。通常,您会遇到类似这样的情况,您可以在其中指定映射有效的日期范围。
CREATE TABLE customer_address (
customer_address_id NUMBER PRIMARY KEY,
customer_id NUMBER REFERENCES customer( customer_id ),
address_id NUMBER REFERENCES address( address_id ),
valid_from DATE,
valid_to DATE
);