Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 存储活动/非活动时间戳_Sql_Ruby On Rails_Ruby_Json_Postgresql - Fatal编程技术网

Sql 存储活动/非活动时间戳

Sql 存储活动/非活动时间戳,sql,ruby-on-rails,ruby,json,postgresql,Sql,Ruby On Rails,Ruby,Json,Postgresql,我正在运行一个带有PostgreSQL后端的ruby on Rails应用程序,我想知道存储一系列时间戳的标准方法是什么。情况是,我有一个带有布尔status属性的模型。我需要跟踪此属性更改的日期/时间,因为我需要跟踪status设置为true的时间段。我对这类问题的经验严重不足,我不确定以可伸缩的方式做这类事情的最佳实践是什么。我考虑过的两种方法是: 1) JSONIzing文本。我正在考虑采用一个如下所示的数组: [ { start: "20150131103045",

我正在运行一个带有PostgreSQL后端的ruby on Rails应用程序,我想知道存储一系列时间戳的标准方法是什么。情况是,我有一个带有布尔
status
属性的模型。我需要跟踪此属性更改的日期/时间,因为我需要跟踪
status
设置为
true
的时间段。我对这类问题的经验严重不足,我不确定以可伸缩的方式做这类事情的最佳实践是什么。我考虑过的两种方法是:

1) JSONIzing文本。我正在考虑采用一个如下所示的数组:

[
  { 
      start: "20150131103045",
      end: "20150228103045"
  },
  { 
      start: "20150531103045",
      end: "20150628103045"
  },
]
然后,我将JSONify这个数组并将其存储在
text
列中

2) 创建一个单独的表,其中包含
model\u id
status
time\u recorded
属性列,然后每次更新模型的
status
属性时只需创建一个条目

以下哪种方法更合理?这里需要考虑的是,这些数据可能不会很频繁地被读取——95%的时间,它将仅仅是写入数据库的新数据。p> 选项1)对我来说似乎不那么严厉,但在需要时阅读数据并对其进行排序也会带来更大的痛苦。选项2)将以一种更易于使用的方式存储该数据,并且不需要读取/更新预先存在的数据,但表可能会变得非常大、非常快。更重要的是,我必须在我的应用程序中使用多个模型来实现这一点,因此从一开始就匆忙做出决定并实施一个糟糕的体系结构可能会让以后的处理变得相当烦人


这两种方法的优缺点是什么?这两种方法中的一种显然比另一种更好吗?还是有其他更好的选择我没有想到?

选择1:

您必须考虑在行中进行更新时,后台PGRESs将在后台创建另一个版本,其中的新数据在该表中进行标记,并且在该表中进行真空时标记旧行。如您所见,这将导致大量“真空工作”(将其理解为高磁盘/IO工作)。如果行的数据不适合单个数据页,则情况更糟。在这种情况下,还有一张“烤面包”桌子也需要吸尘


选项2:

在我看来,这是更好的方法,因为一旦插入行,您将永远不会更新它。而且数据看起来足够小,可以容纳单个数据页(不需要toast表)。如果使用正确的索引,则不会出现性能问题。博士后可以轻松处理数百万条记录

此外,您还可以使用该技术。如果您的表有数以十亿计的历史记录,您可以将其“拆分”为几个其他表(例如,每月一个),其中每个表的索引将非常小,并且运行速度非常快。所有操作都是在后台完成的,因此您的应用程序将只看到“主”表,Postgres将自动处理所有其他拼接表

如果您需要以JSON格式检索数据,也很容易。您只需创建一个视图(或一个函数,如果您愿意),其中包含“开始/结束”时间的列将以JSON数组格式装载(使用postgres 9.3及更高版本)