【问题标题】:MySQL Optimized data storage in database, when entry was changedMySQL 优化数据库中的数据存储,当条目发生变化时
【发布时间】:2015-02-13 15:19:14
【问题描述】:

我们遇到了一个问题:

当我们生成帐户(或其他文档)时,我们会使用客户(员工)数据。 但是,客户可以更改他们的数据(例如,女性结婚并更改了她的姓氏,或者她搬家了) 住在其他国家,她的地址变了)。

我们需要,在编辑女性姓氏后,帐户 在特定日期之前保留旧姓氏,在特定日期之后,使用女性新姓氏。

例如我们有一个女人:艾米莉·史密斯。她于 2014 年 12 月 15 日结婚,姓氏为布朗。 之前:12 月 15 日,我们使用 Smith 姓氏生成她的帐户,但在 12 月 15 日之后 我们需要用布朗姓氏生成她的帐户。所以在数据库中我们需要保存她的两个姓氏。

如何保存仅使用一个或几个更改属性优化的条目?

附:我们还需要保存更改的日期,以便知道要使用哪个姓氏,旧的还是新的。

【问题讨论】:

  • 请让您的问题可读,并阅读how to ask a question
  • 听起来你知道需求是什么,你试过为它们编码吗?

标签: php mysql database optimization


【解决方案1】:

Gordon 在这方面有一个良好的开端,但事实是,当您编写使用这样的方案的连接时,复杂性就会出现。

要使用他的方案,您需要编写如下所示的查询:

SELECT s.*, n.firstname, n.lastname FROM sometable AS s INNER JOIN account_names AS n ON s.accountid = n.accountid AND CURRENT_DATE() BETWEEN n.effdate AND n.endate

如果您不想一直进行日期比较,您也可以在 account_names 中添加一个列,例如 account_name_id,并将所有从属记录实际链接到该列。在这种情况下,sometable 需要有一个 account_name_id 而不是 account_id。

【讨论】:

    【解决方案2】:

    这称为渐变维度。传统方法是附上生效日期和结束日期的记录。因此,Emily 将在此表中有两行:

    AccountId    Firstname     LastName     EffDate      EndDate
       1           Emily       Smith        2001-01-01   2014-12-14
       1           Emily       Brown        2014-12-15   NULL
    

    通常,当前记录的NULL 值可能是遥远未来的某个任意日期(例如 9999-12-31)。不必在逻辑中处理NULLs 可以提高性能。

    然后,当您想要某个特定日期的记录时,您只需使用在该日期有效的记录。如果你想要当前记录,同样的逻辑也成立——找到今天有效的记录。

    【讨论】:

    • 为了避免选择中的重复条目,您可以从选择当前日期时生成的视图中查询它们。
    • 谢谢 Gordon,您的回答很好,适合我们。我们真的很感激。
    • @Arturas 如果答案对您有所帮助并且您对此充满感激,那么我们在 SO 上所做的就是支持并接受答案。 Gordon 花时间了解并解决你的问题,回报这个人的时间和努力。
    猜你喜欢
    • 2022-10-24
    • 2011-09-28
    • 1970-01-01
    • 2019-05-23
    • 2012-07-20
    • 2010-12-12
    • 2014-09-08
    • 1970-01-01
    • 2010-12-08
    相关资源
    最近更新 更多