非规范化并减少四个数据库表之间多个关系的冗余

时间:2017-10-19 14:28:51

标签: database ms-access database-design relationship database-normalization

我帮助社会科学家分析他的研究成果。他记录了数百次采访和其他会议,并收集了相关文件。他已将此工作的数据输入到MS Access中的四个表中:

+---------+-----------+-----------------------------------------------------+
|  Table  |    Key    |                  Example contents                   |
+---------+-----------+-----------------------------------------------------+
| cases   | ID_Case   | Description, case data                              |
| persons | ID_Person | Name, contact data                                  |
| events  | ID_Event  | Date, time, location of interview, meeting, etc.    |
| files   | ID_File   | Path, filename, date of recordings, documents, etc. |
+---------+-----------+-----------------------------------------------------+

我们可以将这些称为" base"表。

为了表示这些表之间的关系,他首先尝试了一组六个表,这些表与他们的键上的原始四个表相关联:

+--------------+---------------------+
|    Table     |         Key         |
+--------------+---------------------+
| CasePersons  | ID_Case, ID_Person  |
| CaseEvents   | ID_Case, ID_Event   |
| CaseFiles    | ID_Case, ID_File    |
| EventPersons | ID_Event, ID_Person |
| EventFiles   | ID_Event, ID_File   |
| FilePersons  | ID_File, ID_Person  |
+--------------+---------------------+

我们可以称之为"二元关系"表。

示例场景(虚构)

这是一个虚构的场景,用于演示他的数据结构示例。该场景涉及三种情况,七个人,三个事件和五个文件。

让他们说他对人们的爱情生活进行了两次采访。一个是对四个人的采访:乔治,莎莉,亨利和艾略特。第二次采访是两个人,John和Liz。第一次采访录制在视频中,第二次采访录制在音频中。第一次采访的一部分进行了,并分别记录了Sally和Henry。虽然Liz在第二次面试时,她没有说话,所以不在录音中。在第一次采访中,George向Sally分享了一封情书,并将其扫描成pdf文件。最后,第三个事件是与同事的电话会议,这是关于技术,并没有讨论具体的案例。

来自这个想象场景的数据显示在下表中。在每个表的名称旁边,我给出了数据库中实际表中的记录数。

四个基本表

表[案例](386条记录)

+---------+---------------------------------+
| ID_Case |           Description           |
+---------+---------------------------------+
|       1 | A husband and wife are in love. |
|       2 | A man and woman are in love.    |
|       3 | A man has never been in love.   |
+---------+---------------------------------+

表[人物](1,472条记录)

+-----------+-----------+----------+
| ID_Person | NameFirst | NameLast |
+-----------+-----------+----------+
|         1 | George    | Brown    |
|         2 | Sally     | White    |
|         3 | Henry     | Green    |
|         4 | John      | Baker    |
|         5 | Liz       | Jones    |
|         6 | Elliot    | Brooks   |
|         7 | Catherine | Drake    |
+-----------+-----------+----------+

表[事件](526条记录)

+----------+------------+---------------+
| ID_Event |    Date    |   Location    |
+----------+------------+---------------+
|        1 | 2016 06 01 | 123 Main St.  |
|        2 | 2016 07 02 | 456 Block Rd. |
|        3 | 2016 08 03 | Phone         |
+----------+------------+---------------+

表[文件](1,748条记录)

+---------+---------------------------+------+
| ID_File |         Filename          | Type |
+---------+---------------------------+------+
|       1 | Brown, Brooks interview   | avi  |
|       2 | White, Green subinterview | avi  |
|       3 | Brown letter              | pdf  |
|       4 | Baker interview           | wav  |
|       5 | Drake meeting             | wav  |
+---------+---------------------------+------+

六个二元关系表

在二进制关系表的列表中,我用相关文本替换人员,事件和文件的键,以使其更易于阅读。 MS Access通过根据查询显示表字段来允许相同的行为。类似地,某些表中显示的角色是数字外键的文本显示,用于分隔允许角色的表。

