Как записать в базу данных нескольких авторов в таблицу простых книг?

Мне интересно, как мне сохранять авторов (в случае, когда их несколько) в простой базе данных.

Если у одной книги есть один автор, все легко. Проблема в том, когда я хочу за столомкниги и хотите иметь возможность делать простые выборки и объединения с таблицейАвторы :

книги

| id  | Title | ISBN | Authors? | 
---------------------------------
|     |       |      |          |
|     |       |      |          |

Авторы

| id  | Firs Name | Last Name | Short Name | Pseudonym | 
--------------------------------------------------------
|     |           |           |            |           |
|     |           |           |            |           |

Я знаю, что могу использовать отдельные строки с одним и тем же ISBN и TITLE, однако мне интересно, будет ли это хорошей идеей в случае, когда title может быть очень большим (строка UTF длиной 255 / varchar / char).

Я знаю, что, вероятно, это очень простая проблема, поэтому извините, что я должен спросить об этом :(

Ответы на вопрос(4)

Вам нужен еще один стол с именемBookAuthorты нене нужноAuthors колонка в Книгах

BookAuthor
------------
BookID
AuthorID

Где BookID ссылается на PK (BookID) в Книгах, а AuthorID ссылается на PK (AuthorID) в Авторах

Select b.Title, CONCAT(a.[First Name], a.[Last Name]) As AuthorName
From Books b
JOIN BookAuthor ba ON b.ID = ba.BookID
JOIN Authors a ON ba.AuthorID = a.ID

Избавиться отauthors столбец в.books

Между книгами и авторами много-много взаимосвязей: у некоторых книг есть несколько авторов, а некоторые авторы написали более одной книги. И у книг есть первый, второй и третий авторы и так далее. Ты нене удается отобразить имена авторов для книги в некотором непредсказуемом порядке. Авторы и издатель определяют порядок авторов, а не программист dbms.

Итак, вам нужноbooks_authors таблица со следующими столбцами

  book_id
  author_id
  author_ordinal   (a number like 1,2,3 to denote the order of authors)

Вы можете получить список авторов для конкретной книги с этим запросом:

 SELECT isbn, title, author_ordinal, first, last
   FROM books b
   LEFT JOIN books_authors ba ON (b.id = ba.book_id)
   LEFT JOIN authors a ON (ba.author_id = a.id)
  WHERE isbn = '978whatever'
  ORDER BY author_ordinal

Вы'Также было бы целесообразно поместить текстовое поле под названиемrole в вашей таблице books_authors, если вы хотите сделать свое программное обеспечение библиографически завершенным. Люди играют разные роли в создании книг, таких какавтор,» 'иллюстратор,' 'редактор,' 'редактор сериала,' 'вкладчик» 'предисловие автора и так далее.role колонка позволит вам захватить эту информацию.

Кстати, большинство инструментов обратного инжиниринга dbms будут НАМНОГО счастливее, если вы будете постоянно называть свои столбцы id. Поэтому вы должны использовать books.book_id иhors.author_id, а не просто books.id иhors.id.

 noisy13 нояб. 2012 г., 00:35
очень хороший момент о порядке авторов :)

У вас есть две реальные возможности:

В каждой книге много авторов, но у каждого автора может быть не более одной книги (очень маловероятно) - таким образом, вы 'положуиностранный ключ в таблице Автор, связывая этого автора с книгой. У вас может быть два таких автора с одинаковым идентификатором книги, но это означает, что вы нене нужно дублировать детали книги или вообще что-то большее, чем книгаS IDБолее вероятно: много авторов на книгу и много книг на автора. Это называетсяотношения многие ко многими требует, чтобы вы добавили еще одну таблицу.

Так что давайте'Подумайте об этом на секунду: в книге есть все детали и удостоверение личности. У каждого автора есть много деталей и удостоверение личности. Если вы хотите связать автора с книгой, добавьте строку в другую таблицу,Скажем, называется "Кредиты».

Каждый автор может иметь много кредитов, но каждый кредит для одного автора.Точно так же каждая книга может иметь много кредитов на обложке, но каждый кредит есть только на этой книге.

Таким образом, у вас есть два отношения «один ко многим» (от автора к кредитам и от книги к кредитам), и вы можете представлять то, что вам нужно, без каких-либо неловких многозначностей.

Поскольку книга может иметь несколько авторов, а автор может написать более одной книги, яя бы предложил связь между многими из таблиц Книги и Авторы.

Добавьте еще одну таблицу, которая связывает их, вот так:

BookAuthors

| BookID | AuthorID |

BookID является внешним ключом для Books.id, а AuthorID является внешним ключом для Authors.id.

Если вы хотите вернуть всех авторов для данной книги, вы можете сделать что-то вроде:

SELECT Authors.id, Authors.FirstName, Authors.LastName
FROM Authors INNER JOIN BookAuthors ON Authors.id = BookAuthors.AuthorID
WHERE BookAuthors.BookID = '123'

Ваш ответ на вопрос