Наследование в одной таблице - PullRequest
4 голосов
/ 14 октября 2008

Ответ на мой вопрос о дизайне БД предложил нечто, называемое наследованием одной таблицы. Я провел небольшой поиск по этому вопросу, но, похоже, не могу найти столько четкой информации об этом.

Из того, что я, похоже, понимаю, это то, что у вас есть большая таблица со всеми полями в ней, а также поле типа - и затем ваш слой ORM использует поле типа, чтобы предоставить вам различные виды объектов. Это правильно?

Что более важно, является ли наследование одной таблицы «одобренным» методом проектирования базы данных? Под этим я подразумеваю, «разумно» ли это использовать? Это также безопасно использовать, или это вызывает проблемы?

Другой вопрос, насколько хорошо это работает в рельсах? Я нашел несколько ссылок на него с рельсов - но это вызывает проблемы, если делать вещи нетрадиционным способом?

Любая помощь высоко ценится.

Ответы [ 7 ]

5 голосов
/ 14 октября 2008

Это хорошая идея? Это зависит. Это нарушает нормализацию в том смысле, что таблица не имеет единственной цели. Что происходит, когда вы расширяете базовый класс в n-й раз? Вам нужно будет добавить столбцы в таблицу. Большинство современных БД не имеют проблем с этим, так как вы можете изменить таблицу, но как насчет рефакторинга и удаления класса. Теперь у вас есть столбцы, у которых нет цели.

Эмпирическое правило - если большая часть дизайна была разработана, его, вероятно, безопасно использовать. Если дизайн часто меняется - у вас есть другие проблемы, и вам нужно заблокировать ваши варианты использования / требования пользователя. (да, не совсем дружит с XP)

Я не знаю об эффектах Rails.

1 голос
/ 15 октября 2008

Короче говоря, Single Table Inheritance (STI) - это шаблон проектирования, который позволяет отображать отношения наследования ООП с базой данных. Если вы определяете какие-либо подклассы из своих объектов модели ActiveRecord, вам следует учитывать STI.

STI (изначально?) Задокументирован в книге Мартина Фаулера «Шаблоны архитектуры корпоративных приложений», а также описан в канонической книге DHH по Rails «Гибкая веб-разработка с Rails» (я думаю, в разделе 18.4). эти книги, потому что они дают гораздо лучшее объяснение, чем я мог бы надеяться сделать в этом месте.

Я категорически не согласен с мнением, высказанным на сайте www.matthewpaulmoore.com (связанном с robintw в этой теме), что по своей сути ИППП является плохой вещью. Похоже, это несколько наивный взгляд, который исключает использование наследования ООП. Я использовал STI для создания элегантных решений в Rails, но я полагаю, вы можете использовать любой шаблон проектирования.

1 голос
/ 14 октября 2008

STI - это способ справиться с несоответствием между объектно-ориентированным мышлением Это позволяет разумно представлять информацию в базе данных и другое представление в объектной модели.

Например, у меня есть приложение, в котором каждый из моих продуктов содержит один или несколько сборов, каждый из которых рассчитывается немного по-разному. В моей объектной модели я хочу иметь подклассы класса Fee, каждый из которых знает, как себя вычислить. Я действительно не хочу иметь таблицу для каждого типа сборов: поэтому я создаю Fee в качестве базового класса и сборы в качестве таблицы, которая содержит объединение всех полей, необходимых для всех подтипов, плюс «тип» столбец, значение которого соответствует имени соответствующего подкласса. ActiveRecord после этого обрабатывает сантехнику.

0 голосов
/ 21 октября 2008

Обычно я нахожу это полезным, но Я столкнулся с некоторыми ошибками

Пример в этой ссылке может дать полезную картину того, как вы можете его использовать.

0 голосов
/ 14 октября 2008

Я только что видел http://www.matthewpaulmoore.com/articles/1276-ruby-on-rails-code-quality-checklist#sti, что говорит о плохой идее.

0 голосов
/ 14 октября 2008

Я могу говорить только с (новой) точки зрения ADO Entity Framework, которая включает в себя функциональность таблицы для каждого типа (TPT).

Здесь - это хорошая серия постов в блоге, представляющих основные концепции (с использованием Entity Framework), и на нем также есть документ MSDN здесь .

Также, похоже, есть некоторые рекомендации при использовании nHibernate для TPT, он расположен здесь .

Там есть эта ссылка, которая объясняет наследование таблиц по типам в SQL Server . Похоже, это довольно хорошее резюме и введение в концепцию.

Я не уверен, какое влияние это окажет на Rails.

0 голосов
/ 14 октября 2008

Окончательный ссылка . Это позволяет одной таблице хранить несколько объектов, имеющих общий базовый класс.

Ruby on Rails использует библиотеку под названием Active Record . Это общая среда Ruby, которая поддерживает STI.

...