如何设计一个 table 来高效地将每天可能是新的或与前一天相同的数据保存到 MySQL 中?
How to design a table to save daily data that may be new or same as previous day into MySQL efficiently?
我有一个脚本可以每天在网站上查看一些产品的销售价格,并想将其存储在 MySQL 数据库中。
有一个商品table,里面存储了productID,name,attributes等。我想了两种构造sale price的方法table。
产品 ID、销售价格、销售价格日期。如果有销售价格,这将每天为每个产品存储一条记录。很可能最终会保存重复多天的同一条记录。
产品 ID、销售价格、起始日期、截止日期。首次找到产品的销售价格时,它会插入一条包含 productID、SalePrice、FromDate、null ToDate 的记录。如果之后几天没有变化,什么都不做。当某一天检测到同一产品的新销售价格时,它会将 ToDate 更新为 today()-1.
哪种方式更好?我想第一种方式每天都会保存很多重复数据。第二种方式,我如何比较源数据与销售价格 table 并仅插入新数据,更新现有 ToDate 并忽略其余部分?像这样处理数据需要更多资源吗? FromDate 和 ToDate 是否会使将来的查询难以构造或执行速度变慢?我正在考虑的查询类型将是在给定日期范围内查找销售价格的第一个开始日期,在给定日期范围内查找产品销售的总天数,查找产品何时销售或不销售例如给出一个日期范围。我对 MySQL 很陌生,所以没有检查高级查询。
谢谢!
我会选择第二种方法,因为它似乎在节省内存和您的用例方面更有意义。
现在针对您的每个问题:
问:如何比较源数据与促销价 table 并仅插入新数据,更新现有 ToDate 并忽略其余数据?
A:您将销售价格与相同产品 ID 的销售价格 table 与源数据进行比较,您从销售价格 table 中获取产品 ID 的最新记录(其中 ToDate 为空).另一种看待它的方式是,您只查询源数据中的产品,这些产品的 SalePrice 值与销售价格 table 中的值不同,或者产品尚未插入销售价格 table但在新源数据中(新产品,每日数据自带)。
问:像这样处理数据会占用更多资源吗?
A:我愿意,但这并不意味着你会花费大量的计算能力,这只是一些逻辑而不是旧的insert into table select * from another_table
。您将节省内存,因此必须进行权衡。当你用 SQL 分析你的 table 时,你不必进行聚合(就像你使用方法 1 那样),所以这节省了一些计算能力。
问:FromDate 和 ToDate 是否会使将来的查询难以构建或执行速度变慢?
A: 假设您想获取某个日期的产品价格 -> WHERE productId = your_productID and your_desired_date between DateFrom and DateTo
假设您想了解某些产品的销售价格如何随时间变化 -> WHERE productId = your_productID 等等...所以根据您的 SQL 技能,我认为这不应该是那困难。使用方法 1,您将不得不进行聚合,使用方法 2,您将不得不更多地使用时间逻辑。
问:我正在考虑的查询类型将是在给定日期范围内查找销售价格的第一个开始日期,在给定日期范围内查找产品销售的总天数,查找产品何时销售打折或不打折,例如提供日期范围。
答:如果您的用例是查找销售价格的第一个开始日期(使用第一种方法,您必须使用聚合函数,MIN())。如果你想获得总天数,如果你使用方法 2,你的查询将更加高效,因为你使用 DATEDIFF(DateFrom, DateTo),这是 psevdo 代码,请参阅 MySQL 的文档以获得函数发现以天为单位的日期之间的日期差异。如果您想查看产品是否在日期范围内销售,方法 2 会比方法 1 更麻烦,但不会很多。您只需要查看您的 table 中是否有该日期范围内该产品的记录,如果没有,则该产品不在销售中,否则它在销售中。
结论:我会采用方法 2。
我有一个脚本可以每天在网站上查看一些产品的销售价格,并想将其存储在 MySQL 数据库中。
有一个商品table,里面存储了productID,name,attributes等。我想了两种构造sale price的方法table。
产品 ID、销售价格、销售价格日期。如果有销售价格,这将每天为每个产品存储一条记录。很可能最终会保存重复多天的同一条记录。
产品 ID、销售价格、起始日期、截止日期。首次找到产品的销售价格时,它会插入一条包含 productID、SalePrice、FromDate、null ToDate 的记录。如果之后几天没有变化,什么都不做。当某一天检测到同一产品的新销售价格时,它会将 ToDate 更新为 today()-1.
哪种方式更好?我想第一种方式每天都会保存很多重复数据。第二种方式,我如何比较源数据与销售价格 table 并仅插入新数据,更新现有 ToDate 并忽略其余部分?像这样处理数据需要更多资源吗? FromDate 和 ToDate 是否会使将来的查询难以构造或执行速度变慢?我正在考虑的查询类型将是在给定日期范围内查找销售价格的第一个开始日期,在给定日期范围内查找产品销售的总天数,查找产品何时销售或不销售例如给出一个日期范围。我对 MySQL 很陌生,所以没有检查高级查询。
谢谢!
我会选择第二种方法,因为它似乎在节省内存和您的用例方面更有意义。 现在针对您的每个问题:
问:如何比较源数据与促销价 table 并仅插入新数据,更新现有 ToDate 并忽略其余数据?
A:您将销售价格与相同产品 ID 的销售价格 table 与源数据进行比较,您从销售价格 table 中获取产品 ID 的最新记录(其中 ToDate 为空).另一种看待它的方式是,您只查询源数据中的产品,这些产品的 SalePrice 值与销售价格 table 中的值不同,或者产品尚未插入销售价格 table但在新源数据中(新产品,每日数据自带)。
问:像这样处理数据会占用更多资源吗?
A:我愿意,但这并不意味着你会花费大量的计算能力,这只是一些逻辑而不是旧的insert into table select * from another_table
。您将节省内存,因此必须进行权衡。当你用 SQL 分析你的 table 时,你不必进行聚合(就像你使用方法 1 那样),所以这节省了一些计算能力。
问:FromDate 和 ToDate 是否会使将来的查询难以构建或执行速度变慢? A: 假设您想获取某个日期的产品价格 -> WHERE productId = your_productID and your_desired_date between DateFrom and DateTo 假设您想了解某些产品的销售价格如何随时间变化 -> WHERE productId = your_productID 等等...所以根据您的 SQL 技能,我认为这不应该是那困难。使用方法 1,您将不得不进行聚合,使用方法 2,您将不得不更多地使用时间逻辑。
问:我正在考虑的查询类型将是在给定日期范围内查找销售价格的第一个开始日期,在给定日期范围内查找产品销售的总天数,查找产品何时销售打折或不打折,例如提供日期范围。
答:如果您的用例是查找销售价格的第一个开始日期(使用第一种方法,您必须使用聚合函数,MIN())。如果你想获得总天数,如果你使用方法 2,你的查询将更加高效,因为你使用 DATEDIFF(DateFrom, DateTo),这是 psevdo 代码,请参阅 MySQL 的文档以获得函数发现以天为单位的日期之间的日期差异。如果您想查看产品是否在日期范围内销售,方法 2 会比方法 1 更麻烦,但不会很多。您只需要查看您的 table 中是否有该日期范围内该产品的记录,如果没有,则该产品不在销售中,否则它在销售中。
结论:我会采用方法 2。