我正在创建一个系统,使用SNMP以(可能)5分钟的间隔轮询设备以获取有关各种指标的数据,例如CPU利用率,磁盘利用率,温度等.最终目标是以时间序列图的形式为系统用户提供可视化.
我已经看过了,在过去使用的RRDTool,但拒绝了它作为存储捕获的数据无限地将我的项目很重要,我想更高层次和更灵活的访问捕获的数据.所以我的问题是:
什么是更好的关系数据库(如MySQL或PostgreSQL)或非关系数据库或NoSQL数据库(如MongoDB或Redis)在查询数据进行图形处理时的性能.
给定一个关系数据库,我将使用一个data_instances表,其中将存储为所有设备测量的每个度量捕获的每个数据实例,并包含以下字段:
领域: id fk_to_device fk_to_metric metric_value timestamp
当我想在特定设备上绘制特定指标的图形时,我必须查询此单个表,过滤掉其他设备,以及为此设备分析的其他指标:
SELECT metric_value, timestamp FROM data_instances
WHERE fk_to_device=1 AND fk_to_metric=2
Run Code Online (Sandbox Code Playgroud)
此表中的行数为:
d * m_d * f * t
Run Code Online (Sandbox Code Playgroud)
其中d是的数量的装置,m_d是累计度量的数目被记录为所有设备,f是频率在其中数据被轮询和t是总量时间系统已收集数据.
对于一年中每5分钟记录3个设备的10个度量标准的用户,我们将有不到500万条记录.
没有索引fk_to_device并且fk_to_metric扫描这个不断扩展的表将花费太多时间.因此,索引上述字段以及timestamp(用于创建具有本地化期间的图表)是必需的.
MongoDB具有集合的概念,与表不同,这些可以在没有设置的情况下以编程方式创建.有了这些,我可以为每个设备划分数据存储,甚至为每个设备记录每个指标.
我没有使用NoSQL的经验,也不知道它们是否提供任何查询性能增强功能,例如索引,但是前一段提出在数据存储在NoSQL下的结构中进行大多数传统的关系查询工作.
具有正确索引的关系解决方案是否会在一年内减少爬行?或者NoSQL方法的基于集合的结构(与我存储的数据的心智模型相匹配)是否提供了明显的好处?
database time-series non-relational-database relational-database nosql
给出以下星型模式表.
# geog_abb time_date amount value
#1: AL 2013-03-26 55.57 9113.3898
#2: CO 2011-06-28 19.25 9846.6468
#3: MI 2012-05-15 94.87 4762.5398
#4: SC 2013-01-22 29.84 649.7681
#5: ND 2014-12-03 37.05 6419.0224
Run Code Online (Sandbox Code Playgroud)
# geog_abb geog_name geog_division_name geog_region_name
#1: AK Alaska Pacific West
#2: AL Alabama East South Central South
#3: AR Arkansas West South Central South
#4: AZ Arizona Mountain West
#5: CA California Pacific West
Run Code Online (Sandbox Code Playgroud)
# time_date time_weekday time_week time_month time_month_name time_quarter time_quarter_name time_year
#1: 2010-01-01 Friday …Run Code Online (Sandbox Code Playgroud) data-modeling data-warehouse star-schema database-normalization data.cube
特别是我正在处理类型2 缓慢变化的维度,并且需要表示特定记录活动的时间间隔,即对于每个记录我有一个StartDate和一个EndDate.我的问题是关于是否使用闭合([StartDate,EndDate])或半开([StartDate,EndDate))间隔来表示这一点,即是否包括间隔中的最后日期.举一个具体的例子,说记录1从第1天到第5天是活跃的,从第6天开始记录2变得活跃.我是否将记录1的EndDate设为等于5或6?
最近我开始思考半开放区间最好基于Dijkstra:为什么编号应该从零开始,以及Python中的数组切片和range()函数的约定.在数据仓库上下文中应用它我会看到半开区间约定的优点如下:
因此,我倾向于采用半开区间法.然而,如果有一些广泛采用的使用闭区间方法的行业惯例,那么我可能会倾向于顺其自然,特别是如果它是基于实现这种系统的实际经验而不是我的抽象理论.
提前感谢任何见解或评论.
阅读CJDate数据库系统简介或类似水平书籍的人不应该对标准化和非规范化的定义有问题.
然而,记忆不像过去那样,我发现自己经常看一些设计并说它没有正常化,即使我找不到它正在破坏的正常形式.
说明它的实际例子是:
如果我们有关系
r1 (A, B, C) 和 r2 (A, D)
与FD:AB-> C和A-> D.
并且r1表示详细数据,同时r2是该数据的摘要(换言之,D的每个实例是r1中的值的函数.在该示例中,使其为根据来自r1的A的值C的小计).
示例实例
r1 =
A B C
1 1 10
1 2 20
2 1 10
2 2 25
r2 =
A D
1 30
2 35
Run Code Online (Sandbox Code Playgroud)
所以,即使我不能说它打破例如2NF或3NF,我似乎仍然坚持认为设计仍然在以下意义上非规范化(来自Codd,EF"数据库关系模型的进一步规范化") ,第34页,评论超过1NF的正常化原因):
- 从不受欢迎的插入,更新和删除依赖项中释放关系集合;
- 随着新型数据的引入,减少重建关系集合的需要,从而延长应用程序的使用寿命;
- 使关系模型对用户更具信息性;
- 使查询统计中的关系集合中立,这些统计信息随着时间的推移可能会发生变化.
我可以说,如果我们将D定义为来自r1的所有C的总和,其中来自r1的A等于来自r2的A,那么,如果我们在r1中更新C并且我们不在r2中更新D,我们可以最终由于不合适的更新依赖性并且数据最终处于不一致状态,我发现这个原因是将r1和r2称为非规范化并将它们视为非规范化.(事实上,整个r2是r1的函数,并将零个新事实带入模型; r2 = f(r1))
所以问题是
注意:
对于那些发现有趣的问题并给出答案的人,我请求提供可引用的内容或以特定的假设和结论形式(或者换句话说,如果你要去在你看来,请用一些推理跟着它).
编辑 我接受了dportas的回答.我将在这里尝试添加一点:CJDate可以做出明确而严格的区分:
许多设计理论都与减少冗余有关; 规范化减少了relvars中的冗余,正交性减少了relvars中的冗余.
并在下一页
正如未能一直正常化意味着冗余并且可能导致某些异常,因此也不能坚持正交性.
我在这个查询的另一个问题的答案中,在PerformanceDBA的声明中提出这个问题:
SELECT ProductId,
Description
FROM Product p,
ProductStatus ps
WHERE p.ProductId = ps.ProductId -- Join
AND StatusCode = 2 -- Request
AND DateTime = ( -- Current Status on the left ...
SELECT MAX(DateTime) -- Current Status row for outer Product
FROM ProductStatus ps_inner
WHERE p.ProductId = ps_inner.ProductId
)
Run Code Online (Sandbox Code Playgroud)
使用ProductStatus表只保存状态随时间变化的有效(开始)日期,将超过此查询:
SELECT ProductId,
Description
FROM Product p,
ProductStatus ps
WHERE p.ProductId = ps.ProductId -- Join
AND StatusCode = 2 -- Request
AND getdate() BETWEEN DateFrom AND Dateto …Run Code Online (Sandbox Code Playgroud) database ×2
data.cube ×1
nosql ×1
relational ×1
sql-server ×1
star-schema ×1
sybase ×1
theory ×1
time-series ×1