2014-11-07 2 views
0

Предположим, у меня есть таблица пользователей и роли таблицыВыбор правильных объектные отношения приближаются

У меня есть два типа ролей, работник и работодатель

Внутри таблицы пользователя, у меня есть следующие столбцы

  • UserId

    FirstName

    LastName

    Идентификатор роли (внешний ключ - один ко многим)

Работодатель может относили компании в то время как работник может относили резюме

Так что лучше определить две дополнительные таблицы (Employee, работодатель) с один к одному отношению к столу пользователя, и у компании/CV внешних ключей там, или лучше, чтобы определить таблицу пользователей, как так

  • UserId

    FirstName

    LastName

    CompanyID - оставьте пустым для сотрудника (разрешить нулевой)

    CVID - оставьте пустым для работодателей (разрешить Null)

    Идентификатор роли

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

ответ

2

Оба способа являются общими стратегиями для реализации наследования в модели данных, первая называется TPT (Table per Type) , а вторая называется TPH (таблица на иерархию).

Вот большая статья, которая описывает & сравнивает обе стратегии http://blogs.msdn.com/b/alexj/archive/2009/04/15/tip-12-choosing-an-inheritance-strategy.aspx

Какая стратегия лучше? Хитрый вопрос! В изоляции от ваших требований нет стратегии «Лучшая». Вот некоторые из вещей вы можете рассмотреть при принятии решения:

  • Производительность: Таблица Per Иерархии не вообще лучше исполнительская, потому что соединяет нужны, все в одной таблице. Решение становится еще более четким, как только иерархия наследования получает широкий или глубокий характер.
  • Гибкость: Table Per Type часто используется ISV, так как позволяет настраивать без изменения таблицы «base». то естьновые подтипы можно добавить просто создав новые таблицы для этих подтипов.
  • Проверка базы данных. В базе данных для TPH требуются столбцы производных типов, которые должны быть NULLABLE, так что другие производные типы могут быть сохранены в той же таблице. Из-за этого можно создать строки в таблице , которые недопустимы в соответствии с концептуальной моделью. То есть столбец имеет значение NULLABLE, но комбинация конкретного столбца равна NULL, а конкретный дискриминатор или тип недопустим. Это означает, что база данных больше не использует концептуальную модель для вас. Это нормально, если весь доступ к базе данных осуществляется через EF, но если используется , вы можете получить «грязные» данные.
  • Эстетика: этот полностью субъективен, но TPT чувствует себя более объектно ориентированным для меня :)
  • Место хранения: Если ваша иерархия наследования имеет множество типов, то использование TPH приведет к множеству пустых ячеек. Если ваша база данных может обрабатывать «разреженные» столбцы, это, вероятно, не представляет реальной проблемы.

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

Смежные вопросы