7

単純なデータベースに著者を保存する方法を考えています (複数の著者がいる場合)。

1 冊 1 冊の著者が 1 人の場合、すべてが簡単です。問題は、テーブルBooksが必要で、テーブルAuthorsとの単純な選択と結合を行う可能性が必要な場合です。

書籍

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

著者

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

これと同じ ISBN と TITLE で別の行を使用できることはわかっていますが、タイトルが非常に大きくなる可能性がある場合 (255 の長さの UTF 文字列/varchar/char) に備えて、それは良い考えだと思います。

おそらくこれは非常に基本的な問題であることを知っているので、それについて質問しなければならないことを申し訳ありません:(

4

4 に答える 4

9

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.id と author.id だけでなく、books.book_id と author.author_id を使用する必要があります。

于 2012-11-12T23:31:31.943 に答える
7

本には複数の著者がいる可能性があり、著者は複数の本を書くことができるため、Books テーブルと Authors テーブルの間には多対多の関係をお勧めします。

次のように、2 つをリンクする別のテーブルを追加します。

書籍の著者

| | ブック ID | 作成者 ID |

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'
于 2012-11-12T23:26:54.093 に答える
3

あなたには 2 つの可能性があります。

  • 本ごとに多くの著者がいますが、各著者が持つことができる本は最大で 1 冊です (ほとんどありません)。このようにして、Author テーブルに外部キーを配置し、その著者を本にリンクします。このような 2 人の著者が同じ書籍 ID を持つこともできますが、書籍の詳細を複製する必要はなく、実際には書籍の ID 以外のものを複製する必要はありません。
  • より可能性が高い: 書籍ごとに多数の著者、および著者ごとに多数の書籍。これは「多対多の関係」と呼ばれ、別のテーブルを追加する必要があります。

それでは、ちょっと考えてみましょう。本にはすべての詳細と ID があります。各著者には多くの詳細と ID があります。著者を本に関連付けたい場合は、別のテーブルに行を追加します。たとえば、「Credits」と呼ばれます。

  • 各著者は多くのクレジットを持つことができますが、各クレジットは 1 人の著者のものです。
  • 同様に、各本の表紙には多くのクレジットを掲載できますが、各クレジットはその本にのみ掲載されます。

こうすることで、2 つの 1 対多の関係 (著者からクレジットへ、および本からクレジットへ) が得られ、厄介な複数値なしで必要なものを表すことができます。

于 2012-11-12T23:28:24.027 に答える
1

という別のテーブルが必要ですが、BooksBookAuthorの列は必要ありませんAuthors

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

BookID は Books の PK (BookID) を参照し、AuthorID は Authors の 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
于 2012-11-12T23:27:24.787 に答える