【问题标题】:MySQL database design for a data set with variable amount of columns具有可变列数的数据集的 MySQL 数据库设计
【发布时间】:2012-12-19 14:27:36
【问题描述】:

我拥有的是大约 130GB 的数千个金融工具订单簿的时变状态数据。

我拥有的 csv 文件在订单簿状态的每次更改中都包含一行(由于执行的交易、插入的订单等)。状态被描述为:一般订单簿信息的几个字段(例如工具的 isin 代码),有关状态变化的一些信息字段(例如 orderType,时间),最后是当前状态的买入和卖出水平。卖出和买入订单最多有 20 个级别(买入级别 1 代表最佳买入价,卖出级别 1 代表最佳卖出价等),每个级别包含 3 个字段(价格、总成交量和订单金额)。最后,对于买方和卖方,还有 3 个超过 20 级别的聚合数据字段。这相当于每个州最多 21*2*3 = 126 个级别数据字段。

问题在于,由于几乎不存在接近 20 个级别的任何地方,因此为每个级别保留字段似乎没有意义。例如。我会有一行有 3 个买入级别,其余字段为空。另一方面,同一订单簿可能在片刻后有 7 个买入级别。

我肯定会将一般订单信息标准化到它自己的表中,但我不知道如何有效地处理级别。

任何帮助将不胜感激。

【问题讨论】:

  • 也许您应该看看其他非关系数据库系统,例如 CouchDB 或 MongoDB。它们都不像 MySQL 那样严格,因为您可以在“表”的每条记录中定义不同的字段。
  • 似乎您可以将“级别”放在单独的表中,然后加入并排序以获得第一个、第二个等。如果您需要将它们全部显示在一行中进行选择,您将使用一系列 ifnull() 子句。
  • @mvillaress:这已经超出了我的想法,但是由于我现有的系统、数据(在 MySQL 数据库中)和技能/知识,如果我只能在 MySQL 中执行此操作会更方便它以某种方式工作。
  • @ethrbunny:我不确定我是否理解您的建议。我看到用于帮助解决不必要字段问题的级别的单独表的唯一方法是源数据中是否有一个表/行,因为所需字段的数量因订单簿而异,并且随着时间的推移对于单个订单簿。

标签: mysql


【解决方案1】:

我不得不在某个时间点准确地处理这种数据结构。一个重要的问题是如何使用数据。如果您只是在任何给定时间寻找最佳出价和要价,那么水平并没有太大区别。如果您正在分析市场深度,那么水平可能很重要。

对于您正在使用的数据量,索引和分区等其他考虑因素可能更为重要。如果特定查询所需的数据适合内存,那么整个表有多大都没有关系。

我的建议是将不同级别保持在同一记录中。然后,您可以使用页面压缩(取决于您的存储引擎)来消除为空值保留的大部分空间。 SQL Server 会自动执行此操作,因此将级别放在单个记录中是很容易的。

如果页面压缩不起作用,一个折衷的解决方案是存储固定数量的级别。通常会填充五个级别,因此您不会遇到在空白字段上浪费空间的问题。而且,这个级别的数量可能足以满足几乎所有用途。

【讨论】:

  • 数据将用于研究目的。起初我们主要对最佳买/卖感兴趣,但市场深度分析会及时跟进,所以我想从一开始就正确地做到这一点。查询可能主要是关于获取特定时间窗口的一组级别,并且可以在需要时针对不同用途进行索引。我无法限制最大级别数量,但是您写的有关页面压缩的内容对我来说是个好消息。现在只需要选择最能做到这一点的引擎。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-20
相关资源
最近更新 更多