我正在使用写入Access的外部程序。该程序从电子表单中收集数据,并将提交表单中的所有数据写入Access数据库。但是,出现问题并导致许多问题并减慢数据库速度的问题是,当它写入我的数据库时,数据未正常化。
表单看起来像这样
Name: John Doe
DOb: April 1 1950
SIN: 123456789
Marital Status: Married
Phone: 123456789
Email: john@email.com
然后它使用Question作为字段名称并将输入的数据作为数据,将表单上的所有内容写为一条记录。像这样:
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
....等等。
作为一个菜鸟,到目前为止我所做的是使用union sql查询来操作数据,使其显示为:
Name|Date|Weather|Question1
Name|Date|Weather|Question2
Name|Date|Weather|Question3
Name|Date|Weather|QuestionN
我已经能够解决这个问题,但它严重减慢了我的数据库,现在我遇到了其他问题。
当外部程序写入这样的数据时,如何规范化这些数据?我无法操纵程序如何写入我的Access数据库。
答案 0 :(得分:3)
Access 2010有一个名为event-driven data macros的功能,与其他数据库系统中的触发器类似。我个人没有任何使用它们的经验,但看起来你应该能够创建一个 After Insert 宏,它将在插入新行时运行。在该宏中,您可以将问题分开并将它们插入到更加规范化的表格中(然后您可以用它来报告)。
答案 1 :(得分:1)
你正确地做了,联合查询确实是规范化非规范化表的正确方法。但是,除了非规范化之外,还应考虑将其归一化,这样您就可以实际处理数据,而无需每次要访问数据时Access执行100次查询。并考虑将名称|日期|天气拆分为不同的表格,因为每个问题要重复100次。
只需执行SELECT * INTO MyTable From UnionQuery
即可将联合查询结果存储在表中。将其他程序的导入与宏中的此查询相结合。
显然,这并不理想。理想的解决方法是操纵外部程序,使其不首先对数据进行非规范化