SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 20.03.2010 13:23:20

syscreat
Участник
Зарегистрирован: 20.03.2010
Сообщений: 6

Нормализация БД

Как организовать БД в которой, например, есть две таблицы:
1. Книги (Номер, Автор, Название)
2. Читатели (Номер, Имя, Прочтенные книги)

Вопрос в том какими должны быть связи между таблицами (прочтенных книг может быть много) и как это сделать в MySQL. Подскажите материалы.

Неактивен

 

#2 20.03.2010 14:36:22

Mirexzpalich
Завсегдатай
Зарегистрирован: 03.03.2010
Сообщений: 26

Re: Нормализация БД

можно сделать так:
1 таблица: Книги (Номер, Автор, Название)
2 таблица: Читатели (Номер, Имя)
3 таблица: Прочитано (Номер(соответствует номеру читателя),Номер(соответствует номеру прочитанной книги))

Неактивен

 

#3 20.03.2010 15:18:53

syscreat
Участник
Зарегистрирован: 20.03.2010
Сообщений: 6

Re: Нормализация БД

А как такое решение скажется на производительности БД, например, в случае когда каждому из десяти тысяч читателей будет соответствовать по десятку книг.
Практично ли использовать множество SET, и что делать если таких полей много (прочитанные книги, любимые книги...)?

Неактивен

 

#4 20.03.2010 17:48:57

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Нормализация БД

Mirexzpalich написал:

можно сделать так:
3 таблица: Прочитано (Номер(соответствует номеру читателя),Номер(соответствует номеру прочитанной книги))

Именно так делать и нужно.

Mirexzpalich написал:

Практично ли использовать множество SET, и что делать если таких полей много (прочитанные книги, любимые книги...)?

А как вы собираетесь использовать SET? Он может иметь максимум всего 64 члена.

Неактивен

 

#5 20.03.2010 18:07:22

Mirexzpalich
Завсегдатай
Зарегистрирован: 03.03.2010
Сообщений: 26

Re: Нормализация БД

syscreat написал:

А как такое решение скажется на производительности БД, например, в случае когда каждому из десяти тысяч читателей будет соответствовать по десятку книг.
Практично ли использовать множество SET, и что делать если таких полей много (прочитанные книги, любимые книги...)?

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

Неактивен

 

#6 20.03.2010 22:35:40

syscreat
Участник
Зарегистрирован: 20.03.2010
Сообщений: 6

Re: Нормализация БД

Т.е. выглядеть это должно как:
CREATE TABLE IF NOT EXISTS books (
book_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, author VARCHAR(16) NOT NULL,
name VARCHAR(16) NOT NULL)

CREATE TABLE IF NOT EXISTS readers (
reader_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(16) NOT NULL)

CREATE TABLE IF NOT EXISTS common (
reader INT NOT NULL,
book INT NOT NULL)

А как сейчас составить запрос на список пользователей по списку прочтенных книг (или по примеру кода нужно получить список пользователей и по списку прочтенных и по списку любимых книг)?

Неактивен

 

#7 20.03.2010 22:50:20

Mirexzpalich
Завсегдатай
Зарегистрирован: 03.03.2010
Сообщений: 26

Re: Нормализация БД

Т.е. вам надо, что для такой то книги вывести всех людей, прочитавших эту книгу?.
Тогда:
select books.name, readers.name from books,readers,common WHERE book_id=book AND reader_id=reader AND book='id книги'

Отредактированно Mirexzpalich (20.03.2010 22:52:01)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson