Sql 多对多关系的链接表
假设我想在一个城市中存储两个表,Sql 多对多关系的链接表,sql,sqlite,Sql,Sqlite,假设我想在一个城市中存储两个表,book和library CREATE TABLE IF NOT EXISTS book ( isbn TEXT PRIMARY KEY, book_title TEXT NOT NULL, id INT NOT NULL); CREATE TABLE IF NOT EXISTS library ( library_name TEXT PRIMARY KEY,
book
和library
CREATE TABLE IF NOT EXISTS book (
isbn TEXT PRIMARY KEY,
book_title TEXT NOT NULL,
id INT NOT NULL);
CREATE TABLE IF NOT EXISTS library (
library_name TEXT PRIMARY KEY,
location TEXT NOT NULL,
id INT NOT NULL)
这两个表之间的关系是多对多的。有时我想得到有特定书籍的图书馆,有时我想得到图书馆拥有的书籍。为此,我应该有一个如下所示的链接表,对吗
CREATE TABLE IF NOT EXISTS book_library (
book_id INT FOREIGN KEY REFERENCES book(id),
library_id INT FOREIGN KEY REFERENCES library(id));
为了让图书馆拥有ISBN为978-3-16-148410-0的图书,我应该做以下工作吗
SELECT libary_name FROM library WHERE id in (SELECT library_id FROM book_library WHERE book_id in (SELECT id FROM book WHERE isbn = "978-3-16-148410-0"));
获取图书馆的书名华丽图书馆
:
SELECT bool_title FROM book WHERE id in (SELECT book_id FROM book_library WHERE library_id in (SELECT id FROM library WHERE library_name = "Gorgeous Library"));
我想知道这是否是正确的方法和最有效的方法?这里,主键是图书中的isbn和图书馆中的名称, 搜索是基于Id的,这有点让人困惑 如果希望ISBN和库名称是唯一的,可以使用唯一约束 但是,您可以尝试联接而不是子查询。 选择其中一种方法是主观的——我已经阅读了这篇博文 对于此查询,联接为:
Select Distinct L.library_name from Library L
join Book_library BL ON L.Id= BL.Library_ID
join Book B on B.Id= BL.Book_Id
where B.ISBN = "978-3-16-148410-0"
这里的主键是图书中的isbn和图书馆中的名称, 搜索是基于Id的,这有点让人困惑 如果希望ISBN和库名称是唯一的,可以使用唯一约束 但是,您可以尝试联接而不是子查询。 选择其中一种方法是主观的——我已经阅读了这篇博文 对于此查询,联接为:
Select Distinct L.library_name from Library L
join Book_library BL ON L.Id= BL.Library_ID
join Book B on B.Id= BL.Book_Id
where B.ISBN = "978-3-16-148410-0"
架构和查询看起来是正确的。(但如果您知道子查询将只返回一个结果,则可以使用
=
而不是中的)
SQLite始终将连接实现为嵌套循环连接,因此具有连接的查询的性能通常类似于使用子查询的等效查询。
您应该以最明显和可维护的方式编写查询;只有当你有实际问题时,才对它们进行优化
通常,在用于查找的列上创建索引可能会使查询更快(对于任何类型的查询)。
要检查特定查询中是否实际使用了索引,请使用
找出哪个查询更快的唯一方法是测量它们。模式和查询看起来是正确的。(但如果您知道子查询将只返回一个结果,则可以使用=
而不是中的)
SQLite始终将连接实现为嵌套循环连接,因此具有连接的查询的性能通常类似于使用子查询的等效查询。
您应该以最明显和可维护的方式编写查询;只有当你有实际问题时,才对它们进行优化
通常,在用于查找的列上创建索引可能会使查询更快(对于任何类型的查询)。
要检查特定查询中是否实际使用了索引,请使用
找出哪个查询更快的唯一方法是测量它们。谢谢!原始模式看起来正常吗?对library
和book
表中的id
列进行索引是否会加快查询速度?SQLite和SQL Server查询优化器的工作方式不同。模式在我看来是正确的,但如果您基于ID进行搜索,请将它们设置为PK或唯一,因为我看到在多对多表book_库中,您引用了这些ID,因此它们应该是其他表的PK。为了防止book_库表中出现异常值,您可以将这两个FK设置为复合PK。谢谢!原始模式看起来正常吗?对library
和book
表中的id
列进行索引是否会加快查询速度?SQLite和SQL Server查询优化器的工作方式不同。模式在我看来是正确的,但如果您基于ID进行搜索,请将它们设置为PK或唯一,因为我看到在多对多表book_库中,您引用了这些ID,因此它们应该是其他表的PK。为了防止book_库表中出现异常值,您可以将这两个FK设置为复合PK。