2

これは、友人がアマゾンの電話インタビューで尋ねられた質問です。1 つの本に複数の著者がいて、1 人の著者が複数の本を出版できるように、本を記録するリレーショナル データベースを設計します。彼は、関係 (テーブル) と各属性のタイプ (テキスト、文字列など) を設計するように依頼されました。問題は、著者名と本のタイトルの両方を検索できるようにしたいということです。私はこのようなものはあまり効率的ではないことを知っています:

Table Autor 
AutorID AuthorName booksIDs(Text) Example:15, Morris Mano:11,56,234

Table Book
BookID Booktitle AuthorsID(Text) Example: 11:Computer Architecture: 15,34,88 

ここでこれらの属性に Text 型の代わりに使用するのに適した他の型は何ですか?

4

3 に答える 3

2

私はこれをしただろう:

Author (AuthorId, AuthorName, etc.)
    PK: AuthorId

Book (BookId, BookName, ISBN, Edition, etc)
    PK: BookId

AuthorBooks (AuthorId, BookId)
    PK: (AuthorId, BookId)
    FK: AuthorId from Author, BookId from Book (thanks to Justin's answer for reminding to add this)
    Another index on BookId to facilitate quick search by BookId.
    Note that the PK index can be used to search on AuthorId.

新しい本の追加:

  1. 作成者に挿入
  2. ブックに挿入
  3. AuthorBook に挿入

著者名による検索 (著者名が一意でないと仮定):

SELECT ab.*, b.*
FROM   AuthorBook ab, author a
WHERE  ab.AuthorId IN (SELECT AuthorId
                       FROM   Author 
                       WHERE  AuthorName = ?)

同様に本のタイトルで検索する場合...

于 2013-10-03T23:45:19.987 に答える
2

基本的な第 3 正規形は、交差テーブルを使用するこのようなものになります。コンマ区切りの値をリレーショナル テーブルに格納するのは、常に間違いです。

CREATE TABLE author (
  authorID integer primary key,
  authorName varchar2(100)
);

CREATE TABLE book (
  bookID integer primary key,
  bookTitle varchar2(100)
);

CREATE TABLE author_book (
  authorID integer,
  bookID   integer,
  constraint pk_author_book primary key( authorID, bookID )
);

実際には、検索を容易にするために、ほぼ確実に著者名を名、姓などに分割します。Oracle を使用している場合は、検索を容易にするために、おそらく Oracle Text 索引を作成するでしょう。また、Amazon の場合は、さまざまなテーブルの属性を簡単に検索できるように、いくつかの補助テーブルを作成することが必要になる可能性があります。

于 2013-10-03T23:42:09.107 に答える
1

各テーブルに ID のリストを配置するのではなく、関係テーブルを使用して著者と書籍をリンクする必要があります。

CREATE TABLE author_book (
    author_id INT,
    book_id INT,
    UNIQUE KEY (author_id, book_id)
);

著者の本または本の著者を取得するには、3 方向結合を使用します。

SELECT BookTitle
FROM Book b
JOIN author_book ab ON b.BooKID = ab.book_id
JOIN Author a ON a.AuthorID = ab.author_id
WHERE AuthorName = 'John Smith';
于 2013-10-03T23:42:46.390 に答える