Database 数据库与程序设计

Database 数据库与程序设计,database,sqlite,database-design,Database,Sqlite,Database Design,我正在制作一个web应用程序,用于监控三个不同系统之间的文件移动,每个系统将生成以下格式的日志文件: Folder, Filename, DataTime, Filesize 要求是确定在System1生成的文件是否成功传输到3rd系统。并识别故障点 我使用的是SQLite数据库,因为我必须将失败的文件信息保存7天 数据库设计: 文件夹、文件名、日期时间、文件大小、文件源 FileSource可以是System1,System2,System3 这样我可以进行批量插入,但会减慢识别失败文件的速

我正在制作一个web应用程序,用于监控三个不同系统之间的文件移动,每个系统将生成以下格式的日志文件:

Folder, Filename, DataTime, Filesize
要求是确定在
System1
生成的文件是否成功传输到
3rd系统
。并识别故障点

我使用的是
SQLite
数据库,因为我必须将失败的文件信息保存7天

数据库设计:

文件夹、文件名、日期时间、文件大小、文件源

FileSource
可以是
System1
System2
System3

这样我可以进行批量插入,但会减慢识别失败文件的速度,有人能帮我编写好的SQL来识别失败文件吗

例如:样本数据

folder1, file1, 2012-29-08 23:01:02, 10, S1
folder1, file1, 2012-29-08 23:03:02, 10, S2
上述ex数据表示S2到S3之间folder1/file1传输失败


注意:每天将传输超过10000个文件。

我不确定您是否可以从这里到达那里。您最好从实际执行传输的程序中记录错误代码

您现在的表有一些问题

CREATE TABLE filelog (
  folder text, 
  filename text, 
  datatime timestamp, 
  filesize integer, 
  filesource text);

-- Your failed transfer . . .
INSERT INTO "filelog" VALUES('folder1','file1','2012-08-29 23:01:02',10,'S1');
INSERT INTO "filelog" VALUES('folder1','file1','2012-08-29 23:03:02',10,'S2');
-- . . . and a duplicate of it.
INSERT INTO "filelog" VALUES('folder1','file1','2012-08-29 23:01:02',10,'S1');
INSERT INTO "filelog" VALUES('folder1','file1','2012-08-29 23:03:02',10,'S2');
替换我的表名后,您的查询被删除

select folder, filename, count() 
from filelog group by folder, filename having count() < 3;
该主键约束将阻止您两次输入单个传输。它允许您每天多次传输同一文件,这在第一次传输失败时可能有意义

-- Your failed transfer . . .
INSERT INTO "filelog" VALUES('folder1','file1','2012-08-29 23:01:02',10,'S1');
INSERT INTO "filelog" VALUES('folder1','file1','2012-08-29 23:03:02',10,'S2');
-- . . . and an earlier transfer that also failed.
INSERT INTO "filelog" VALUES('folder1','file1','2012-08-23 23:01:02',10,'S1');
INSERT INTO "filelog" VALUES('folder1','file1','2012-08-23 23:03:02',10,'S2');
您的查询将再次不返回任何行。我们需要更好地定义成功和失败的转移

看来,成功的转让具有这些特点

  • 它包括所有三个源——S1、S2和S3
  • 它用于单个路径名,其中路径名表示文件夹+目录分隔符+文件名
  • 时间戳遵循文件源顺序。换句话说,S1的“数据时间”在S2的“数据时间”之前,S2的“数据时间”在S3的“数据时间”之前
  • 对于任何唯一的{文件夹、文件名、数据时间},所有三个文件源的字节数相同
还有一个大而麻烦的特点

  • 单个文件传输的所有三行必须属于一个“批”(因为缺少更好的词)。这意味着我们不能让查询将下面的前两行(失败的传输)与下面的最后一行(成功传输的一部分)组合在一起,即使时间戳的顺序正确,传输的字节也正确

    folder1  file1  2012-08-29 23:01:02  10  S1
    folder1  file1  2012-08-29 23:03:02  10  S2
    folder1  file1  2012-08-29 23:45:02  10  S1
    folder1  file1  2012-08-29 23:48:02  10  S2
    folder1  file1  2012-08-29 23:53:02  10  S3
    
这将有点复杂。我可能完全误解了你成功转会的标准


(你可能会为“数据时间”专栏想出一个更好的名字。)

你完全误解了我的想法

CREATE TABLE filelog (
   folder       text, 
   filename     text, 
   transferTime     timestamp, 
   filesize     integer, -- what time the transfer occurs at this filesource 
   filesource   text,
   primary key (folder, filename, filesource)
   );
每个源将生成一个日志文件,其中包括它们传输或处理的文件

案例: 如果在S1的日志文件中找到file1.txt,并且在S2的日志文件中丢失,则表示S1和S2之间的传输失败

如果在S1和S2日志文件中都找到file1.txt,而不在S3中,则S2和S3之间的日志文件传输失败,或者S3未处理该文件

通过此查询,我可以找到S2或S3中缺失的文件:

select folder, filename, filesource, count(*) 
from filelog 
group by folder, filename, filesource
having count() < 3;
选择文件夹、文件名、文件源、计数(*)
从文件日志
按文件夹、文件名、文件源分组
计数()小于3;
在回复您时,我得到了答案,如果计数为1,则表示在S1和S3传输失败, 或者,如果计数为2,则表示S2和S3之间的传输失败


谢谢你的回复@catcall

这不是家庭作业,我确实使用下面的SQL找到了丢失的文件
按文件夹从选项卡组中选择文件夹、文件名、计数(),文件名包含计数()<3;但要找到失败的位置,我必须对每个丢失的文件运行查询。这很公平,但如果你试图集中问题标题,然后找到真正的问题,它将帮助你得到一个好的答案。要求段落暗示这里可能有半打问题。不,我想我理解得很好。您似乎缺少的是——可能是因为它不可能发生,但可能是因为您不理解SQL——在许多合理的情况下,您的查询不会识别丢失的文件。在我的答案中搜索“先前也失败的传输”。一个路径名在S2和S3之间的两次传输失败,会留下4行。您的
按文件夹分组,filename having count()<3
不会返回这些失败,因为4不小于3。由于filesource包含为主键,因此确保仅包含文件夹的单个实例/file@filesource在任何给定时间都可用,失败的传输只需更新重新传输日期即可。我测试了一些样本数据,发现答案是准确的。在几分钟前编辑响应之前,文件源不是主键的一部分。很高兴你找到了解决办法。
select folder, filename, filesource, count(*) 
from filelog 
group by folder, filename, filesource
having count() < 3;