我知道我的问题似乎可以通过RDBMS模型更好地解决。但我真的想使用MongoDB进行部署,因为我将来可能会在每条记录上添加不规则的字段,并希望练习NoSQL数据库技能。
一家供应商提供的市盈率和市盈率数据:
| Vendor5_ID| PE| PB|date |
|----------:|----:|-----:|:----------|
| 210| 3.90| 2.620|2017-08-22 |
| 210| 3.90| 2.875|2017-08-22 |
| 228| 3.85| 2.320|2017-08-22 |
| 214| 3.08| 3.215|2017-08-22 |
| 187| 3.15| 3.440|2017-08-22 |
| 181| 2.76| 3.460|2017-08-22 |
其他供应商提供的价格数据和分析师报道
|Symbol | Price| Analyst|date |
|:------|-----:|-------:|:----------|
|AAPL | 160| 6|2017-08-22 |
|MSFT | 160| 6|2017-08-22 |
|GOOG | 108| 4|2017-08-22 |
我有密钥转换数据:
| uniqueID|Symbol |from |to |
|--------:|:------|:----------|:----------|
| 1|AAPL |2016-01-10 |2017-08-22 |
| 2|MSFT |2016-01-10 |2017-08-22 |
| 3|GOOG |2016-01-10 |2017-08-22 |
| uniqueID| Vendor5_ID|from |to |
|--------:|----------:|:----------|:----------|
| 1| 210|2016-01-10 |2017-08-22 |
| 2| 228|2016-01-10 |2017-08-22 |
| 3| 214|2016-01-10 |2017-08-22 |
我想快速执行时间范围查询。我想出了将每个列存储为集合的想法
db.PE:
{
_id,
uniqueID,
Vendor5_ID,
value,
date
}
db.PB:
{
_id,
uniqueID,
Vendor5_ID,
value,
date
}
db.Price:
{
_id,
uniqueID,
Symbol,
value,
date
}
db.Analyst:
{
_id,
uniqueID,
Symbol,
value,
date
}
这是一个很好的解决方案吗?如果不同供应商要添加更多数据,您认为哪种模式最好?
答案 0 :(得分:0)
我会考虑使用嵌套表或子表方法。我不确定mongo对这种支持的支持程度。我会考虑将Oracle NoSQL数据库用于此用例,嵌套表支持TTL和更高的吞吐量(因为BDB作为存储引擎)。使用嵌套表,您可以在子/嵌套表中存储带有时间戳的PE和PB,而父表继续保存符号/ vendor_id和任何其他详细信息。这将确保您的查询在同一个分片上,将它们放在不同的集合中将不会保证相同的分片。