0

私はデータベース設計に非常に慣れていません。

私は疑問を持っています。質問は非常に基本的なものです。しかし、私を助けてください。私は例を通してそれを説明しようとします。

1 つのテーブルに本があり、もう 1 つのテーブルにその著者がいるとします (1 つの本が 1 人の著者 (1 対多) によって書かれ、1 人の著者が多くの本 (多対 1) を書くことができると仮定します)。テーブルを正確にリンクする方法がわかりません。何を自動インクリメントする必要がありますか?

tblBooks     //Table 1 contains two entities
    {
     bookId      // This field is auto-incremented
     bookName
    }


tblAuthors    //Table 2
    {
     authorId    // Should this field also be auto-incremented?
     authorName
     Field3      // What should be the 'Field3' then which acts as link between both the tables?
                 // What exactly is foreign key? Here 'Field3' would be foreign key or what?

    }   

助けていただければ幸いです

4

3 に答える 3

6

"Many" テーブルは "One" テーブルの外部キーを取得します。

tblBooks {
    bookId   
    bookName
    authorId
}
tblAuthors {
    authorId  
    authorName
}  

クエリの例

//Grabs EVERY book that was made by an author with id 1
SELECT * FROM tblBooks where authorId='1' 

//Grabs the author of the book with id 223
SELECT * FROM tblAuthors where authorId=(SELECT authorId FROM tblBooks WHERE bookId='223')

//Joins the tables so each book will show its author
SELECT 
    tblBooks.bookId,
    tblBooks.bookName,
    tblAuthors.authorName
    tblAuthors.authorId 
FROM 
    tblBooks 
JOIN 
    tblAuthors 
ON 
    tblBooks.authorId=tblAuthors.authorId

使用するデータベース (mysql、oracle、sqlite など) によって構文が変わる可能性がありますが、それが基本的な構造です。

多対多の構造を採用することに決めた場合は、いくつかのことを行うことができます。1 つは、両方のテーブルをリンクするように機能する 3 番目のテーブルを作成します。たとえば、多くの著者がいる本などです。

tblBooks {
    bookId
    bookName
}

tblAuthors {
    authorId
    authorName
}

tblBookAuthors {
    bookId
    authorId
}

または、いずれかのテーブルにコンマで区切られた作成者 ID の文字列を持つフィールドがあります。

tblBooks {
    bookId
    bookName
    authorIds
}

tblAuthor {
    authorId
    authorName
}

authorIdsこの場合1,12,32、データベース関数を使用してそのセットの著者を選択する必要があります。たとえば、MYSQL ではfind_in_set(tblAuthors.authorId,tblBooks.authorIds)、最初の引数が検索で、2 番目の引数が検索するデータのセットです。

そして、多対多構造のどのテーブルがコンマで区切られた ID を持つフィールドを取得するかを決定する方法は、外部 ID が頻繁に追加されたり削除されたりしないテーブルです。リスト フィールドを取得します。

于 2013-06-04T17:13:58.350 に答える
3

@パトリック・エヴァンスは正しいです。リンク フィールドは子テーブルにあります。あなたのためにそれをレイアウトするには、

tblBooks     //Table 1 contains Books
{
 bookId     Primary Key // This field is auto-incremented
 bookName
 AuthorId   Foreign Key constraint references tblAuthors.AuthorId
}


tblAuthors    //Table 2
{
 authorId,  Primary Key // this field can also be auto-incremented
 authorName
}
于 2013-06-04T17:12:30.047 に答える
1

Field3tblBooksたとえば、authorId外部キーとして定義して配置して呼び出すことができます。このような制約を追加できます

ALTER TABLE tblBooks
ADD CONSTRAINT fk_author
FOREIGN KEY (authorId)
REFERENCES tblAuthors(authorId)

この場合bookId、テーブルtblBooksには同じauthorId.

ところで、外部キーは、別のテーブルの行を一意に識別する、あるテーブル内のフィールド (またはフィールドのコレクション) です。

于 2013-06-04T17:14:26.207 に答える