平面文件作为输入 - MySQL 最佳实践

Posted

技术标签:

【中文标题】平面文件作为输入 - MySQL 最佳实践【英文标题】:Flat File as Input - MySQL Best Practice 【发布时间】:2018-04-24 18:57:32 【问题描述】:

我每天都会收到一个平面文件 (CSV),其中的内容会导入我的数据库(而不是通过网络表单、POS 等进行数据输入)。一条记录中有 40 个字段,我最多有 600,000 条唯一记录。

到目前为止,我还没有看到有必要将它变成一个关系数据库,尽管肯定有一些规范化可以提高它的效率;重复产品、商店、客户、经销商等。

如果我从头开始并以某种方式逐步输入数据,我会知道如何做所有这些(我经历过的每一个资源都以这种方式涵盖它,但当你有大量的数据已经并且需要使其相关)。并且随着 CVS 的到来,我不太确定一旦数据库建立起来如何导入数据。如果我要将这 40 个字段拆分为 5 个表,那么我是否必须以相同的方式拆分该每日文件并一次导入一个?外键会以这种方式更新吗?

如果有人能把我推向正确的方向,我会自己去挖掘更多的东西。

如果你面对同一个项目,你会如何创建这样一个数据库并执行每日更新?

谢谢!

【问题讨论】:

【参考方案1】:

创建独立于您现有的数据库结构(CSV 结构和数据)。例如。组织你的表格以适应你未来的需要,思考和定义它们之间的关系,应用适当的索引。

作为第二步——在我看来是不可避免的,用你自己的编程语言编写一个小程序。应该可以

主要从(CSV)文件中读取记录/行, 验证/清理获取的数据 根据需要导入/保存相应数据库表中的数据。 “根据需要”,我的意思是,随着时间的推移,可能会出现许多可能意外影响您的第一个数据库结构决策的因素。例如,需要一些时态表。此外,您应该受益于触发器和存储过程为您提供的优势。 正确处理导入过程中出现的错误和异常。例如,由于最终的“重复键”问题——因为文件中的数据容易出错,某些记录无法在某一天导入。这并不意味着导入应该中断。阅读记录,尝试保存。如果出现问题,请处理它(将该行复制到另一个文件中,或将其保存在一个特殊的表中,以供以后编辑/修订和重新导入)并让程序按照其进程处理下一个记录。 正确记录所有(主要)操作并维护读取和有问题记录的计数器。 在导入后自动将每个每日文件复制到备份目录中,直到不再需要为止。 最终通过电子邮件向您发送有关操作状态的信号。

第三步是找到一个解决方案来自动化整个周期。例如,找到一个任务/cron-jobs 管理器来每天启动您的程序,一天一次甚至两次,而无需您手动进行。

关于根据您的 ddatabase 结构将文件拆分为不同的文件:这不是必需的,例如这将是一个多余的步骤,因为您的程序应该设法读取文件并相应地处理数据导入。

就程序的类型而言:应该是网络解决方案,以便您可以随时访问和修改。

祝你好运。

【讨论】:

伟大的轮廓和我正在寻找的方向。谢谢 aendeerei!

以上是关于平面文件作为输入 - MySQL 最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

Automapper - 将多对多关联映射到平面对象的最佳实践

提供 MySQL JDBC 驱动程序密码的最佳实践

Windows 上的 MySQL 命名管道——更快的最佳实践,还是坏主意?

保留旧版本的 Git 最佳实践

在不同 mysql/mariadb 数据库上共享数据的最佳实践

MySQL中存储UUID的最佳实践