当外部程序将多条记录写入一条记录时,如何规范化数据?
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
即可将联合查询结果存储在表中。将来自其他程序的导入与此查询组合在一个宏中。
显然,这并不理想。理想的解决方法是首先操纵外部程序以不对数据进行非规范化
【讨论】:
以上是关于当外部程序将多条记录写入一条记录时,如何规范化数据?的主要内容,如果未能解决你的问题,请参考以下文章