0

我对数据库设计很陌生。

我有个疑问。这个问题非常基本。但请帮帮我。我将尝试通过一个例子来解释它。

假设,我把书放在一张桌子上,而他们的作者放在另一张桌子上(假设一本书只由一位作者(一对多)写,而一位作者可以写多本书(多对一))。我不知道如何准确链接表格以及应该自动增加什么?

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 等)而改变,但这是基本结构。

如果您决定采用多对多结构,您可以做几件事,其中一个创建第三个表,用于链接两个表,例如拥有许多作者的书籍:

tblBooks {
    bookId
    bookName
}

tblAuthors {
    authorId
    authorName
}

tblBookAuthors {
    bookId
    authorId
}

或者在其中一个表中有一个字段,该字段具有逗号分隔的作者 ID 字符串:

tblBooks {
    bookId
    bookName
    authorIds
}

tblAuthor {
    authorId
    authorName
}

authorIds就像1,12,32,在这种情况下,您必须使用数据库函数来选择该集合中的作者,例如 MYSQLfind_in_set(tblAuthors.authorId,tblBooks.authorIds)的第一个参数是搜索,第二个是您正在搜索的数据集

决定多对多结构中哪个表获取带有逗号分隔 id 的字段的方法是不经常删除外国 id 的表,例如作者通常不会被删除或添加到书中所以它获取列表字段。

于 2013-06-04T17:13:58.350 回答
3

@Patrick evans 是正确的。链接字段在子表中。为你铺垫,

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

Field3例如,可以将其放入tblBooks并调用,authorId定义为外键。您可以添加这样的约束

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

在这种情况下bookId不应该是唯一的,因为在表中会有几个tblBooks相同的输入authorId

顺便说一句,外键是一个表中的一个字段(或字段集合),它唯一地标识另一个表的一行。

于 2013-06-04T17:14:26.207 回答