powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Проектирование БД
25 сообщений из 25, страница 1 из 1
Проектирование БД
    #38574496
Mity874
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, хочу попросить помощи в создании базы данных. Требуется создать базу данных книг. В базе должно хранится (Название книги на русском, её название на английском, описание, жанр, автор). У меня проблема возникла в том, что жанров и авторов у книги может быть несколько и проблема в том, как это все реализовать.
...
Рейтинг: 0 / 0
Проектирование БД
    #38574498
artas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mity874,

связь многие ко многим
...
Рейтинг: 0 / 0
Проектирование БД
    #38574501
Mity874
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это ясно, а что дальше?
...
Рейтинг: 0 / 0
Проектирование БД
    #38574506
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mity874,

а дальше создавайте базу :)
...
Рейтинг: 0 / 0
Проектирование БД
    #38574507
artas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mity874,

наверное надо таблицы создать... или в чем сложность то ?
...
Рейтинг: 0 / 0
Проектирование БД
    #38574512
Mity874
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я не понимаю, как указать, что одна книга относится к нескольким жанрам и что у неё несколько авторов. В одной ячейке таблицы ведь можно писать, только 1 значение.
...
Рейтинг: 0 / 0
Проектирование БД
    #38574524
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mity874Я не понимаю, как указать, что одна книга относится к нескольким жанрам и что у неё несколько авторов. В одной ячейке таблицы ведь можно писать, только 1 значение.
Для этого создаётся третья таблица, куда заносятся уникальные пары книга-жанр. Хотя по отдельности и книги, и жанры там дублируются.

В общем, почитайте хоть что-нибудь про связи много-ко-много...
...
Рейтинг: 0 / 0
Проектирование БД
    #38574773
Mity874
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почитал про связь многие ко многим, как я понял решение моей пробелемы выглядит вот так?

http://firepic.org/][img] http://4.firepic.org/4/images/2014-02/27/opb1il5265yj.png [/img]
...
Рейтинг: 0 / 0
Проектирование БД
    #38574782
VFl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mity874,

лучше так:

...
Рейтинг: 0 / 0
Проектирование БД
    #38574784
Mity874
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А можете объяснить почему лучше так сделать?
...
Рейтинг: 0 / 0
Проектирование БД
    #38574792
VFl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mity874,

Потому что иначе будут храниться непонятные данные - книга к автору и одновременно к жанру. Если, например, 2 автора и 1 жанр, или 3 жанра и 3 автора. Сколько записей вам понадобиться? Вам же нужна привязка только жанр к книге и отдельно автор к книге. При предложенном вами хранении придется делать SELECT DISTINCT или SELECT .. GROU BY, что бы вытащить из общей таблицы только авторов книги, или только жанр книги, без повторяющихся данных. А это затратно по ресурсам сервера и усложняет запросы.
...
Рейтинг: 0 / 0
Проектирование БД
    #38574795
Mity874
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VFl,

Кстати, ещё уточнить хочу. Столбец book_id тоже внешним ключем будет?
...
Рейтинг: 0 / 0
Проектирование БД
    #38574798
VFl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mity874VFl,

Кстати, ещё уточнить хочу. Столбец book_id тоже внешним ключем будет?

Да, так будет лучше, позволяет следить за корректностью данных, что бы мусор в базе не копился (типа списка жанров к несуществующей/удаленной книге), и для оптимизации запросов. Можно указать, что бы жанры и авторы к книге удалялись автоматически, если книгу удалили из базы.
...
Рейтинг: 0 / 0
Проектирование БД
    #38574816
Mity874
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я создал таблицы вот такими командами, когда начал заполнять таблицы значениями, вывалилась ошибка при заполнении таблицы temp1 ERROR 1452 (23000): Cannot add or update a child row

CREATE TABLE books (book_id int(11) not null auto_increment, org_name varchar(60), name varchar(60), primary key(book_id));

CREATE TABLE temp1 (id int(11) not null auto_increment, book_id int(11), genre_id int(11), primary key(id), FOREIGN KEY (genre_id) REFERENCES genre(genre_id), FOREIGN KEY (book_id) REFERENCES books(book_id));

CREATE TABLE temp2 (id int(11) not null auto_increment, book_id int(11), author_id int(11), primary key(id), FOREIGN KEY (author_id) REFERENCES author(author_id), FOREIGN KEY (book_id) REFERENCES books(book_id));

CREATE TABLE genre (genre_id int(11) not null auto_increment, genre varchar(60), primary key(genre_id));

CREATE TABLE author (author_id int(11) not null auto_increment, author varchar(60), primary key(author_id));

Как мне быть?
...
Рейтинг: 0 / 0
Проектирование БД
    #38574820
VFl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mity874,

заполнить надо сначала список возможных жанров (TABLE genre), потом список возможных авторов (TABLE author), потом занести в TABLE books первую книгу, а уже потом заполнять TABLE temp1 и TABLE temp2 (неудачные названия). База ругается видимо потому, что в temp1 в полях book_id и genre_id должны стоять значения, существующие в мастер-таблицах
...
Рейтинг: 0 / 0
Проектирование БД
    #38574825
Mity874
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, вы правы. Базу смог заполнить, теперь проблема с составлением запроса на извлечение данных.

