2013-10-03 17 views
0

這是一個問題,我的朋友在他的電話採訪與亞馬遜問。設計一個關係數據庫來記錄書籍,書籍可以有多個作者,作者可以發佈多本書籍。他被要求設計關係(表格)和每個屬性的類型(無論是文本,字符串等) 問題是他們也希望能夠搜索作者姓名和書名。 我知道,這樣的事情就不會是非常有效:關係數據庫爲多個作者多本書

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 

什麼其他類型的更好,而不是使用文本類型在這裏的那些屬性?

回答

2

基本的第三種標準形式就像這樣使用交叉表。在關係表中存儲逗號分隔值總是一個錯誤。

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索引以便於搜索。如果你是亞馬遜,你可能會希望創建一些輔助表,以方便在不同表中搜索屬性。

1

您應該使用關係表將作者鏈接到書籍,而不是在每個表格中放置一個ID列表。

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

要獲得作者書籍或書籍作者的書籍,請使用三維連接,例如,

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'; 
1

我會做這樣的:

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 = ?) 

,類似的書名搜索...