例如,假设用户购买soap
了价格为1.50
on的产品20th sept 2012
。这已记录在带有和的purchase
表下的数据库中。productID
date
假设在 2012 年 9 月 22 日,管理员将价格更改soap
为1.20
,现在报告价格因此而更改。
确保1.50
为旧报告和1.20
新报告存储旧数据的最佳方法是什么。purchase
我应该在表格中插入所有数据,包括产品名称、产品价格吗?
您的问题的简单答案是肯定的。
对于金融系统,任何可能需要审计“交易”的系统都应该完整地存储在“文档”或“记录”中。
还有其他方法,例如使用“标志”(例如当前、已删除、已修改等)、“from_date”和“to_date”记录每次删除或修改,而不是实际删除或修改数据库中的数据,但这将使用更多服务器资源和编程不仅在 mySQL 中而且在 PHP 中都要复杂得多。但它允许您同时只提供记录之间的关系。
我的建议是保持简单并将所有需要的数据存储在一条记录中。如果需要对系统进行审核,您将更加安全,您将节省时间和合法地。
祝你好运,我希望它有所帮助!
我认为没有必要将产品名称存储在购买表中,但我认为应该存储产品价格。
此外,如果您不将产品名称存储在购买表中,则应注意删除产品。也许删除它们不是最好的主意,因此您应该将它们从商店中隐藏,但不要从数据库中删除它们。
我通常将产品的价格与 productID 和日期一起存储在 purchase 表中,或者如果您可以在购物车中有多个项目,您将有一个 purchase 表和一个 purchase_product 表。这是如果您添加优惠券代码或其他类似的东西,您将始终能够看到该人在该特定购买中为该商品支付的费用。
我最近一直在研究与您描述的产品接近的产品。而且我相信您的答案取决于您愿意实施项目的复杂程度。最简单的方法是将产品信息存储在发票记录中。但随着时间的推移,这会导致冗余。
另一方面,您可以实施修订机制,以便随时跟踪记录的更改。这可以通过为您的记录使用两个 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_id
s。
这种设计比将产品信息复制到发票更复杂。但它有很多很大的好处。就像您可以跟踪产品的价格变化一样。或者您可以使用外键来product_id
指向产品的一个特定版本,或者使用entity_id
来指示产品类型而不是它的某个特定版本。当然,它的复杂性会让你付出代价,但你可以判断它是否值得。