|
|
|
Проектирование БД
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, хочу попросить помощи в создании базы данных. Требуется создать базу данных книг. В базе должно хранится (Название книги на русском, её название на английском, описание, жанр, автор). У меня проблема возникла в том, что жанров и авторов у книги может быть несколько и проблема в том, как это все реализовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2014, 17:20:16 |
|
||
|
Проектирование БД
|
|||
|---|---|---|---|
|
#18+
Mity874, связь многие ко многим ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2014, 17:21:49 |
|
||
|
Проектирование БД
|
|||
|---|---|---|---|
|
#18+
Это ясно, а что дальше? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2014, 17:25:29 |
|
||
|
Проектирование БД
|
|||
|---|---|---|---|
|
#18+
Mity874, а дальше создавайте базу :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2014, 17:26:48 |
|
||
|
Проектирование БД
|
|||
|---|---|---|---|
|
#18+
Mity874, наверное надо таблицы создать... или в чем сложность то ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2014, 17:26:58 |
|
||
|
Проектирование БД
|
|||
|---|---|---|---|
|
#18+
Я не понимаю, как указать, что одна книга относится к нескольким жанрам и что у неё несколько авторов. В одной ячейке таблицы ведь можно писать, только 1 значение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2014, 17:29:25 |
|
||
|
Проектирование БД
|
|||
|---|---|---|---|
|
#18+
Mity874Я не понимаю, как указать, что одна книга относится к нескольким жанрам и что у неё несколько авторов. В одной ячейке таблицы ведь можно писать, только 1 значение. Для этого создаётся третья таблица, куда заносятся уникальные пары книга-жанр. Хотя по отдельности и книги, и жанры там дублируются. В общем, почитайте хоть что-нибудь про связи много-ко-много... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2014, 17:34:42 |
|
||
|
Проектирование БД
|
|||
|---|---|---|---|
|
#18+
Почитал про связь многие ко многим, как я понял решение моей пробелемы выглядит вот так? http://firepic.org/][img] http://4.firepic.org/4/images/2014-02/27/opb1il5265yj.png [/img] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2014, 21:58:48 |
|
||
|
Проектирование БД
|
|||
|---|---|---|---|
|
#18+
А можете объяснить почему лучше так сделать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2014, 22:17:15 |
|
||
|
Проектирование БД
|
|||
|---|---|---|---|
|
#18+
Mity874, Потому что иначе будут храниться непонятные данные - книга к автору и одновременно к жанру. Если, например, 2 автора и 1 жанр, или 3 жанра и 3 автора. Сколько записей вам понадобиться? Вам же нужна привязка только жанр к книге и отдельно автор к книге. При предложенном вами хранении придется делать SELECT DISTINCT или SELECT .. GROU BY, что бы вытащить из общей таблицы только авторов книги, или только жанр книги, без повторяющихся данных. А это затратно по ресурсам сервера и усложняет запросы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2014, 22:31:37 |
|
||
|
Проектирование БД
|
|||
|---|---|---|---|
|
#18+
VFl, Кстати, ещё уточнить хочу. Столбец book_id тоже внешним ключем будет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2014, 22:41:57 |
|
||
|
Проектирование БД
|
|||
|---|---|---|---|
|
#18+
Mity874VFl, Кстати, ещё уточнить хочу. Столбец book_id тоже внешним ключем будет? Да, так будет лучше, позволяет следить за корректностью данных, что бы мусор в базе не копился (типа списка жанров к несуществующей/удаленной книге), и для оптимизации запросов. Можно указать, что бы жанры и авторы к книге удалялись автоматически, если книгу удалили из базы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2014, 22:48:52 |
|
||
|
Проектирование БД
|
|||
|---|---|---|---|
|
#18+
Я создал таблицы вот такими командами, когда начал заполнять таблицы значениями, вывалилась ошибка при заполнении таблицы 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)); Как мне быть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2014, 23:19:25 |
|
||
|
Проектирование БД
|
|||
|---|---|---|---|
|
#18+
Mity874, заполнить надо сначала список возможных жанров (TABLE genre), потом список возможных авторов (TABLE author), потом занести в TABLE books первую книгу, а уже потом заполнять TABLE temp1 и TABLE temp2 (неудачные названия). База ругается видимо потому, что в temp1 в полях book_id и genre_id должны стоять значения, существующие в мастер-таблицах ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2014, 23:28:20 |
|
||
|
Проектирование БД
|
|||
|---|---|---|---|
|
#18+
Да, вы правы. Базу смог заполнить, теперь проблема с составлением запроса на извлечение данных. Составил вот такой запрос, но по нему возвращается не название жанра книги, а индекс записанный в таблице temp1. SELECT book.org_name, book.name, temp1.genre_id FROM book INNER JOIN temp1 ON book.book_id=temp1.book_id; Помогите с этим разобраться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2014, 23:48:41 |
|
||
|
Проектирование БД
|
|||
|---|---|---|---|
|
#18+
К слову, лучше было бы 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2014, 23:50:57 |
|
||
|
Проектирование БД
|
|||
|---|---|---|---|
|
#18+
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 ; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2014, 23:57:54 |
|
||
|
Проектирование БД
|
|||
|---|---|---|---|
|
#18+
VFl, Спасибо вам огромное, очень сильно помогли. И ещё вопрос, вот: "Подскажите в каких случаях нужно применять JOIN?". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2014, 00:15:31 |
|
||
|
Проектирование БД
|
|||
|---|---|---|---|
|
#18+
Рад, что сумел помочь. 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2014, 00:28:39 |
|
||
|
Проектирование БД
|
|||
|---|---|---|---|
|
#18+
VFl, И кстати я не понимаю, если запрос делатся через 3 таблицы, то зачем бы устанавливали внешний ключ? Получается он нужен только для сохранения целостности данных? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2014, 00:29:09 |
|
||
|
Проектирование БД
|
|||
|---|---|---|---|
|
#18+
Mity874зачем бы устанавливали внешний ключ? Получается он нужен только для сохранения целостности данных? Да, главным образом для этого. Он позволяет автоматизировать соблюдение целостности данных. Говорят, что еще помогает более быстро выдавать данные, но это только для больших баз данных важно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2014, 00:37:20 |
|
||
|
Проектирование БД
|
|||
|---|---|---|---|
|
#18+
Mity874, а хотите проблему "разом решить"? С минимальной головной болью? Если уж совсем не знаете с чего начать... Тогда вам нужно обратиться к тем, у кого есть опыт в разработке БД. Поставить им ТЗ, договориться о цена и.. вперед! Нет проблем!!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2014, 09:22:22 |
|
||
|
Проектирование БД
|
|||
|---|---|---|---|
|
#18+
RenVoldMity874, а хотите проблему "разом решить"? С минимальной головной болью? Если уж совсем не знаете с чего начать... Тогда вам нужно обратиться к тем, у кого есть опыт в разработке БД. Поставить им ТЗ, договориться о цена и.. вперед! Нет проблем!!!! Минимальная головная боль это не мой выход и счастью есть добрые люди, которые могут помочь разобраться в новой сфере. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2014, 17:18:04 |
|
||
|
Проектирование БД
|
|||
|---|---|---|---|
|
#18+
ради теста своей программы (My Visual Database) сделал подобный проект со связью многие ко многим, а то как то не было случая протестировать это можно забрать отсюда http://drive-software.com/hlam/BooksandAuthors.zip правда не стал делать связь многие ко многим для жанров, только для автора и книги. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2014, 18:02:22 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38574829&tid=1835164]: |
0ms |
get settings: |
7ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
38ms |
get topic data: |
5ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 231ms |
| total: | 352ms |

| 0 / 0 |
