Как связать сущности: вопрос, ответ и комментарии к ответу по типу qna.habr.com?

Как оптимально связать сущности: вопрос, ответ, комментарии к ответу по типу qna.habr.com?

Я так понимаю, что нужны 3 модели: question, answer, comment.

Модель question может иметь много answer (связь один ко многим).

А как быть с моделью comment? К какой модели ее привязывать к question или к answer? И можно ли данные из трех таблиц вызвать в одном запросе?

Какие есть варианты решения такой задачи и как оптимально поступить в данном случае?
  • Вопрос задан
  • 416 просмотров
Решения вопроса 1
@Persotr27
Есть такой вариант:
comment связать через "один ко многим" и с question и с answer, фореигн кеи при этом указать как NULLable.
Пример:
CREATE TABLE comment (
CId INT PRIMARY KEY AUTO_INCREMENT,
fQId int(11) NULL,
fAId int(11) NULL,
FOREIGN KEY (fQId)  REFERENCES question (QId),
FOREIGN KEY (fAId)  REFERENCES answer (AId),
)


Если коммент относится к вопросу - fAId будет NULL, если коммент относится к ответу, fQId будет NULL.

Данные вызывать можно, с помощью джоинов, пример:
select comment from question join answer on QId=fQId join comment on AId=fQAId where QId='value'


Код выше, по идее, выберет запрашиваемый вопрос, ответы к нему, и комментарии к каждому ответу.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Вариант 1:
Сделать разные сущности "комментарий к вопросу" и "комментарий к ответу"
Вариант 2:
Сделать "комментарий" но не делать FK, и определять к чему это комментарий по флагу.
Вариант 3:
Сделать вопрос одной сущностью-документом, в рамках которого будет поле с ответами, поле с комментариями к вопросу, а у ответов будут свои комментарии.
Но вроде так на mysql не очень удобно будет делать, и получить все комментарии или ответы пользователя будет достаточно дорого
И можно ли данные из трех таблиц вызвать в одном запросе?

Можно. Почему нет?
Ответ написан
Комментировать
@ComodoHacker
Добавлю к ответу Василий Банников Вариант 4:

Хранить вопросы, ответы и комментарии в одной таблице, с разделением по типу, разумеется.
Ну и ссылку на родителя, как обычно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы