Swartex
@Swartex
Многорукий могоног

Правильно ли реализовал структуру БД?

Всем привет,
Я хочу хранить свою библиотеку в БД. Нужно хранить книги и авторов.
Мне кажется что связь между таблицами должна быть многие-ко-многим, верно ли я понимаю?
Или всё таки должна быть один-ко-многим?
Вот моя реализация:
57a7ea69419e4eada4d33021299eef67.png
Поправьте если я не прав :)

UPD
8da518268d1b40238403e6fdadf38aeb.png
  • Вопрос задан
  • 425 просмотров
Решения вопроса 1
DevMan
@DevMan
many-to-many, все верно.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
id в book_author не нужен. Сделайте нормальный композитный ключ из book_id и author_id, всем будет хорошо (в том числе СУБД).
Ответ написан
Комментировать
Falseclock
@Falseclock
решаю нестандартные задачи
Самая распространенная ошибка всех начинающих - это наименование полей.
Заимейте привычку именовать основные поля, по которым будут связи в будущем, с именем таблицы.

если таблица authors, то ключевое поле должно быть authors_id
если таблица book, то поле обзывайте book_id

Это сейчас у вас 3 таблицы и можно понять что куда к чему относится.

А когда завтра вы будете джоинить по 5-6 таблиц, вы просто запутаетесь где и что с чем джоинится.
Вот самый обычный пример с 9 джоинами. Если бы во всех таблицах были бы поля просто id, я бы голову сломал чтобы сджоинить. И это самый обычный запрос. А если сюда еще добавить интерсекты, кростабы, группировки, условия и вложенные запросы, то все колом встанет, чтобы интуитивно понять куда что с чем джоинить.

SELECT
				o.order_id,
				lpad(o.order_id::text, 8, '0') AS order_number,
				o.order_date,
				o.order_state,
				o.member_id,
				o.contacts_data_id,
				o.invoice_uuid,
				o.invoice_number,
				z.organization_short_name AS company,
				z.organization_id,
				y.organization_business_number AS bin,
				f.contact_firstname AS firstname,
				f.contact_lastname AS lastname,
				d.*,
				p.*,
				x.supply_id,
				i.invoice_id,
				'2'||lpad(i.order_id::text, 6, '0') AS invoice
			FROM
				orders o
			JOIN contacts_data s ON
				o.contacts_data_id = s.contacts_data_id
			JOIN contacts f ON
				s.contact_id = f.contact_id
			JOIN organizations z ON
				s.organization_id = z.organization_id
			LEFT JOIN organization_data y ON
				z.organization_id = y.organization_id
			JOIN order_data d ON
				o.order_id = d.order_id
			JOIN spare_parts p ON
				p.part_id = d.part_id
			LEFT JOIN supply_data x ON
				x.order_data_id = d.order_data_id
			LEFT JOIN supply xx ON
				xx.supply_id = x.supply_id
			LEFT JOIN invoices i ON
				i.order_id = d.order_id


Плюс страны вынести в отдельную таблицу, а в таблице авторов указывать ID страны.
Завтра вы ведь захотите искать по странам. Зачем нагружать базу текстовым поиском и строить индексы по текстовым полям?
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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