Задать вопрос
hummingbird
@hummingbird

Считается ли верной такая связь?

Есть три таблицы: blogs, posts и comments.

Сейчас связи для них выглядят следующим образом:
blogs -> 1:n -> posts
posts -> 1:n -> comments

Но я хочу получить список всех комментариев родственных постов на странице блога, то есть это связь:
blogs -> 1:n -> comments

Добавляется поле blog_id в таблицу comments.

Является ли это правильным вариантом? По правилам нормализации - нет. Но как тогда это реализовать?
  • Вопрос задан
  • 418 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 3
riot26
@riot26
<:З )~~
Структура таблиц:
blogs (`id`, `title`);
posts (`id`, `blog_id`, `title`);
comments (`id`, `post_id`, `text`);

Запрос:
SELECT
    `comments`.*,
    `blogs`.`id` as blog_id,
    `blogs`.`title` as blog_title
FROM `comments`
    JOIN `posts` ON `posts`.`id`=`comments`.`post_id`
    JOIN `blogs` ON `blogs`.`id`=`posts`.`blog_id`

Результат:
| id | post_id |        text | blog_id | blog_title |
|----|---------|-------------|---------|------------|
|  1 |       1 |     comment |       1 | Vasya      |
|  2 |       2 |    comment2 |       1 | Vasya      |
|  5 |       2 | lorem ipsum |       1 | Vasya      |
|  3 |       6 |    comment3 |       2 | Petya      |
|  4 |      10 |    comment4 |       3 | Masha      |

sqlfiddle
подробнее
Ответ написан
Комментировать
@dmitryKovalskiy
программист средней руки
select b.blog_id,c.comment from blogs as b
inner join posts as p ON b.blog_id = p.post_id
inner join comments as c ON p.post_id = c.post_id
Ответ написан
Комментировать
Но как тогда это реализовать?
У вас ведь уже есть эта связь, просто не прямая. Почему бы не получить все посты блога, а потом комментарии этих постов?
Решение одним запросом:
SELECT * FROM comments WHERE post_id IN (SELECT id FROM posts WHERE blog_id = X)

Но я предпочитаю делать два простых запроса, вместо одного составного.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
ibub1ik
@ibub1ik
Ruby/Rails Dev => Elixir
Как это будет выглядеть в SQL вам уже объяснили, в рельсах это уже есть из коробки:
class Blog < ActiveRecrod::Base
  has_many :posts
  has_many :comments, through: :posts
end
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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