Объектно-ориентированные структуры в реляционных базах данных - PullRequest
9 голосов
/ 02 марта 2009

Народ,

Уже n-й раз подряд я снова сталкиваюсь с той же проблемой. Речь идет о том, «как безболезненно отобразить структуры ООП в таблицы базы данных».

Вот сценарий: у меня есть несколько типов «действующих лиц» в моей системе - работники, работодатели, контакты. У них есть определенные общие функции; другие части очень разные. Субъектами, с которыми имеют дело все участники, являются «сообщения», «заметки» (администраторы любят оставлять заметки для клиентов) и некоторые другие. Есть тонны типов других сущностей, с которыми имеет дело каждый тип актера, в то время как другие не делают.

В настоящее время моя схема базы данных содержит таблицы для:

Актеры:

  • рабочий
  • работодатель
  • контакт

Сущность:

  • примечания
  • и т.д.

Таблицы связей между сущностями и субъектами:

  • рабоче-коммуникационно-Assn
  • работодатель-коммуникационно-Assn
  • рабочие струны-Assn
  • и т. Д., Вы получаете упражнение.

Для меня это похоже на "кодовый запах". Всякий раз, когда клиент меняет свою роль (т. Е. Повышается с «контакт» до «работодатель»), необходимо запустить кучу сумасшедших сценариев. Тьфу ... С другой стороны, если бы я работал в мире, ориентированном исключительно на ООП, это было бы намного проще - иметь базовый класс для всех сущностей с общими свойствами и покончить с этим ...

В мире БД этот вариант кажется теоретически возможным, но звучит очень грязно ... Т.е. если я правильно понимаю, у меня будет новая таблица base_actor, и у каждого другого актера будет base_actor_id, и тогда ассоциации будут между base_actor и сущностями ... Но тогда как мне выполнять запросы обратной ассоциации? То есть "покажи мне все связи только с актерами типа работник"?

Есть совет? Какие-нибудь общие мысли на тему «отображения ООП-структур на реляционные БД»?

Ответы [ 11 ]

0 голосов
/ 02 марта 2009

Мне кажется, что в вашей модели данных отсутствует уровень. Я бы настроил это так:

Люди Таблица - (Только информация о реальных людях)

Роли Таблица - (типы ролей, которые могут иметь люди, т. Е. Работник, работодатель, контакт - и информация, относящаяся к этой роли)

PeopleRoles Таблица - (people_id, role_id, возможно, даты начала / изменения и т.д.)

Сущности Таблица - (Определить различные типы сущностей)

RoleEntities Таблица - (role_id, entity_id и т. Д.)

Затем изменение человека с одной роли на другую (или предоставление им нескольких ролей) является простым обновлением.

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