@smash_wp

Как лучше организовать структуру таблиц?

Интернет-магазин продажи книг. Есть комментарии для книги, автора, издательства.

Если всё запихнуть в одну энтити, тогда при добавлении комментария книги, в БД получиться что-то следующее:

Таблица комментариев:
Поля:
id - 1
user_id - 37
comment - blabla
book_id - 2
author_id - null
publisher_id - null

Где book_id - id книги, к которой добавили комментарий
author_id - id автора, к которому добавили комментарий
publisher_id - id издательства, к которому добавили комментарий

По моему мнению, такая таблица не есть нормальным решением (хотя возможно я недостаточно опытен :) ).
Есть вариант с созданием 3 таблиц с комментариями для каждой сущности (например, BookComment - комментарии к книге, AuthorComment - комментарии к автору и т. д.)

Либо же создать 3 дополнительные таблицы для связывания авторов, книг и издательств с комментариями.

Возможно, есть более "адекватное" решение. Подскажите, пожалуйста.
  • Вопрос задан
  • 354 просмотра
Пригласить эксперта
Ответы на вопрос 3
lexxpavlov
@lexxpavlov
Программист, преподаватель
Вот почитайте мою статью, в ней как раз рассказывается о вашей проблеме:
Реализация системы тегов в админке с бандлом Sonat...
Ответ написан
Комментировать
BoShurik
@BoShurik Куратор тега Symfony
Symfony developer
Комментировать
vistoyn
@vistoyn
программист
Поля:
id - ID комментария
user_id - ID пользователя
comment - Текст комментария
type - Тип комментария
foreign_id - Внешний ключ

type Сделать как константы в Entity

class Comment{
	
	const TYPE_BOOK = 1;
	const TYPE_AUTHOR = 2;
	const TYPE_PUBLISHER = 3;

	/**
	 * @var bigint
	 *
	 * @ORM\Column(name="id", type="bigint")
	 * @ORM\Id
	 * @ORM\GeneratedValue(strategy="AUTO")
	 */
	public $id;
	
	
	/**
	 * @var bigint
	 *
	 * @ORM\Column(name="user_id", type="bigint")
	 */
	public $user_id;
	
	
	/**
	 * @var string
	 *
	 * @ORM\Column(name="comment", type="text")
	 */
	public $comment;
	
	
	/**
	 * @var smallint
	 *
	 * @ORM\Column(name="type", type="smallint")
	 */
	public $type;
	
	
	/**
	 * @var bigint
	 *
	 * @ORM\Column(name="foreign_id", type="bigint")
	 */
	public $foreign_id;
}

$comment = new Comment();
$comment->user_id = 37;
$comment->comment = 'комментарий';
$comment->type = Comment::TYPE_BOOK;
$comment->foreign_id = $book->id;


В данном случае у вас не будут связей, но они не особо то и нужны, и можно обойтись без них.
Комментарии же все равно выводятся для книги, автора, издательства.
Т.е. всегда указан type и foreign_id в запросе select.
Если нужно вывести вообще все комментарии, то делаете left join и фильтр: вывести комментарии отдельно по Книгам, авторам и издательствам
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы