MySQL - 如何处理历史数据?

时间:2018-04-25 04:34:44

标签: mysql sql relational-database

我是数据库设计世界的新手,但是我为我的工作开发的应用程序构建了一个相当复杂的(对我来说)系统。

我在这里使用示例,因为发布我的实际数据库结构会太多。

假设我有一张[products]待售表和另一张表来记录所有个人[sales]

[sales]表包含引用id表中[products]的外键。但是,随着时间的推移,product可能不再可用,需要从[products]表中删除。

显然,当FK指向product表中的[sales]时,我可以限制删除product(noaction),删除sale记录( cascade),或将product设置为null(setnull)。这些选项都不合适,因为我们仍然需要知道product中出售的sale是什么。

我想到的几个解决方案

  1. 我可以,而不是从product表中删除[products] 将其标记为"不活动"或"不可用"代替。
  2. product的重复记录插入单独的"历史记录"表并更新[sales]表的FK以指向那里。然后从[products]表中删除原始记录。
  3. 完全删除外键并信任我的应用程序自己正确处理链接(即:而不是指向product_id的FK,我的[sales]表可能改为使用{{1对于VARCHAR,需要文本匹配才能检索其他product_name详细信息。 ****糟糕的主意****
  4. 这可以实现的一种方式是什么?

1 个答案:

答案 0 :(得分:0)

尚未在各地获得评论权利,所以我在答案方面发帖, 我正在寻找public Myclass { public Myclass(AnotherClass obj) { _key = obj.key; _ID = obj.ID; _CandidateMode = obj.CandidateMode; if(_CandidateMode == obj.CandidateMode.numeric { //Dosomething } else { //Do something with special character. } } } 标签,因为删除信息尤其是其他地方引用的信息可能很悲惨。 如果你想让它更有趣,请按以下方式: 如果产品可以处于非活动状态然后再次激活并且您想要跟踪特定于这些期间的信息,该怎么办? 或者如果产品的价格不断变化(并且它在产品表中列出)但您想根据当时的价格跟踪历史销售额呢?

您基本上必须创建一个星形设置,您可以在其中对每个新的重大更改对产品进行版本设置并为其提供change_keys。 这样,您就可以返回并引用产品的所有不同实例。