Использование родительского и дочернего FK в Entity Framework - PullRequest
0 голосов
/ 14 июня 2019

В некоторых ситуациях используется внешний ключ в таблице, когда FK имеет отношения Родитель или Дочерний с другой таблицей, как показано ниже:

Персонал:

Id   |  Name  |  CityId |
-------------------------
1001 |  John  |  1      |
1002 |  Mary  |  2      |
1003 |  Bill  |  3      |
1004 |  Jose  |  4      |
1005 |  Anna  |  5      |

Город:

Id  |  Name   |  CountryId |
----------------------------
1   |  NY     |  101       |
2   |  Paris  |  102       |
3   |  London |  103       |
4   |  Rome   |  104       |
5   |  Tokyo  |  105       |

Страна:

Id  |  Name   | 
---------------
101 |  USA    |
102 |  France |
103 |  UK     |
104 |  Italy  |
105 |  Japan  |

Мой вопрос таков: должны ли мы использовать только CityId в качестве FK в составе персонала или лучше включить CityId и его родительский CountryId в структуре персонала? Конечно, представляется излишним включать FK и его родителя в FK, но я хотел бы уточнить, есть ли ситуации или требования при использовании такого короля отношений с каскадом? Какой из них следует использовать?

1 Ответ

1 голос
/ 14 июня 2019

Я бы не стал нарушать нормализацию, потому что не существует простого способа обеспечить синхронизацию справочной информации о стране сотрудника и справочной информации о стране.Например, Персонал может иметь для Города значение «Торонто», а для Страны - «Канада», но затем где-то город будет обновлен до «Бостона», но Staff.Country не обновляется.Персонал говорит, что страна - это «Канада», а город - «США».Кому доверяют как источнику правды?

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

var staffViewModels = context.Staff
    .Select(x => new StaffViewModel
    {
        StaffId = x.Id,
        Name = x.Name,
        Country = x.City.Country.Name
    }).ToList();

Даже если структура вводит Адрес для персонала, который состоит из Города, связанного со страной:

var staffViewModels = context.Staff
    .Select(x => new StaffViewModel
    {
        StaffId = x.Id,
        Name = x.Name,
        Country = x.Address.City.Country.Name
    }).ToList();

Сущность может оставаться нормализованной и генерировать SQLдля эффективного доступа к соответствующим данным.

...