Наследование в базах данных Rails - PullRequest
3 голосов
/ 29 августа 2011

Я планирую диаграмму базы данных для моего проекта Rails.
У меня есть следующие объекты: Ответ (наследует от поста), Вопрос (также наследует от поста) и Комментарий.
Комментарий относится либо к ответу, либо к вопросу.
Как я буду продолжать это делать?

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

Какой самый лучший и эффективный способ сделать это?

EDIT
Меня не интересует решение STI (наследование одной таблицы). Мы ищем эффективное решение, так как (надеюсь) это будет большой проект с большим количеством постов.

Ответы [ 2 ]

3 голосов
/ 29 августа 2011

Модель наследования Rails по умолчанию - «Наследование отдельных таблиц», и она является самой простой, чистой, обобщенной и наиболее независимой от базы данных вещью.

Это достигается простым наследованием ответа и вопроса от Post.Затем вы создаете таблицу сообщений, в которой есть все поля, которые вы хотите заполнить: «Пост», «Ответ» и «Вопрос».

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

Что касается соединения комментариев и сообщений, вы можете использовать отношение belongs_to в модели комментариев, которое указывает на сообщение, и отношение has_many в модели сообщений, которое указывает на комментарий.(Вам нужно добавить целочисленное поле post_id в таблицу комментариев, чтобы заставить это работать).

ср.http://guides.rubyonrails.org/association_basics.html

Вы также захотите добавить индекс для комментариев к post_id для быстрого запроса всех комментариев к сообщению: http://guides.rubyonrails.org/migrations.html.

2 голосов
/ 29 августа 2011

Вы должны весить, используя полиморфные ассоциации, вместо использования ИППП.

Например, в вашем случае вам следует задаться вопросом, действительно ли вы хотите иметь пост суперкласса. Возможно, Вопросы и ответы не должны принадлежать одной и той же иерархии, и, возможно, оба должны быть связаны с комментарием класса через полиморфную ассоциацию . То есть: Может быть, они должны быть помечены как «Комментируемые»

...