【发布时间】:2019-06-14 21:03:43
【问题描述】:
我想将时间序列数据存储在数据库中。数据将按如下方式组织:
- 标题表包含有关数据集的信息(格式、来源等)。通常,一个数据集大约有 600 行。
- “大数据”表包含实际的数据行。每行都有一个 header_id、时间戳和一些数据点。
我正在尝试在 data_header_id 列而不是 id 列上创建具有聚集索引的表。这样我就可以通过简单的SELECT * FROM big_datums WHERE data_header_id = 9001 ORDER BY timestamp ASC 获取所有数据点。
我有以下代码,但由于 Rails 的默认设置而出错:
class CreateBigData < ActiveRecord::Migration[5.2]
def up
create_table :headers do |t|
t.string :data_format
t.timestamps
end
create_table :big_datums do |t|
t.references :data_header, null: false # This will need to be a CLUSTED index
t.integer :timestamp
t.integer :point1
t.integer :point2
end
execute "CREATE CLUSTERED INDEX [data-header-index] ON [dbo].[big_datums] ( [data_header_id] ASC )
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF,
ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]"
end
end
def down
execute "DROP INDEX [data-header-index] ON [dbo].[big_datums] WITH ( ONLINE = OFF )"
drop_table :big_datums
drop_table :headers
end
end
我收到此错误:
ActiveRecord::StatementInvalid: TinyTds::Error: 无法在表 'dbo.big_datums' 上创建多个聚集索引。在创建另一个之前删除现有的聚集索引 'PK__build_te__3213E83F6568EFB2'。
这似乎是因为 rails 已经为 id 提供了一个集群 PK。
问题:
1) 如何按照说明创建表格?
2) 我还需要一个“id”列吗?我永远不会通过 ID 列进行查询,但拥有一个 PK 列来唯一标识记录可能仍然很好——尤其是因为 header_id + timestamp 可能不是一个好的集群 PK
【问题讨论】:
标签: sql ruby-on-rails sql-server