表[CasePersons](720条记录)

+---------+-----------+---------------+
| ID_Case | ID_Person |     Role      |
+---------+-----------+---------------+
|       1 | George    | Husband       |
|       1 | Sally     | Wife          |
|       1 | Henry     | Wife's friend |
|       2 | John      | Boyfriend     |
|       2 | Liz       | Girlfriend    |
|       3 | Elliot    | Individual    |
+---------+-----------+---------------+

表[CaseEvents](299条记录)

+---------+------------+
| ID_Case |  ID_Event  |
+---------+------------+
|       1 | 2016 06 01 |
|       2 | 2016 07 02 |
|       3 | 2016 06 01 |
+---------+------------+

表[CaseFiles](301条记录)

+---------+---------------------------+
| ID_Case |          ID_File          |
+---------+---------------------------+
|       1 | Brown, Brooks interview   |
|       1 | White, Green subinterview |
|       1 | Brown letter              |
|       2 | Baker interview           |
|       3 | Brown, Brooks interview   |
+---------+---------------------------+

表[EventPersons](700条记录)

+------------+-----------+-------------+
|  ID_Event  | ID_Person |    Role     |
+------------+-----------+-------------+
| 2016 06 01 | George    | Interviewed |
| 2016 06 01 | Sally     | Interviewed |
| 2016 06 01 | Henry     | Interviewed |
| 2016 06 01 | Elliot    | Interviewed |
| 2016 07 02 | John      | Interviewed |
| 2016 07 02 | Liz       | Present     |
| 2016 08 03 | Catherine | Present     |
+------------+-----------+-------------+

表[EventFiles](1,490条记录)

+------------+---------------------------+-----------+
|  ID_Event  |          ID_File          |   Role    |
+------------+---------------------------+-----------+
| 2016 06 01 | Brown, Brooks interview   | Recording |
| 2016 06 01 | White, Green subinterview | Recording |
| 2016 06 01 | Brown letter              | Received  |
| 2016 07 02 | Baker interview           | Recording |
| 2016 08 03 | Drake meeting             | Recording |
+------------+---------------------------+-----------+

表[FilePersons](2,392条记录)

+---------------------------+-----------+-------------+
|          ID_File          | ID_Person |    Role     |
+---------------------------+-----------+-------------+
| Brown, Brooks interview   | George    | Interviewed |
| Brown, Brooks interview   | Sally     | Interviewed |
| Brown, Brooks interview   | Henry     | Interviewed |
| Brown, Brooks interview   | Elliot    | Interviewed |
| Brown letter              | George    | Writer      |
| Brown letter              | Sally     | Subject     |
| White, Green subinterview | Sally     | Interviewed |
| White, Green subinterview | Henry     | Interviewed |
| Baker interview           | John      | Interviewed |
| Drake meeting             | Catherine | Present     |
+---------------------------+-----------+-------------+

问题是在所有这些表中输入的数据中存在大量冗余。通过数百次访谈,通过输入一些错误的数据或忘记输入所有六个二元关系表中的所有数据,很容易出错。输入数据后,很难检查它们是否有错误。此外,冗余使得在数据中找到有意义的模式变得更加困难。

单一四向关系表

我一直试图帮助他弄清楚如何以更易于管理的方式表示这些数据。我一直在探索的一个想法是将六个二进制关系表组合成一个包含四个关键字段的表:ID_Case,ID_Person,ID_Event和ID_File。以上数据随后变为:

表[CasePersonEventFiles](???记录)

