SQL规范化数据表并创建多个表

时间:2019-02-13 21:28:09

标签: sql ms-access

我从一个已决定使用SQL通过Access处理的系统中收到2个报告。一个报告称为“评估”,另一个报告称为“骗局”。目前,“ Con”表尚未标准化。有称为“用户”和“用户角色”的字段,我想使用的PK为“ CO_ID”。对于“ CO_ID”的每个实例,都有多个不同的“用户角色”和“用户”。但是,“用户角色”仅限于6个选择。但是,每个“ CO_ID”的一个角色可能有多个用户。这将导致多个具有相同“ CO_ID”相关数据的行。

这两个报告的生成方式完全相同,因此每次的过程都将完全相同。

我需要创建一个表,其中包含“ CO_ID”和其他与“ CO_ID”相同的字段。

自动化此表标准化的最佳方法是什么?

我试图使用SQL解析数据,但是找不到一个好的方法。我想是这样的:

SELECT DISTINCT CO_ID, [EVERY OTHER FIELD IS THE SAME FOR CO_ID]
FROM table1;

SELECT DISTINCT User_Role
FROM table1;

SELECT DISTINCT User
FROM table1;

SELECT DISTINCT CO_ID, User_Role, User

第一个SQL命令将创建一个唯一的CO_ID列表,第二个SQL命令将为User_Role创建一个查找表,第三个SQL命令将为User创建一个查找表,最后一个将CO_ID与User_Role和User相关联。但是,我不确定如何为所有表创建主键以将它们关联在一起。这也许也不是最好的方法,所以我愿意接受想法。

table1 = Con

CO_ID  Field1  Field2   User_Role   User
WA13    ABS 2019-02-13  Admin      User1
WA13    ABS 2019-02-13  Manager    User2
WA14    DB  2019-01-01  Secretary  User3
WA14    DB  2019-01-01  Manager    User2
WA14    DB  2019-01-01  Analyst    User4
WA14    DB  2019-01-01  Analyst    User5
WD15    ZZ  2018-11-20  Supervisor User6
WD15    ZZ  2018-11-20  Manager    User7
WD15    ZZ  2018-11-20  Admin      User8
WD15    ZZ  2018-11-20  Analyst    User9

我希望结果是什么 结果表

CO_ID   Field1  Field2
WA13    ABS   2019-02-13
WA14    DB    2019-01-01
WD15    ZZ    2018-11-20

User_Role
Admin
Manager
Secretary
Analyst
Supervisor

User
User1
User2
User3
User4
User5
User6
User7
User8
User9

1 个答案:

答案 0 :(得分:1)

您在用户和角色之间具有一对多的关系,因为一个用户可以有多个角色,并且一个角色可以分配给多个用户。这种一对多关系需要用户和角色之间的链接表。此外,您正在为每个用户/角色关系分配一个“骗局”。

role               user_role                user
+------------+     +----------------+       +------------+
| PK role_id |<----| PK, FK role_id |   /-->| PK user_id |
+------------+     | PK, FK user_id |--/    +------------+
|    name    |     +----------------+       |    name    |
|            |     |     FK co_id   |       |            |
|            |     +----------------+       |            |
|            |                |             |            |
|            |                |             |            |
|            |      co        v             |            |
+------------+     +----------------+       +------------+
                   | PK co_id       |
                   +----------------+
                   |    field1      |
                   |    field2      |
                   +----------------+

因此,在链接表中,您有一个由role_iduser_id组成的复合主键,因为每个用户/角色关系都是唯一的。此外,还有co_id作为附加信息。

roleuserco都位于关系的1边。 user_role在所有关系的n端。

或者,也可以在用户表中使用FK co_id。这取决于“ co”或“ con”代表什么。没有更多背景知识就很难说。


我对用户可以担任多个角色的假设可能是错误的(因为通过查看您的数据,似乎该用户更像是一名员工)。然后,您将获得以下结构,其中为每个用户分配了一个角色和一个合作伙伴:

                          role
                          +------------+
user                 ---> | PK role_id |
+------------+     /      +------------+
| PK user_id |    /       |    name    |
+------------+   /        +------------+
| FK role_id | --
| FK co_id   | --           co
| name       |   \       +----------------+
|            |    \----> | PK co_id       |
|            |           +----------------+
|            |           |    field1      |
+------------+           |    field2      |
                         +----------------+