1

例如,假设用户购买soap了价格为1.50on的产品20th sept 2012。这已记录在带有和的purchase表下的数据库中。productIDdate

假设在 2012 年 9 月 22 日,管理员将价格更改soap1.20,现在报告价格因此而更改。

确保1.50为旧报告和1.20新报告存储旧数据的最佳方法是什么。purchase我应该在表格中插入所有数据,包括产品名称、产品价格吗?

4

4 回答 4

2

您的问题的简单答案是肯定的。

对于金融系统,任何可能需要审计“交易”的系统都应该完整地存储在“文档”或“记录”中。

还有其他方法,例如使用“标志”(例如当前、已删除、已修改等)、“from_date”和“to_date”记录每次删除或修改,而不是实际删除或修改数据库中的数据,但这将使用更多服务器资源和编程不仅在 mySQL 中而且在 PHP 中都要复杂得多。但它允许您同时只提供记录之间的关系。

我的建议是保持简单并将所有需要的数据存储在一条记录中。如果需要对系统进行审核,您将更加安全,您将节省时间和合法地。

祝你好运,我希望它有所帮助!

于 2012-09-24T10:58:00.060 回答
0

我认为没有必要将产品名称存储在购买表中,但我认为应该存储产品价格。

此外,如果您不将产品名称存储在购买表中,则应注意删除产品。也许删除它们不是最好的主意,因此您应该将它们从商店中隐藏,但不要从数据库中删除它们。

于 2012-09-24T10:44:01.443 回答
0

我通常将产品的价格与 productID 和日期一起存储在 purchase 表中,或者如果您可以在购物车中有多个项目,您将有一个 purchase 表和一个 purchase_product 表。这是如果您添加优惠券代码或其他类似的东西,您将始终能够看到该人在该特定购买中为该商品支付的费用。

于 2012-09-24T12:28:04.683 回答
0

我最近一直在研究与您描述的产品接近的产品。而且我相信您的答案取决于您愿意实施项目的复杂程度。最简单的方法是将产品信息存储在发票记录中。但随着时间的推移,这会导致冗余。

另一方面,您可以实施修订机制,以便随时跟踪记录的更改。这可以通过为您的记录使用两个 id 而不是一个来轻松完成。这是一个示例表:

CREATE TABLE IF NOT EXISTS `product` (
  `product_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `entity_id` bigint(20) unsigned NOT NULL,
  `name` varchar(255) NOT NULL,
  `price` double NOT NULL DEFAULT '0',
  PRIMARY KEY (`product_id`),
  KEY `inx_entity_id` (`entity_id`)
) DEFAULT CHARSET=utf8 ;

虽然product_id是您的普通自动增量 ID,但entity_id它是一个特殊的 ID,对于同一产品的所有记录都是相同的。在这种设计中,您永远不会删除记录,也不会更新它。您将始终只插入表中,当您需要获取产品列表时,您只需记住按entity_id顺序排列。产品信息可以在最大的记录中找到product_id。也许您可能想要创建一个实体表来跟踪entity_ids。

这种设计比将产品信息复制到发票更复杂。但它有很多很大的好处。就像您可以跟踪产品的价格变化一样。或者您可以使用外键来product_id指向产品的一个特定版本,或者使用entity_id来指示产品类型而不是它的某个特定版本。当然,它的复杂性会让你付出代价,但你可以判断它是否值得。

于 2012-09-24T13:37:22.133 回答