Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 多对多关系的链接表_Sql_Sqlite - Fatal编程技术网

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。