是否有为将来会更改或删除的数据库对象(模型)存储数据的最佳实践(Django)?
Is there a best practice for storing data for a database object (model) that will change or be deleted in the future (Django)?
我正在为在线商店构建订单管理系统,并希望存储有关所订购产品的信息。
如果我对产品使用外键关系,当有人更改产品的价格、品牌、供应商等或删除产品时,订单也会受到影响。我希望订单管理系统能够在订购时显示产品的状态,即使之后它被更改或从数据库中删除。
我考虑了很长时间,并提出了一些想法,例如存储对象的 JSON 字符串表示;创建一个重复的产品,然后我将其外键用于订单等。但是,我想知道是否有最佳实践或其他人使用什么来处理商业软件中的这种情况?
PS:我还有其他稍微复杂的情况,例如,我希望附加到 Order 的 User 对象的数据随着 User 的变化而变化,但当 User 时永远不会被删除被删除。上述问题的答案肯定会给我一个很好的起点。
虽然至少在没有看到您的 models.py
的情况下很难回答您的问题,但我建议您将结果存档。您可以添加一个名为 historical
的 boolean field
,默认为 False
。下订单后,您需要在视图集或函数中将前一个订单(或多个订单)的 historical
值设置为 True
。
这里,historical=True
表示正在归档记录。您可以在此 historical
列上进行过滤以显示您想要的内容。抱歉,这只是一个高级大纲。
这个价格变化问题通常在 RDBMS (SQL) 商业应用程序中通过做两件事来处理。
在下订单时将行插入 order_detail
table。 table 的每一行都包含所售商品的详细信息:item_id、item_count、unit_price、total_price、unit_weight、total_weight、tax_status,等等。因此,该应用程序会捕获实际售出的商品以及价格。以后的价格变化不会弄乱销售记录。你真的必须这样做。
a price
table 包含 item_id、价格、start_time、end_time。您检索当前价格是这样的:
SELECT item.item, price.price
FROM item
JOIN price ON item.item = price.item
AND price.start_date <= NOW()
AND (price.end_date > NOW() OR price.end_date IS NULL)
这种方法可以让您跟踪历史价格,也可以设置未来的价格变化。但是你还是把价格复制到order_detail
table.
要点是:一旦您接受了订单,其详细信息以后就不能再更改。当您接受订单时,您将实际客户数据(姓名、送货地址等)复制到与当前客户 table 分开的 order
table 中,以及(如上所述)详细信息将每个项目合并为 order_detail
table.
如果你不这样做,你的审计员会讨厌你。有时间问我怎么知道的。
我建议为 Order 模型创建属性,并在保存模型时将您需要的数据一个一个地提取到这些属性中,然后在存储 JSONFields 或其他一些地方实现历史数据 table创建或更新时的产品版本等;这样人们就可以在需要时参考历史数据 table。这比在 Order 对象中存储产品的完整表示更有效,因为创建历史数据所花费的时间基本上由创建产品的管理员而不是创建订单的客户收取。当你达到那些高级水平时,你甚至可以在后台使用线程等创建历史数据对象。
我正在为在线商店构建订单管理系统,并希望存储有关所订购产品的信息。
如果我对产品使用外键关系,当有人更改产品的价格、品牌、供应商等或删除产品时,订单也会受到影响。我希望订单管理系统能够在订购时显示产品的状态,即使之后它被更改或从数据库中删除。
我考虑了很长时间,并提出了一些想法,例如存储对象的 JSON 字符串表示;创建一个重复的产品,然后我将其外键用于订单等。但是,我想知道是否有最佳实践或其他人使用什么来处理商业软件中的这种情况?
PS:我还有其他稍微复杂的情况,例如,我希望附加到 Order 的 User 对象的数据随着 User 的变化而变化,但当 User 时永远不会被删除被删除。上述问题的答案肯定会给我一个很好的起点。
虽然至少在没有看到您的 models.py
的情况下很难回答您的问题,但我建议您将结果存档。您可以添加一个名为 historical
的 boolean field
,默认为 False
。下订单后,您需要在视图集或函数中将前一个订单(或多个订单)的 historical
值设置为 True
。
这里,historical=True
表示正在归档记录。您可以在此 historical
列上进行过滤以显示您想要的内容。抱歉,这只是一个高级大纲。
这个价格变化问题通常在 RDBMS (SQL) 商业应用程序中通过做两件事来处理。
在下订单时将行插入
order_detail
table。 table 的每一行都包含所售商品的详细信息:item_id、item_count、unit_price、total_price、unit_weight、total_weight、tax_status,等等。因此,该应用程序会捕获实际售出的商品以及价格。以后的价格变化不会弄乱销售记录。你真的必须这样做。a
price
table 包含 item_id、价格、start_time、end_time。您检索当前价格是这样的:SELECT item.item, price.price FROM item JOIN price ON item.item = price.item AND price.start_date <= NOW() AND (price.end_date > NOW() OR price.end_date IS NULL)
这种方法可以让您跟踪历史价格,也可以设置未来的价格变化。但是你还是把价格复制到
order_detail
table.
要点是:一旦您接受了订单,其详细信息以后就不能再更改。当您接受订单时,您将实际客户数据(姓名、送货地址等)复制到与当前客户 table 分开的 order
table 中,以及(如上所述)详细信息将每个项目合并为 order_detail
table.
如果你不这样做,你的审计员会讨厌你。有时间问我怎么知道的。
我建议为 Order 模型创建属性,并在保存模型时将您需要的数据一个一个地提取到这些属性中,然后在存储 JSONFields 或其他一些地方实现历史数据 table创建或更新时的产品版本等;这样人们就可以在需要时参考历史数据 table。这比在 Order 对象中存储产品的完整表示更有效,因为创建历史数据所花费的时间基本上由创建产品的管理员而不是创建订单的客户收取。当你达到那些高级水平时,你甚至可以在后台使用线程等创建历史数据对象。