我们有一个购物车,如下图所示,设置运行良好,除了一个致命的缺陷。如果您下订单该订单与产品相关联,那么如果我在您购买产品后更新产品,我就无法向您展示您希望产品在购买时的样子(包括价格)。这意味着我们需要版本控制。
我目前的计划是,在创建新产品或变体或编辑现有产品或变体时,在数据库中创建产品或变体的副本。购买时,将订单链接到版本,而不是产品。
这似乎相当简单,除了我可以看到的,我们不需要版本的唯一内容是类别(因为没有人关心它的类别)。所以我们需要版本:
我目前的想法是,
注意: 创建产品时,也会创建默认变体,但无法将其删除。
所以最终结构看起来像Full Size
现在这一切看起来都很棒,除了它看起来像是一堆重复的数据,例如如果我们更新产品,我们会复制变体,即使它们在插入后也没有更新过。此外,这似乎是很多工作。
有更好的方法吗?
答案 0 :(得分:4)
您可以执行ERP(以及可能还有Payroll)系统的操作:添加开始和结束日期/时间。所以......
parent_start_date <= child_start_date AND parent_end_date >= child_end_date
答案 1 :(得分:0)
另一种方法是永远不要编辑或删除数据,只创建新数据。在SQL术语中,您在表上运行的唯一操作是INSERT和SELECT。
要完成您想要的任务,每个表都需要以下列:
有了这个,这就是你的产品表的样子:
CREATE TABLE products (
version_id CHAR(8) NOT NULL PRIMARY KEY,
id INTEGER NOT NULL,
creation_date TIMESTAMP NOT NULL DEFAULT NOW(),
is_active BOOLEAN DEFAULT true,
name VARCHAR(1024) NOT NULL,
price INTEGER NOT NULL
);
CREATE TABLE variants (
version_id CHAR(8) NOT NULL PRIMARY KEY,
id INTEGER NOT NULL,
creation_date TIMESTAMP NOT NULL DEFAULT NOW(),
is_active BOOLEAN DEFAULT true,
product_version_id CHAR(8) NOT NULL,
price INTEGER NOT NULL,
override_price INTEGER NOT NULL,
FOREIGN KEY (product_version_id) REFERENCES products(version_id)
);
现在,要插入任何一个表
要更新表格中的行,必须插入整个图表,例如要更新产品,必须插入新产品和新变体。 (这里有很多优化空间,但最简单的方法是从未优化的解决方案开始。)
例如,更新产品
此主体可以扩展到您的所有表格。
要查找产品的最新版本,您需要使用creation_date列来获取最近创建的产品。
这个模型将使用更多的空间,但我认为这可能是一个公平的权衡,因为它很简单:只有INSERT和SELECT,数据永远不会发生变异。