Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RDBMS(SQL)存储具有可变标签/额外列属性的时间序列?_Sql_Attributes_Time Series_Label_Rdbms - Fatal编程技术网

RDBMS(SQL)存储具有可变标签/额外列属性的时间序列?

RDBMS(SQL)存储具有可变标签/额外列属性的时间序列?,sql,attributes,time-series,label,rdbms,Sql,Attributes,Time Series,Label,Rdbms,我想为大小有限的结构化时间序列数据(大约6000个系列,50mb的数据)以不同的频率(每日、每月、每季度、每年的CY和每年的FY)建立一个RDBMS,并且我想在数据库上运行SQL查询(主要是按时间连接各种表)。数据库每月更新一次。该数据库中表的变量名是技术性的,信息量不大。原始数据的标签如下表所示(月表示例) 我开始在MySQL中设置它,并认为仅仅为表配备适当的时态标识符就可以提供我想要的连接功能。但是,我无法找到如何适当地存储变量标签。是否可以以某种方式向列添加属性?或者我可以将一个表链接到

我想为大小有限的结构化时间序列数据(大约6000个系列,50mb的数据)以不同的频率(每日、每月、每季度、每年的CY和每年的FY)建立一个RDBMS,并且我想在数据库上运行SQL查询(主要是按时间连接各种表)。数据库每月更新一次。该数据库中表的变量名是技术性的,信息量不大。原始数据的标签如下表所示(月表示例)

我开始在MySQL中设置它,并认为仅仅为表配备适当的时态标识符就可以提供我想要的连接功能。但是,我无法找到如何适当地存储变量标签。是否可以以某种方式向列添加属性?或者我可以将一个表链接到将标签映射到列名的表,这样它就可以在联接中携带了吗?或者我应该使用另一种数据库来设置它?(但数据库必须易于设置和托管,SQL是首选)。我很感激你的建议

更新: 我认为您可以向MySQL列和表添加注释,但这些注释似乎无法以标准方式查询或在联接中进行。是否可以从标准数据库连接器(如R语言的连接器)检索注释中的信息以及查询的数据?下面是以变量标签作为注释的表的DDL示例


-- Annual FY Table
CREATE TABLE IF NOT EXISTS BOU_MMI_AF (
   FY VARCHAR(7) COMMENT "Fiscal Year (July - June)",
   NFA DOUBLE COMMENT "Net Foreign Assets (NFA) (Shs billion)",
   NDA DOUBLE COMMENT "Net Domestic Assets (NDA) (Shs billion)",
   PRIMARY KEY (FY)
) COMMENT = "Annual FY";

-- Quarterly Table
CREATE TABLE IF NOT EXISTS BOU_FS (
   Year INT CHECK (Year >= 1800 AND Year < 2100) COMMENT "Year",
   Quarter VARCHAR(2) CHECK (Quarter IN ('Q1', 'Q2', 'Q3', 'Q4')) COMMENT "Quarter",
   FY VARCHAR(7) COMMENT "Fiscal Year (July - June)",
   QFY VARCHAR(2) CHECK (QFY IN ('Q1', 'Q2', 'Q3', 'Q4')) COMMENT "Quarter of Fiscal Year",
   KA_RC_RWA DOUBLE COMMENT "Capital Adequacy (%): Regulatory capital to risk-weighted assets",
   AQ_NPL_GL DOUBLE COMMENT "Asset quality (%): NPLs to total gross loans",
   EP_RA DOUBLE COMMENT "Earnings & profitability (%): Return on assets",
   L_BFA_TD DOUBLE COMMENT "Liquidity (%): Bank-funded advances to total deposits",
   MS_FX_T1CA DOUBLE COMMENT "Market Sensitivity (%): Forex exposure to regulatory tier 1 capital",
   PRIMARY KEY (Year, Quarter)
) COMMENT = "Quarterly";

