DataBase设计:一对多数据库?

时间:2013-06-04 17:06:55

标签: database database-design one-to-many

我对数据库设计很陌生。

我怀疑。这个问题非常基础。但请帮帮我。我将试图通过一个例子来证明它。

假设,我在一张桌子上拿到了书,在另一张桌子里找到了他们的作者(假设一本书只由一位作者(一对多)写成,一位作者可以写多本书(多对一))。 我没有得到如何精确地链接表和什么应该自动递增?

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?

    }   

帮助表示赞赏

3 个答案:

答案 0 :(得分: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,在这种情况下你必须使用数据库函数来选择该集合中的作者,例如MYSQL有find_in_set(tblAuthors.authorId,tblBooks.authorIds),其中第一个参数是搜索,第二个是您正在搜索的数据集

决定多对多结构中哪个表使用逗号分隔的id获取字段的方法是经常删除外来ID的表,例如作者通常不会删除或添加到一本书,所以它得到了列表字段。

答案 1 :(得分: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
}

答案 2 :(得分:1)

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

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

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

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