我有一个三维数据集,我想存储用于网站:
公司名单(约1000家)
公司信息(约15件事)
时间(每月)
基本上,我想随着时间的推移跟踪这些信息并保持最新。
开始时,数据将为1000x15x1,一年后为1000x15x12,10年后为1000x15x120。
我想问的主要问题是:
随时获取一家公司的所有信息
获取特定时间的所有信息
什么样的数据库配置适合这样做?我对sql或nosql解决方案持开放态度。
为了以防万一,这个网站是在googleappengine上的。
我有一个三维数据集,我想存储用于网站:
公司名单(约1000家)
公司信息(约15件事)
时间(每月)
基本上,我想随着时间的推移跟踪这些信息并保持最新。
开始时,数据将为1000x15x1,一年后为1000x15x12,10年后为1000x15x120。
我想问的主要问题是:
随时获取一家公司的所有信息
获取特定时间的所有信息
什么样的数据库配置适合这样做?我对sql或nosql解决方案持开放态度。
为了以防万一,这个网站是在googleappengine上的。
2条答案
按热度按时间wd2eg0qa1#
从关系数据库模式设计的Angular 来看:
如果目标只是一般的分析/即席查询/olap,那么您可以使用非常适合这些分析类型的星型模式。但请注意,olap数据库是非规范化的,如果您计划在该数据库上同时执行这两种操作,则通常不适合于操作事务存储/oltp。
星图之美:
事实表通常都是数字的,这使得即使有太多的记录,表也非常小。小表意味着读取(i/o)非常快。
从事实表到维度表的所有联接都基于外键(单列、数字、可索引外键)
所有维度表都有代理项,即单列主键。单列主键更容易
JOIN
比多列主键更容易索引。根本没有
NULL
在事实表的外键中。这使得JOIN
操作简单,即始终JOIN
事实表到它的所有维度表。如果你需要的话NULL
case,则需要将其作为特殊情况添加到维度表中。例如:如果一家公司没有在股票市场上市,而您跟踪的内容之一是股票价格,则输入0或0NULL
将特殊情况添加到stocksymbols维度表“private company”中,并将此特殊情况的外键作为外键添加到事实表中。几乎所有的过滤都是通过比事实表小得多的维度表来完成的。这需要有一个日期维度,以便能够执行基于日期的查询。
如果你能保持纯粹的星型模式,那么你所有的
JOIN
s是单跳(即两个表之间没有通过另一个表的连接)。所有这些使
JOIN
操作非常快速、简单和直接。这就是为什么星型模式是数据仓库设计的核心。https://en.wikipedia.org/wiki/star_schemahttpshttp://en.wikipedia.org/wiki/data\u仓库
在此基础上的一个级别是olap(例如ssas-sqlserver-analysiss-services),它对数据进行预处理,以加快查询速度,但它比纯启动模式需要更多的学习,在您的情况下,这是一种过度的做法
以你为例
在星型模式中,
公司将是一个维度表
您将需要月维度表。它是日期维度的简化版本,仅用于月份信息。这里是日期维度的一个例子。
https://www.codeproject.com/articles/647950/create-and-populate-date-dimension-for-data-wareho
关于公司的信息(你说的15件事)将是事实表。事实必须是数字(b/c理想情况下,所有非数字值都保存在维度表中)。这意味着将事实的非数字部分带到维度表中。例如:如果您正在保留revenue并且也希望保留货币类型,那么您将需要一个货币维度,并且只保存事实表中的金额和货币维度表的外键。
如果有任何非数字事实,则需要在维度表中存储distinct列表,并将外键添加到事实表中的维度表中(这称为无事实事实表)。唯一的例外是,如果维度和事实表的基数非常相似,那么您可以直接将非数字事实值存储在事实表中,因为拥有维度表没有好处(实际上是缺点)。
事实也可以按其粒度分组。例如,您可以拥有company\u monthly\u summary事实表,并在该表中保留多个事实(这些事实都连接到company维度和month维度)。这一切都取决于你想如何分组事实表。但是,如果它们的粒度不同,就不应该对它们进行分组,因为这样会导致稀疏的事实表,并且更难查询。
您将在事实表中使用外键来联接到维度表
为维度表最常用的列添加索引
向维度添加数字代理项。它通常是一个自动递增的数字,但这取决于你。对于date维度的代理键,人们更喜欢的一个例外是使用格式yyyymmdd(作为整数)。这样做更容易
WHERE
子句:也就是说,您不必过滤日期列(一个datetime值),它将执行搜索以查找代理项,而只需直接提供代理项,b/c您知道格式。根据您的业务领域,您可能需要考虑和使用其他类似的有用代理密钥模式。但是要知道,如果业务域发生变化,您必须更新所有事实记录。简单的自动递增代理键没有这个问题。在您的情况下,月份的代理键可以是实际的月份号(1代表一月)也就是说,即使没有星型模式设计(有适当的索引和数据库维护),5年内100万行也很容易查询。但是如果这是一个更大的分析系统的一部分,那么就使用星型模式
oyxsuwqo2#
最简单的方法。
创建一个表,companyname+info,您需要存储+列作为年-月。
前任:
创建表
tablename
(主键(id));
查询
选择from tablename where companyname=“公司名称”;
选择from tablename where yearmonth=“year month”#你可以在这之间用