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

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

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

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

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

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

лучше так:

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

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

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

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

Да, так будет лучше, позволяет следить за корректностью данных, что бы мусор в базе не копился (типа списка жанров к несуществующей/удаленной книге), и для оптимизации запросов. Можно указать, что бы жанры и авторы к книге удалялись автоматически, если книгу удалили из базы.
...
Рейтинг: 0 / 0
27.02.2014, 23:19:25
    #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
27.02.2014, 23:28:20
    #38574820
VFl
VFl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проектирование БД
Mity874,

заполнить надо сначала список возможных жанров (TABLE genre), потом список возможных авторов (TABLE author), потом занести в TABLE books первую книгу, а уже потом заполнять TABLE temp1 и TABLE temp2 (неудачные названия). База ругается видимо потому, что в temp1 в полях book_id и genre_id должны стоять значения, существующие в мастер-таблицах
...
Рейтинг: 0 / 0
27.02.2014, 23:48:41
    #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
27.02.2014, 23:50:57
    #38574826
VFl
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
27.02.2014, 23:57:54
    #38574829
VFl
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
28.02.2014, 00:15:31
    #38574832
Mity874
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проектирование БД
VFl,

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

И ещё вопрос, вот: "Подскажите в каких случаях нужно применять JOIN?".
...
Рейтинг: 0 / 0
28.02.2014, 00:28:39
    #38574837
VFl
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
28.02.2014, 00:29:09
    #38574838
Mity874
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проектирование БД
VFl,

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

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

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


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


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