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中对其进行索引
然后你想读一下相关的