Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.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
Mysql 如何在SQL中创建3个表(2到1)之间的关系表_Mysql_Sql_Sql Server_Database_Database Design - Fatal编程技术网

Mysql 如何在SQL中创建3个表(2到1)之间的关系表

Mysql 如何在SQL中创建3个表(2到1)之间的关系表,mysql,sql,sql-server,database,database-design,Mysql,Sql,Sql Server,Database,Database Design,假设我们的数据库中有3个表 表格: table books: book_id book_title ... table magazines: magazine_id magazine_title ... and genres: genre_id: genre_name table book_genres: genre_id book_id table magazine_genre: genre_id magazine_id 现在我们说想知道什么书有什么类型,什么杂志有什么类型,


假设我们的数据库中有3个表


表格:

table books:
book_id
book_title
...


table magazines:
magazine_id
magazine_title
...


and genres:
genre_id:
genre_name
table book_genres:
genre_id
book_id


table magazine_genre:
genre_id
magazine_id

现在我们说想知道什么书有什么类型,什么杂志有什么类型,这是我知道的两张桌子的方式


关系表:

table books:
book_id
book_title
...


table magazines:
magazine_id
magazine_title
...


and genres:
genre_id:
genre_name
table book_genres:
genre_id
book_id


table magazine_genre:
genre_id
magazine_id

通过这种方式,我们必须创建几个单独的表格,用于连接书籍、杂志和可能更多的表格。我被告知在连接表中总是有两个id列

但是我想知道我是否可以做这样的事情


那张桌子坏了

table title_genres:
genre_id
book_id
magazine_id
...

这更简单,但是当我插入一个图书类型时,我得到了一个错误,它说
magazid
不能为空
NULL
,因为它的主键是空的。 这会让我省下创建大量表格的时间。比如,如果我决定建立一个分类表,那么我必须分别加入图书和杂志。
我的问题是:两栏是一种好的做法还是有更好的方法?

如果您有一个包含(书籍、杂志等)等信息的类别字段,您完全可以用这种方法存储记录。换句话说,表是按类别字段垂直分区的,但逻辑上它是一个表

我能看到的唯一缺点是,如果这个表增长很快,那么查询性能将是一个问题,因为(a)这个表会很大,所以即使您只查找特定类别,而不是所有类别,它也会消耗更多内存(b)您必须始终使用内联子查询,因为每次都必须为每个联接应用类别筛选器,并且当您为联接使用内联查询时,数据库将无法使用索引,这将影响查询的性能


注意:您将无法以任何其他方式存储记录。例如,即使一本杂志和一本书具有相同的类型,您也必须将它们放在不同的行中,而不是同一行中,因为如果您这样做,您的模型将陷入其他类型的麻烦。

如果您有一个包含(书籍、杂志等)等信息的类别字段,则绝对可以以这种方式存储记录。换句话说,表是按类别字段垂直分区的,但逻辑上它是一个表

我能看到的唯一缺点是,如果这个表增长很快,那么查询性能将是一个问题,因为(a)这个表会很大,所以即使您只查找特定类别,而不是所有类别,它也会消耗更多内存(b)您必须始终使用内联子查询,因为每次都必须为每个联接应用类别筛选器,并且当您为联接使用内联查询时,数据库将无法使用索引,这将影响查询的性能


注意:您将无法以任何其他方式存储记录。例如,即使一本杂志和一本书具有相同的类型,您也必须将它们放在不同的行中,而不是同一行中,因为如果这样做,您的模型将陷入其他类型的麻烦。

您使用桥接表来表示m:n关系。如果一本书可以有多种体裁,而一本杂志可以有多种体裁,那么您需要像所显示的
book\u体裁
表这样的桥接表

如果书籍与数据库中的杂志非常不同,那么是的,为书籍和杂志设置单独的表格

这导致了两个桥接表,正如你所描述的,我看不出这有什么错

你的想法是有一个桥表通常是可能的,但不能解决任何问题

但是,让我们看看如何构造这样一个多桥表。首先,您需要一个检查约束,确保始终恰好填充了
book\u id
magazine\u id
列中的一列。然后您需要对
合并(图书id、杂志id)、流派id
进行唯一约束。这通常是通过函数索引完成的,据我所知,MySQL不支持函数索引。不过,我想您可以创建一个生成的列,您可以在MySQL中对其进行索引

然后你想尽快阅读这些关系。使用像
book\u genres
这样的桥接表,您可以为每本书和每种类型创建一行,并创建一个索引,以尽快获得关系。使用类似于
title\u-tyres
的多桥表,您不需要。您有一个表,其中包含您感兴趣的关系和其他您不感兴趣的关系。你需要一个像这样的部分索引

create unique index idx on title_genres (book_id, genre_id) where book_id is not null;
但是MySQL不支持部分索引。你可以

create unique index idx on title_genres (book_id, genre_id);
这导致了一个更大的指数,但服务的目的。你对我也会这么做

create unique index idx2 on title_genres (magazine_id, genre_id);

现在,通过这些工作,你得到了什么?您的数据库比简单的
图书类型
杂志类型
表格要复杂得多。保持简单。使用这两个表而不是多桥怪物:-)

您可以使用桥表来表示m:n关系。如果一本书可以有多种体裁,而一本杂志可以有多种体裁,那么您需要像所显示的
book\u体裁
表这样的桥接表

如果书籍与数据库中的杂志非常不同,那么是的,为书籍和杂志设置单独的表格

这导致了两个桥接表,正如你所描述的,我看不出这有什么错

你的想法是有一个桥表通常是可能的,但不能解决任何问题

但是,让我们看看如何构造这样一个多桥表。首先,您需要一个检查约束,确保始终恰好填充了
book\u id
magazine\u id
列中的一列。然后您需要对
合并(图书id、杂志id)、流派id
进行唯一约束。这通常是通过函数索引完成的,据我所知,MySQL不支持函数索引。不过,我想您可以创建一个生成的列,您可以在MySQL中对其进行索引

然后你想读一下相关的