-- Daily Table
CREATE TABLE IF NOT EXISTS BOU_I (
   Date DATE CHECK (Date >= '1800-01-01' AND Date < '2100-01-01') COMMENT "Date",
   Year INT CHECK (Year >= 1800 AND Year < 2100) COMMENT "Year",
   Quarter VARCHAR(2) CHECK (Quarter IN ('Q1', 'Q2', 'Q3', 'Q4')) COMMENT "Quarter",
   FY VARCHAR(7) COMMENT "Fiscal Year (July - June)",
   QFY VARCHAR(2) CHECK (QFY IN ('Q1', 'Q2', 'Q3', 'Q4')) COMMENT "Quarter of Fiscal Year",
   Month VARCHAR(9) CHECK (Month IN ('January' , 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December')) COMMENT "Month",
   Day INT CHECK (Day > 0 AND Day < 32) COMMENT "Day",
   I_Overnight DOUBLE COMMENT "Daily Interbank Money-Market Rates: Overnight  (%)",
   I_7day DOUBLE COMMENT "Daily Interbank Money-Market Rates: 7-day (%)",
   I_Overall DOUBLE COMMENT "Daily Interbank Money-Market Rates: Overall (%)",
   PRIMARY KEY (Date)
) COMMENT = "Daily";



使用诸如R或STATA之类的统计软件环境,使用MySQL连接器连接到数据库,我希望看到一个类似于图中所示的表,在该表中,我可以检索变量名称和作为注释存储在DDL中的标签。

我将以不同的方式构造数据。我会把你所有的尺寸放在一张桌子上,每行有一个尺寸。然后,我将添加一个日期表(这样您就可以获得每个度量日期的周/月/季度/年值)和一个保存每个度量代码标签的度量类型表

通过像这样标准化数据,我认为你有一个更灵活的设计,它将允许你做你想做的事情

这只是为了说明我的意思-它不是一个确定的设计:


所以我对@NickW的建议非常满意。作为参考,我在下面分享我的最终方案。关于这件事我还有一些问题。因此,我主要直接查询数据表(大约有700000个OB),并根据需要连接来自时间、序列和数据集表的信息。我注意到检索大量数据可能需要一些时间。所以我想知道:我是不是在优化索引

然后,有几个计算列:DATASOURCE中的Ndatasets列按数据集表中的源计算DSID的数量,DATASET中更新的列显示数据上次添加到特定数据集的时间。DS_From、DS_to和S_From、S_,S_给出给定数据集和序列的数据可用的最大时间范围。目前,我正在R中进行所有这些计算并插入数据。我想知道这些计算是否可以在MySQL中完成,以便有自我更新的列

感谢您对此发表进一步评论

DDL:

删除架构(如果存在TSDB);
如果TSDB不存在,则创建模式;
使用TSDB;
如果数据源不存在,则创建表(
源VARCHAR(120),
来源(200),
数据集INT不为空,
描述VARCHAR(3000)不为空,
访问VARCHAR(3000)不为空,
主键(源)
);
如果数据集不存在,则创建表(
DSID VARCHAR(30),--INT
数据集VARCHAR(120)不为空,
频率VARCHAR(9)非空检查(频率单位为(‘每日’、‘每月’、‘季度’、‘年度CY’、‘年度FY’)),
从日期检查开始的日期(从>='1800-01-01'开始的日期和从<'2100-01-01'开始的日期),
截止日期检查(截止日期>='1800-01-01'和截止日期<'2100-01-01'),
更新日期检查(更新日期>='1800-01-01'和更新日期<'2100-01-01'),
描述VARCHAR(3000)不为空,
源VARCHAR(120),--不为空
DS_Url VARCHAR(200),
主键(DSID),
外键(源)在更新级联上的删除级联上引用数据源(源)
);
在DATASOURCE(source)上创建索引idx_dataset_source;
如果序列不存在,则创建表(
DSID VARCHAR(30),--INT
序列VARCHAR(30)不为空,
标签VARCHAR(120)不为空,
S_起始日期检查(S_起始日期>='1800-01-01'和S_起始日期<'2100-01-01'),
S_至最新检查(S_至>='1800-01-01'和S_至<'2100-01-01'),
S_源VARCHAR(120),
S_Url VARCHAR(200),
主键(DSID,系列),
外键(DSID)在更新级联上的删除级联上引用数据集(DSID)
);
在序列(DSID)上创建索引idx_series_DSID;
如果时间不存在,则创建表(
日期唯一检查(日期>='1800-01-01'和日期<'2100-01-01'),
年份INT非空检查(年份>=1800,年份<2100),
季度整数非空检查(季度>=1,季度=1,QFY=1,月0,日<32),
主键(日期)
);
如果数据不存在,则创建表(
日期,
DSID VARCHAR(30),
系列VARCHAR(30),
值不为空,
主键(日期、DSID、系列),
外键(DSID)在更新级联上的删除级联上引用数据集(DSID),
外键(DSID,系列)在更新级联上的删除级联上引用系列(DSID,系列),
外键(日期)引用更新级联上删除级联上的时间(日期)
);
在数据(DSID)上创建索引idx_data_DSID;
在数据(DSID,系列)上创建索引idx_数据_系列;
在数据(日期)上创建索引idx_data_date;
EER图:

您好-请您用示例(最小可重复示例)清楚地描述一下您拥有什么以及您试图实现什么,因为(我)确实不清楚您在做什么。“变量”名称/标签是什么意思;你为什么要安排助教
SELECT * FROM BOU_I NATURAL JOIN BOU_FS NATURAL JOIN BOU_MMI_AF; 
DROP SCHEMA IF EXISTS TSDB;
CREATE SCHEMA IF NOT EXISTS TSDB;
USE TSDB;

CREATE TABLE IF NOT EXISTS DATASOURCE (
   Source VARCHAR(120),
   Source_Url VARCHAR(200),
   NDatasets INT NOT NULL, 
   Desription VARCHAR(3000) NOT NULL,
   Access VARCHAR(3000) NOT NULL,
   PRIMARY KEY (Source)
);

CREATE TABLE IF NOT EXISTS DATASET (
   DSID VARCHAR(30), -- INT
   Dataset VARCHAR(120) NOT NULL,
   Frequency VARCHAR(9) NOT NULL CHECK (Frequency IN ('Daily' , 'Monthly', 'Quarterly', 'Annual CY', 'Annual FY')),
   DS_From DATE CHECK (DS_From >= '1800-01-01' AND DS_From < '2100-01-01'), 
   DS_To DATE CHECK (DS_To >= '1800-01-01' AND DS_To < '2100-01-01'), 
   Updated DATE CHECK (Updated >= '1800-01-01' AND Updated < '2100-01-01'), 
   Desription VARCHAR(3000) NOT NULL,
   Source VARCHAR(120), -- NOT NULL
   DS_Url VARCHAR(200),
   PRIMARY KEY (DSID),
   FOREIGN KEY (Source) REFERENCES DATASOURCE (Source) ON DELETE CASCADE ON UPDATE CASCADE
);

CREATE INDEX idx_dataset_source ON DATASOURCE (Source); 

CREATE TABLE IF NOT EXISTS SERIES (
   DSID VARCHAR(30), -- INT
   Series VARCHAR(30) NOT NULL,
   Label VARCHAR(120) NOT NULL,
   S_From DATE CHECK (S_From >= '1800-01-01' AND S_From < '2100-01-01'), 
   S_To DATE CHECK (S_To >= '1800-01-01' AND S_To < '2100-01-01'), 
   S_Source VARCHAR(120),
   S_Url VARCHAR(200),
   PRIMARY KEY (DSID, Series),
   FOREIGN KEY (DSID) REFERENCES DATASET (DSID) ON DELETE CASCADE ON UPDATE CASCADE
);

CREATE INDEX idx_series_DSID ON SERIES (DSID); 

CREATE TABLE IF NOT EXISTS TIME (
    Date DATE UNIQUE CHECK (Date >= '1800-01-01' AND Date < '2100-01-01'),
    Year INT NOT NULL CHECK (Year >= 1800 AND Year < 2100),
    Quarter INT NOT NULL CHECK (Quarter >= 1 AND  Quarter <= 4), 
    FY CHAR(7) NOT NULL,
    QFY INT NOT NULL CHECK (QFY >= 1 AND  QFY <= 4), 
    Month INT NOT NULL CHECK (Month >= 1 AND  Month <= 12), 
    Day INT NOT NULL CHECK (Day > 0 AND Day < 32),
    PRIMARY KEY (Date)
);

CREATE TABLE IF NOT EXISTS DATA (
   Date DATE, 
   DSID VARCHAR(30), 
   Series VARCHAR(30),
   Value DOUBLE NOT NULL,
   PRIMARY KEY (Date, DSID, Series),
   FOREIGN KEY (DSID) REFERENCES DATASET (DSID) ON DELETE CASCADE ON UPDATE CASCADE,
   FOREIGN KEY (DSID, Series) REFERENCES SERIES (DSID, Series) ON DELETE CASCADE ON UPDATE CASCADE,
   FOREIGN KEY (Date) REFERENCES TIME (Date) ON DELETE CASCADE ON UPDATE CASCADE
);

CREATE INDEX idx_data_DSID ON DATA (DSID); 
CREATE INDEX idx_data_series ON DATA (DSID, Series); 
CREATE INDEX idx_data_date ON DATA (Date);