sql—将三维表存储在数据库中,其中一个维度随时间增加

s3fp2yjn  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(472)

我有一个三维数据集,我想存储用于网站:
公司名单(约1000家)
公司信息(约15件事)
时间(每月)
基本上,我想随着时间的推移跟踪这些信息并保持最新。
开始时,数据将为1000x15x1,一年后为1000x15x12,10年后为1000x15x120。
我想问的主要问题是:
随时获取一家公司的所有信息
获取特定时间的所有信息
什么样的数据库配置适合这样做?我对sql或nosql解决方案持开放态度。
为了以防万一,这个网站是在googleappengine上的。

wd2eg0qa

wd2eg0qa1#

从关系数据库模式设计的Angular 来看:
如果目标只是一般的分析/即席查询/olap,那么您可以使用非常适合这些分析类型的星型模式。但请注意,olap数据库是非规范化的,如果您计划在该数据库上同时执行这两种操作,则通常不适合于操作事务存储/oltp。
星图之美:
事实表通常都是数字的,这使得即使有太多的记录,表也非常小。小表意味着读取(i/o)非常快。
从事实表到维度表的所有联接都基于外键(单列、数字、可索引外键)
所有维度表都有代理项,即单列主键。单列主键更容易 JOIN 比多列主键更容易索引。
根本没有 NULL 在事实表的外键中。这使得 JOIN 操作简单,即始终 JOIN 事实表到它的所有维度表。如果你需要的话 NULL case,则需要将其作为特殊情况添加到维度表中。例如:如果一家公司没有在股票市场上市,而您跟踪的内容之一是股票价格,则输入0或0 NULL 将特殊情况添加到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万行也很容易查询。但是如果这是一个更大的分析系统的一部分,那么就使用星型模式

oyxsuwqo

oyxsuwqo2#

最简单的方法。
创建一个表,companyname+info,您需要存储+列作为年-月。
前任:
创建表 tablename (

id int(11) NOT NULL AUTO_INCREMENT,

companyname varchar(255) ,

info1 int(11) NOT NULL,

info2 datetime ,

info3 varchar(255) ,

info4 bool ,

yearmonth datetime,

主键(id));

查询

选择from tablename where companyname=“公司名称”;
选择
from tablename where yearmonth=“year month”#你可以在这之间用

相关问题