Судя по тому, что вы представили, у вас есть пара известных фактов:
- Каждый пользователь - это человек
- Не каждый человек является пользователем
В таком случае я бы расширил модель персонажа, включив в нее обнуляемое поле UserId, чтобы вы могли связать пользователя с персоной для тех людей, которые также являются пользователями.
Теперь я также собираюсь предположить, что у вас есть несколько методов «Fetch» в модели человека ... для извлечения человека по ID, имени, отделу и т. Д. ...
Я бы перегрузил (или создал бы другой) метод выборки, чтобы также получить объект person от пользователя (это может быть либо id, либо foll пользовательский объект).
public IPerson Fetch(IUser user) {}
Конечно, поскольку у вас есть известный факт, что каждый пользователь также является человеком, я лично не вижу ни вреда, ни нечестности в расширении объекта пользователя для включения в него свойства человека ...
public interface IUser
{
...
IPerson Person { get; set; }
}
Затем вы можете вернуть пользовательский объект, как всегда ... и, возможно, выполнить какую-нибудь забавную ленивую загрузку поля person у пользователя ... или заполнить оба поля при получении пользовательского объекта.
Я не уверен, что создание таблицы «отображения» пользователя <-> Person принесет вам многое из того, что я обрисовал выше (хотя вы получите похвалу от жестких администраторов баз данных за денормализацию ваших данных ) .. для меня это просто дополнительная таблица, к которой можно присоединиться, чтобы получить тот же эффект.