+---------+-----------+------------+---------------------------+-----------------+---------------+-------------+-------------+
| ID_Case | ID_Person |  ID_Event  |          ID_File          |     CP_Role     |    EP_Role    |   EF_Role   |   FP_Role   |
+---------+-----------+------------+---------------------------+-----------------+---------------+-------------+-------------+
|       1 | George    | 2016 06 01 | Brown, Brooks interview   | Husband         | Interviewed   | Recording   | Interviewed |
|       1 | Sally     | 2016 06 01 | Brown, Brooks interview   | Wife            | Interviewed   | * Recording | Interviewed |
|       1 | Henry     | 2016 06 01 | Brown, Brooks interview   | Wife's friend   | Interviewed   | * Recording | Interviewed |
|       1 | Sally     | 2016 06 01 | White, Green subinterview | * Wife          | * Interviewed | Recording   | Interviewed |
|       1 | Henry     | 2016 06 01 | White, Green subinterview | * Wife's friend | * Interviewed | * Recording | Interviewed |
|       1 | George    | 2016 06 01 | Brown letter              | * Husband       | * Interviewed | Received    | Writer      |
|       1 | Sally     | 2016 06 01 | Brown letter              | * Wife          | * Interviewed | * Received  | Subject     |
|       2 | John      | 2016 07 02 | Baker interview           | Boyfriend       | Interviewed   | Recording   | Interviewed |
|       2 | Liz       | 2016 07 02 | 0                         | Girlfriend      | Present       |             |             |
|       3 | Elliot    | 2016 06 01 | Brown, Brooks interview   | Individual      | Interviewed   | * Recording | Interviewed |
|       0 | Catherine | 2016 08 03 | Drake meeting             |                 | Present       | Recording   | Present     |
+---------+-----------+------------+---------------------------+-----------------+---------------+-------------+-------------+

显然,这更清洁,更紧凑。数据行的数量已从六个表中的36个减少到十一个中的一个。数据元素(非空单元格)数量的减少不那么引人注目,从100到85.相关数据非常接近,可以更容易地避免错误,或者查看存在的任何错误。

在此表中,使用零而不是空值,以便允许前四个字段形成主键,从而确保这四个字段的唯一性。例如,在字段名称中," CP_Role"表示"案例人员角色",即个人在案件中的角色。

冗余减少了,但没有消除。在这个例子中用星号标记了十三个与其他数据冗余的数据元素。这种冗余是对数据输入错误的有害邀请。但是,在此表中自动检查此类错误非常简单。

在此阶段实现此四向关系表的一个大问题是将数据从六个二进制表中折叠到其中。可以很容易地创建一个包含所有必要字段的表,然后将六个表的所有行附加到其中,其中缺少键的值为零。这使得组合了5,902条记录。如果上面示例场景中的数字可以推断为真实数据,则记录数量可以减少到大约1,800,这意味着可以删除超过4,000条记录!我目前正在研究组合表中的模式,寻求自动化合并和删除多余行组的方法。这是非常缓慢的。

比制作这张新表所花费的时间更糟糕的是,我并不完全相信结果将是数据的最佳表现形式。

问题

我错过了这种方法中的重要内容吗?是否有更智能的方式来管理这些数据集?数据库理论是否提供了表示这些关系的更好方法?

1 个答案:

答案 0 :(得分:0)

您可以在任何数据库书中找到如何构造数据库。例如我想出了:

enter image description here

接下来,我们需要一些数据输入表格。数据输入表单旨在接收案例数据并将其分类到适当的数据库表中。因此,数据输入者无需了解数据库的结构,而只需输入实际数据。很难找到有关为1对多对多表单制作数据输入表单的信息。这是链接:

create form to add records in multiple tables

这是我为此数据制作的数据输入表单和最终子表单: enter image description here

1对m关系的1边是形式,而m边是子形式。在这里,我将使用向导创建的文件/人表单拖动到了也使用向导创建的文件表单上。为了能够表示第二个1到m关系,我们用组合框替换了持有外键的表单上的文本框。此处ID_Person已替换为组合框,因此数据输入者不必了解有关ID_person的任何信息,而只需选择人员名称即可。 结果是数据输入者不需要了解数据库中基础关系的键,只需输入案例数据即可。