Составил вот такой запрос, но по нему возвращается не название жанра книги, а индекс записанный в таблице temp1.
SELECT book.org_name, book.name, temp1.genre_id FROM book INNER JOIN temp1 ON book.book_id=temp1.book_id;

Помогите с этим разобраться.
...
Рейтинг: 0 / 0
Проектирование БД
    #38574826
VFl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К слову, лучше было бы

CREATE TABLE temp1 (id int(11) not null auto_increment, book_id int(11), genre_id int(11), primary key(id), FOREIGN KEY (genre_id) REFERENCES genre(genre_id), FOREIGN KEY (book_id) REFERENCES books(book_id) ON DELETE CASCADE );

и

CREATE TABLE temp2 (id int(11) not null auto_increment, book_id int(11), author_id int(11), primary key(id), FOREIGN KEY (author_id) REFERENCES author(author_id), FOREIGN KEY (book_id) REFERENCES books(book_id) ON DELETE CASCADE );

Это для чистки базы, если удаляется книга.
Если надо запретить удалять жанр или автора, по которым существуют книги, то еще и так:
Код: sql
1.
2.
3.
4.
5.
CREATE TABLE temp1 (id int(11) not null auto_increment, book_id int(11), genre_id int(11),  primary key(id), FOREIGN KEY (genre_id) 
REFERENCES genre(genre_id) ON DELETE RESTRICT, FOREIGN KEY (book_id) REFERENCES books(book_id) ON DELETE CASCADE);

CREATE TABLE temp2 (id int(11) not null auto_increment, book_id int(11), author_id int(11), primary key(id), FOREIGN KEY (author_id) 
REFERENCES author(author_id) ON DELETE RESTRICT, FOREIGN KEY (book_id) REFERENCES books(book_id) ON DELETE CASCADE);
...
Рейтинг: 0 / 0
Проектирование БД
    #38574829
VFl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mity874SELECT book.org_name, book.name, temp1.genre_id FROM book INNER JOIN temp1 ON book.book_id=temp1.book_id;

Помогите с этим разобраться.

Потому что написано же: SELECT book.org_name, book.name, temp1.genre_id

Надо делать через три таблицы:

SELECT book.org_name, book.name, genre.genre
FROM book, temp1, genre
WHERE book.book_id=temp1.book_id AND temp1.genre_id = genre.genre_id ;
...
Рейтинг: 0 / 0
Проектирование БД
    #38574832
Mity874
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VFl,

Спасибо вам огромное, очень сильно помогли.

И ещё вопрос, вот: "Подскажите в каких случаях нужно применять JOIN?".
...
Рейтинг: 0 / 0
Проектирование БД
    #38574837
VFl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рад, что сумел помочь.

Mity874в каких случаях нужно применять JOIN?

"Нужно" неправильное слово, есть синтакс с JOIN, но он не обязателен для соблюдения. Мне проще без него, если сам руками пишу запрос. Вообще

SELECT ...
FROM Table1 INNER JOIN
Table2 ON Table1.ID = Table2.ID INNER JOIN
Table3 ON Table2.ID = Table3.ID

и

SELECT ...
FROM Table1, Table2, Table3
WHERE Table1.ID = Table2.ID AND Table2.ID = Table3.ID

выдает одно и тоже, просто в первом случае условия связки таблиц находятся в FROM, а во втором случае в WHERE

Среди программистов есть сторонники как одного, так и другого способа, хотя правильным считается первый, который с JOIN
...
Рейтинг: 0 / 0
Проектирование БД
    #38574838
Mity874
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VFl,

И кстати я не понимаю, если запрос делатся через 3 таблицы, то зачем бы устанавливали внешний ключ? Получается он нужен только для сохранения целостности данных?
...
Рейтинг: 0 / 0
Проектирование БД
    #38574841
VFl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mity874зачем бы устанавливали внешний ключ? Получается он нужен только для сохранения целостности данных?

Да, главным образом для этого. Он позволяет автоматизировать соблюдение целостности данных. Говорят, что еще помогает более быстро выдавать данные, но это только для больших баз данных важно.
...
Рейтинг: 0 / 0
Проектирование БД
    #38574946
RenVold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mity874, а хотите проблему "разом решить"? С минимальной головной болью? Если уж совсем не знаете с чего начать... Тогда вам нужно обратиться к тем, у кого есть опыт в разработке БД. Поставить им ТЗ, договориться о цена и.. вперед! Нет проблем!!!!
...
Рейтинг: 0 / 0
Проектирование БД
    #38575538
Mity874
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RenVoldMity874, а хотите проблему "разом решить"? С минимальной головной болью? Если уж совсем не знаете с чего начать... Тогда вам нужно обратиться к тем, у кого есть опыт в разработке БД. Поставить им ТЗ, договориться о цена и.. вперед! Нет проблем!!!!
Минимальная головная боль это не мой выход и счастью есть добрые люди, которые могут помочь разобраться в новой сфере.
...
Рейтинг: 0 / 0
Проектирование БД
    #38575591
DriveSoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ради теста своей программы (My Visual Database) сделал подобный проект со связью многие ко многим, а то как то не было случая протестировать это

можно забрать отсюда
http://drive-software.com/hlam/BooksandAuthors.zip


правда не стал делать связь многие ко многим для жанров, только для автора и книги.
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Проектирование БД
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]