дизайн базы данных. как спроектировать одну таблицу имеет 10 отношений с одной и той же таблицей словаря - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть вопрос о дизайне базы данных.
Например, у меня есть одна словарная таблица с именем «Пользователь», и у меня есть другая таблица данных с именем «OperationInfo», таблица данных с несколькими столбцами ссылается на «Пользователь», как

User:              OperationInfo:             
+-----+------+     +-----+------------- +------------- +------------- +------------- +...
| Id* | Name*|     | Id* | CreateUserId*| UpdateUserId*| CreateUserId*| RemoveOperId*|...
+----------- +     +-----+------------- +------------- +------------- +------------- +...
| 1   | Jack |     | 1   | 1            | 2            | 2            | 1            |...
| 2   | Tom  |     | 2   | 1            | 1            | 1            | 2            |...
+-----+----- +     +-----+------------- +------------- +------------- +------------- +...

Если я хочу получить все имена пользователей, мне нужно присоединиться несколько раз, например

 SELECT B1.Name AS CreateUserName
       ,B2.Name AS UpdateUserName
       ,B3.Name AS RemoveUserName
       ,B4.Name AS DeleteUserName
       ,... 
   FROM OperationInfo A 
   JOIN User B1 ON A.CreateUserId = B1.Id
   JOIN User B2 ON A.UpdateUserId = B2.Id
   JOIN User B3 ON A.RemoveUserId = B3.Id
   JOIN User B4 ON A.DeleteUserId = B4.Id
   JOIN ...

Несколько раз Присоединиться только для получения имен, Это не хорошо, потому что это Таблица данных имеет более десяти внешнего ключа с таблицей пользователя. У меня есть решение, сохранить имя пользователя в таблице данных, как

OperationInfo:             
+-----+------------ +------------- +------------ +------------- +------------ +------------- +...
| Id* |CreateUserId*|CreateUserName|UpdateUserId*|UpdateUserName|RemoveOperId*|RemoveUserName|...
+-----+------------ +------------- +------------ +------------- +------------ +------------- +...
| 1   | 1           | Jack         | 2           | Tom          | 2           | Tom          |...
| 2   | 1           | Jack         | 1           | Jack         | 2           | Tom          |...
+-----+------------ +------------- +------------ +------------- +------------ +------------- +...

, а затем запросить все имена пользователей, как

 SELECT A.CreateUserName
       ,A.UpdateUserName
       ,A.RemoveUserName
       ,A.DeleteUserName
       ,... 
   FROM OperationInfo A 
   <Condition>

запрос становится намного проще. Но это не хорошо, избыточность данных , приведет к несоответствию имени таблицы словаря и таблицы данных. Есть ли лучший дизайн? потому что там много столбца избыточности. Я должен делать? очень спасибо.

1 Ответ

0 голосов
/ 01 апреля 2020

Вы ответили на свой вопрос ...

Объективно лучше использовать несколько объединений, поскольку выполнение этого другого способа может привести к устареванию данных, например, если имя пользователя изменяется или этот пользователь удаляется ... Если по какой-то причине вас это не волнует, тогда go и используйте денормализованный способ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...