Rails 上的 Ruby 中仅附加数据库的软删除
Soft deletes with append only database in Ruby on Rails
在 Rails 上使用 Ruby 和仅附加数据库 (Google BigQuery),软删除的最佳做法是什么?我正在考虑的模式是为每个 update/delete 追加一个新行并且只收集最近的记录。但我不确定使用 Active Record 是否有一种干净的方法来做到这一点。还有其他建议的模式/最佳做法吗?
这里有两点需要考虑。您希望自己的修订历史有多真实,性能有多重要?
执行此操作的快速而肮脏的方法是将记录的 JSON 副本保存到历史记录 table。这很容易做到,但不能保证其中的数据与 table 的未来版本的架构兼容,也就是说,您可能无法轻松恢复它。
不要用已删除或历史版本污染您的主要table。这只会带来麻烦,并使查询变得极其缓慢。
Big Query 用于对海量数据集进行分析。
如果是这种情况 - 您可以忽略可能通过添加新的 update/delete 行和“保留”历史行而引入的缓慢。
在 BigQuery 中,使用 window function 获取行的最新版本非常简单。
例如,假设 "id" 是定义 record/row 的主键并且 "ts" 是时间戳
SELECT <fields list> FROM (
SELECT <fields list>, ROW_NUMBER() OVER(PARTITION BY id ORDER BY ts DESC) AS num
FROM YourTable
)
WHERE num = 1
如果您需要使用历史数据进行历史分析——我们开始吧——很容易做出代表当时相应行版本的选择。
如果您不需要历史版本,您可以定期进行清理——为此,最好让您的数据按天分区(或按月或任何更适合您的情况的分区方式)
BigQuery 对查询分区表有很好的支持 - Table wildcard functions
如果您想坚持使用 BigQuery – 这将是一个很好的方法
我确实建议多探索一下
在 Rails 上使用 Ruby 和仅附加数据库 (Google BigQuery),软删除的最佳做法是什么?我正在考虑的模式是为每个 update/delete 追加一个新行并且只收集最近的记录。但我不确定使用 Active Record 是否有一种干净的方法来做到这一点。还有其他建议的模式/最佳做法吗?
这里有两点需要考虑。您希望自己的修订历史有多真实,性能有多重要?
执行此操作的快速而肮脏的方法是将记录的 JSON 副本保存到历史记录 table。这很容易做到,但不能保证其中的数据与 table 的未来版本的架构兼容,也就是说,您可能无法轻松恢复它。
不要用已删除或历史版本污染您的主要table。这只会带来麻烦,并使查询变得极其缓慢。
Big Query 用于对海量数据集进行分析。
如果是这种情况 - 您可以忽略可能通过添加新的 update/delete 行和“保留”历史行而引入的缓慢。
在 BigQuery 中,使用 window function 获取行的最新版本非常简单。
例如,假设 "id" 是定义 record/row 的主键并且 "ts" 是时间戳
SELECT <fields list> FROM (
SELECT <fields list>, ROW_NUMBER() OVER(PARTITION BY id ORDER BY ts DESC) AS num
FROM YourTable
)
WHERE num = 1
如果您需要使用历史数据进行历史分析——我们开始吧——很容易做出代表当时相应行版本的选择。
如果您不需要历史版本,您可以定期进行清理——为此,最好让您的数据按天分区(或按月或任何更适合您的情况的分区方式)
BigQuery 对查询分区表有很好的支持 - Table wildcard functions
如果您想坚持使用 BigQuery – 这将是一个很好的方法
我确实建议多探索一下