上传到数据库,然后验证或验证每一行,然后上传到数据库



我有一个要求,必须将文件上传到数据库。文件每天将有大约10万条记录,每月将有800万至1000万条记录。

此外,还需要进行一些字段级别的验证。

验证类似于:是否存在所有字段,数字字段是否包含有效数字,日期是否包含有效日期,数字是否在指定范围内,字符串格式是否匹配,等等。

有三种方法。

1: Upload to temp and then validate
- Create a temp table (all string columns), have extra error column
- upload all entries to temp table
- run validation, populate error column if needed
- move valid entries to correct table

缺点:条目必须在数据库中写两次,即使是正确的条目。

2: Upload to db directly
- upload all entries directly to table
- check which entries are not uploaded

缺点:即使在上传后也需要读取每一行,所以就像双重读取一样好

3: Validate and then Upload
- read each line, run all validations on all columns
- if valid then write to db

缺点:文件读取必须比大容量上传到数据库慢。

我正在编写应用程序:;ASP.NET,DB是Oracle。

三种方法中哪一种最好?

我选择选项2。

100k行对于批量和查询验证来说是微不足道的。

正如@aF所说,选项2,并添加以下内容:
添加一个可以将"无效"行转储到的表。然后,运行这样的语句:

INSERT INTO InvalidData
SELECT *
FROM InputData
WHERE restrictedColumn NOT IN ('A', 'B')
OR NOT IS_NUMERIC(numberColumn)  -- I'm assuming some version of SQL Server...

然后将"已验证"的行转储到实际表中,排除"无效"行:

INSERT INTO Destination
SELECT a.*
FROM InputData as a
EXCEPTION JOIN InvalidData as b
ON b.id = a.id

如果遇到任何(其他)"无效"数据,INSERT将失败,但应该是可发现的。然后可以对"无效"表进行清理并重新插入。

最新更新