当外部程序将多条记录写入一条记录时,如何规范化数据?

Posted

技术标签:

【中文标题】当外部程序将多条记录写入一条记录时,如何规范化数据?【英文标题】:How do I normalize data when an external program writes several records into one record? 【发布时间】:2017-04-18 12:45:33 【问题描述】:

我正在使用写入 Access 的外部程序。该程序从电子表格中收集数据,并将提交表格中的所有数据写入我的 Access 数据库。但是,已经出现并导致很多问题并使我们的数据库变慢的问题是,当它写入我的数据库时,数据没有被规范化。

表单看起来像这样

Name: John Doe
DOb: April 1 1950
SIN: 123456789
Marital Status: Married
Phone: 123456789
Email: john@email.com

然后它将表单上的所有内容作为一条记录写入,使用问题作为字段名称,输入的数据作为数据。像这样:

Name    | DOB          |  SIN     | Marital_Status | Phone    | Email
John Doe| April 11 1950| 123456789| Married      | 123456789| john@email.com

看到这里的示例表单并不是什么大问题,但是,我们有大约 100 个问题的表单,我们最终得到一个包含以下字段的表格:

Name|Date|Weather|Question1|Question2|Question3|Question4|...|Question100

....等等。

作为一个菜鸟,到目前为止,我所做的是使用联合 sql 查询来操作数据,使其显示为:

Name|Date|Weather|Question1
Name|Date|Weather|Question2
Name|Date|Weather|Question3
Name|Date|Weather|QuestionN

我已经能够解决这个问题,但它严重降低了我的数据库速度,现在我遇到了其他问题。

当外部程序这样写入数据时,如何规范化这些数据?我无法控制程序如何写入我的 Access 数据库。

【问题讨论】:

【参考方案1】:

Access 2010 有一个名为event-driven data macros 的功能,类似于其他数据库系统中的触发器。我个人没有任何使用它们的经验,但看起来您应该能够创建一个 After Insert 宏,该宏将在插入新行时运行。在该宏中,您可以拆分您的问题并将它们插入到更规范化的表格中(然后您将使用该表格进行报告)。

【讨论】:

可能比我的解决方案更好。请注意,由于它是一个外部应用程序,它与数据库的接口必须支持事件驱动的数据宏(据我所知,ODBC 支持) 这是真的吗?为什么数据如何到达那里很重要? 因为接口必须触发宏(通常没有问题,除非程序使用自己的数据库引擎,如UCanAccess),并且必须能够处理运行宏所需的所有操作(没有如果宏只使用数据库引擎会出现问题,但如果宏依赖于用户定义的函数则会出现问题)。查看此帖子:pcreview.co.uk/threads/… 以获取导致问题的示例。 在这种情况下不需要调用 VBA 函数或做任何太花哨的事情。【参考方案2】:

您做得对,联合查询确实是规范化非规范化表的正确方法。但是,除了非规范化之外,还可以考虑对其进行规范化存储,这样您就可以实际处理数据,而无需在每次您想要访问数据时让 Access 执行 100 次查询。并考虑将 Name|Date|Weather 拆分到不同的表中,因为每个问题要重复 100 次。

您只需执行SELECT * INTO MyTable From UnionQuery 即可将联合查询结果存储在表中。将来自其他程序的导入与此查询组合在一个宏中。

显然,这并不理想。理想的解决方法是首先操纵外部程序以不对数据进行非规范化

【讨论】:

以上是关于当外部程序将多条记录写入一条记录时,如何规范化数据?的主要内容,如果未能解决你的问题,请参考以下文章

oracle中如何将一条记录拆分为多条记录

将MYSQL某一数据库中的多条记录批量插入到另一MYSQL数据库时,记录不存在则插入,存在则更新

如何使用行号将多条记录合并为一条?

oracle 如何返回多条记录

Oracle通过一个字段的值将一条记录拆分为多条记录

SQL 如何将一个表中的两条或多条拥有相同ID的记录合并为一条?