我正在进行涉及时间序列分析的项目,我需要能够让用户上传包含他们自己的时间序列的文件(即带日期的数字),例如在.csv文件中。然后可以随时访问其文件中包含的数据,以便在我们的系统中使用。
我怎么能这样做? 我想过的想法:
我一直在阅读这是一个不好的做法,有不同数量的表(我相信它)。但是我的情况与我在这个网站上看到的其他问题略有不同(大多数人似乎想为每个用户创建一个表,当他们应该为每个用户创建一行时)。
其他一些信息:
修改 阅读一些答案我意识到我可能没有完成我的工作,我应该说我显然已经在SQL环境中发展;我已经有了一个User表;当我写“桌子”时,我的意思是“关系”;我的所有4个想法都涉及外键;除非其他方面更好,否则RDBMS规范化就是范式。 (这一切并不意味着我反对非-sql解决方案)。
答案 0 :(得分:3)
我将不得不选择“大胖子怪物桌”。这就是关系数据库的工作方式,尽管你应该对其进行规范化(为用户创建一个表,为数据集创建另一个表,为数据点创建另一个表)。拥有相同模式的多个表从各个角度来看都是一个坏主意 - 设计,管理,安全性,甚至是查询;你确定你永远不想要合并来自两个数据集的信息吗?
如果您确定每个数据集都是完全隔离的,那么您可能还会考虑根本不使用SQL。 HDF(分层数据格式)字面为此目的而构建,有效存储和检索“科学数据集”,这些数据通常是时间序列数据。 HDF中的“表”字面上称为数据集,它们可以共享定义,它们可以是多维的(例如,当天的一个维度,时间的一个维度),并且它们比SQL表便宜得多。
我通常不会试图引导人们远离SQL,但是异常情况有时需要不寻常的解决方案。如果您要在SQL表(或更多)中以数十亿行结束并且您实际上没有要存储的其他数据,那么SQL可能不是适合您的解决方案。
答案 1 :(得分:2)
可能设计的示例T-SQL *:
CREATE TABLE dbo.Datasets (
ID int NOT NULL IDENTITY(1,1),
OwnerUserID int NOT NULL,
Loaded datetime NOT NULL,
CONSTRAINT FK_Datasets_Users
FOREIGN KEY ( OwnerUserID )
REFERENCES dbo.Users ( ID )
);
CREATE TABLE dbo.DatasetValues (
DatasetID int NOT NULL,
Date datetime NOT NULL,
Value int NOT NULL,
CONSTRAINT FK_DatasetValues_Datasets
FOREIGN KEY ( DatasetID )
REFERENCES dbo.Datasets ( ID )
);
设计模拟了您的问题中隐含的两个“实体” - 正在加载的时间序列数据和设置时间序列数据。
*对于SQL Server;我知道你说PostgreSQL 9.1,但我很确定你可以轻松翻译。
答案 2 :(得分:2)
你的想法都是完成任务的好方法(希望我能正确阅读)。
关系数据库怎么样?例如,具有用户名,上载时间和唯一数据ID的表,然后将dataid链接到包含dataid外键和原始文件数据的另一个表。这将使用户表保持最小(并且您可以将其与另一个表合并,例如包含用户详细信息)。有一个单独的表供用户使用,另一个用于密码,另一个用于电子邮件,然后另外5个用于数据可能是不好的做法,但我个人认为从用户数据中分离文件没有任何问题。
您使用什么语言处理数据?这也可能是一个决定性因素。
希望这会有所帮助:)
汤姆
答案 3 :(得分:2)
好的我认为选项2是最好的,创建额外的表只是一个维护的噩梦,让你容易受到如此多的错误等。选项4有点吸引人但我仍然认为数据库应该能够应对这种任务。
我想我会像这样构建我的表:
用户表 - 用户ID,名称等
行 - 上传数据中的每一行(rowid等)
RowInDataSet - 行ID,DataSetID
DataSet - DataSetID,上传日期,UploadBy等
这使您可以稍微分解数据并使其易于维护。如果正确索引这些表,则存储大量数据不应该是这样的问题。