我对数据库设计很陌生。
我怀疑。这个问题非常基础。但请帮帮我。我将试图通过一个例子来证明它。
假设,我在一张桌子上拿到了书,在另一张桌子里找到了他们的作者(假设一本书只由一位作者(一对多)写成,一位作者可以写多本书(多对一))。 我没有得到如何精确地链接表和什么应该自动递增?
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?
}
帮助表示赞赏
答案 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
。
顺便说一下,外键是一个表中的一个字段(或字段集合),它唯一地标识另一个表的一行。