Как вы справляетесь с полиморфизмом в базе данных? - PullRequest
49 голосов
/ 05 сентября 2008

Пример

У меня есть Person, SpecialPerson и User. Person и SpecialPerson просто люди - у них нет имени пользователя или пароля на сайте, но они хранятся в базе данных для ведения учета. Пользователь имеет все те же данные, что и Person и, возможно, SpecialPerson, а также имя пользователя и пароль, которые они зарегистрированы на сайте.


Как бы вы решили эту проблему? Если бы у вас была таблица Person, в которой хранятся все данные, общие для человека, и используйте ключ для поиска их данных в SpecialPerson (если они особые лица) и в Пользователе (если они являются пользователем) и наоборот

Ответы [ 13 ]

1 голос
/ 05 сентября 2008

да, я бы также рассмотрел TypeID вместе с таблицей PersonType, если это возможно, будет больше типов. Однако, если есть только 3, этого не должно быть.

0 голосов
/ 05 сентября 2008

Раньше я делал это именно так, как вы предлагаете - иметь таблицу Person для общих вещей, а затем SpecialPerson, связанную с производным классом. Тем не менее, я переосмысливаю, так как Linq2Sql хочет, чтобы поле в той же таблице указывало на разницу. Я не слишком много смотрел на модель сущности - вполне уверен, что это позволяет другой метод.

0 голосов
/ 05 сентября 2008

Лично я бы сохранил все эти разные классы пользователей в одной таблице. Затем у вас может быть поле, в котором хранится значение «Тип», или вы можете указать, с каким типом человека вы имеете дело, по каким полям заполнены. Например, если UserID равен NULL, то эта запись не Пользователь.

Вы можете ссылаться на другие таблицы, используя тип соединения один-к-одному или ни к одному, но затем в каждом запросе вы будете добавлять дополнительные объединения.

Первый метод также поддерживается LINQ-to-SQL, если вы решите пойти по этому маршруту (они называют его «Таблица на иерархию» или «TPH»).

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