SQL для нормализации таблицы данных и создания нескольких таблиц - PullRequest
0 голосов
/ 14 февраля 2019

Я получаю 2 отчета от системы, которую я решил обработать через Access с использованием SQL.Один отчет называется «Evals», а другой - «Con».В данный момент таблица "Con" не нормализована.Есть поля с именами «Пользователь» и «Роли пользователя», и я хотел бы использовать PK «CO_ID».Для каждого экземпляра «CO_ID» существует несколько и разные «роли пользователей» и «пользователи».Тем не менее, «Роли пользователя» ограничены выбором 6. Однако для каждой роли «CO_ID» может быть несколько пользователей для одной роли.Это приводит к появлению нескольких строк с одинаковыми данными, связанными с CO_ID.

2 отчета генерируются одинаковым образом, поэтому каждый раз процесс будет одинаковым.

Мне нужно создать таблицу с "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 голосов
/ 14 февраля 2019

Между пользователями и ролями существует отношение m-to-n, поскольку у пользователя может быть несколько ролей, а роль может быть назначена нескольким пользователям.Это отношение m-to-n требует таблицы связей между пользователями и ролями.Кроме того, вы назначаете «Con» для каждого отношения пользователя / роли.

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_id, user_id, потому что каждый пользователь /Ролевые отношения уникальны.Кроме того, в качестве дополнительной информации есть co_id.

role, а также user и co каждый на одной стороне отношения.user_role находится на n стороне всех отношений.

В качестве альтернативы, возможно также иметь FK co_id в пользовательской таблице.Это зависит от того, что означает «со» или «против».Трудно сказать без дополнительных знаний.


Мое предположение, что у пользователя может быть несколько ролей, может быть неверным (поскольку, глядя на ваши данные, кажется, что пользователь больше похож на сотрудника).Затем вы получаете эту структуру, где каждому пользователю назначается одна роль и одна со:

                          role
                          +------------+
user                 ---> | PK role_id |
+------------+     /      +------------+
| PK user_id |    /       |    name    |
+------------+   /        +------------+
| FK role_id | --
| FK co_id   | --           co
| name       |   \       +----------------+
|            |    \----> | PK co_id       |
|            |           +----------------+
|            |           |    field1      |
+------------+           |    field2      |
                         +----------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...