sql—使用外键和主键理解数据库表引用

b1uwtaje  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(437)

我对数据库逻辑比较陌生,正在尝试弄清楚多个表应该/不应该互相引用。
我有一个表“book”,应该有列:

| 'title' | 'genre' | 'author' | 'buyOption' | 'pubDate'

我希望每本书都有可能有一个或多个流派。
我希望每本书都有可能有一个或多个作者。
我希望每本书都有可能有一个或多个购买选项(“购买选项”)。
而且每本书的每个购买选项(亚马逊、沃尔玛等)都有一个唯一的url。
我认为有道理(请纠正我的错误):

__________________________
   |                        |
   |           Book         |
   |________________________|
   |Primary Key | book_id   | //seems redundant (same as title_id)...would like to just use title_id, but idk if that's possible
   |------------|-----------|
   |Foreign Key | title_id  | <--------------------------------------------|
   |Foreign Key | bo_id     | <----------------------------------|         |
   |Foreign Key | genre_id  | <--------------------------|       |         |
   |Foreign Key | author_id | <-------------------|      |       |         |
   | - - - - -  | - - - - - |                     |      |       |         |
   |            | pubDate   | //publish date      |      |       |         |
   |________________________|                     |      |       |         |
                                                  |      |       |         |
                                                  |      |       |         |
                                                  |      |       |         |
      __________________________                  |      |       |         |
      |                        |                  |      |       |         |
      |         Authors        |                  |      |       |         |
      |________________________|                  |      |       |         |
      |Primary Key | author_id |------------------|      |       |         |
      |------------|-----------|                         |       |         |    
 |--->|Foreign Key | title_id  |                         |       |         |
 |    | - - - - -  | - - - - - |                         |       |         |
 |    |            |  author   |                         |       |         |
 |    |____________|___________|                         |       |         |
 |                                                       |       |         |
 |                                                       |       |         |
 |    __________________________                         |       |         |
 |    |                        |                         |       |         |
 |    |         Genres         |                         |       |         |
 |    |________________________|                         |       |         |
 |    |Primary Key |  genre_id |-------------------------|       |         |
 |    |------------|-----------|                                 |         |
 |--->|Foreign Key |  title_id |                                 |         |
 |    | - - - - -  | - - - - - |                                 |         |
 |    |            |   genre   |                                 |         |
 |    |____________|___________|                                 |         |
 |                                                               |         |
 |    __________________________                                 |         |
 |    |                        |                                 |         |
 |    |       Buy Options      |                                 |         |
 |    |________________________|                                 |         |
 |    |Primary Key |  bo_id    |---------------------------------|         |
 |    |------------|-----------|                                           |
 |--->|Foreign Key | title_id  |                                           |
 |    | - - - - -  | - - - - - |                                           |
 |    |            | buyBrand  |   //(Walmart, Amazon, etc.)               |                   
 |    |            | buyUrl    |   //(ex: https://www.amzn.com/buyBook1)   |
 |    |____________|___________|                                           |
 |                                                                         |
 |                                                                         |
 |                                                                         |
 |         __________________________                                      |
 |         |                        |                                      |
 |         |          Title         |                                      |   
 |         |________________________|                                      |
 |---------|Primary Key | title_id  |--------------------------------------|
           |------------|-----------|                                           
           |            |   title   |
           |____________|___________|

有标题表有意义吗?如果是这样,我可以使用它的主键来填充其他各种表吗,如图所示?
如果“buy options”表中的每本书都有一堆不同的选项和关联的url,那么是否可以直接从主“book”表中获取buybrand和buyurl?最后,我只想要一个巨大的表格,我可以从中获取细胞数据。现在,我正在尝试找出如何用我的数据填充表,以及为每一段数据填充哪些表。
(同样,我对数据库逻辑还不熟悉,所以如果我的措辞难以理解,我深表歉意)

uklbhaso

uklbhaso1#

你的设计不好看。你在描述书与流派、书与作者、书与选项之间的多对多关系。
在books表中存储对相关流派、作者和选项的引用不是正确的方法:每本书只能存储一个相关值(一个流派、一个作者、一个选项),而您需要很多。相反,对于这些关系中的每一个,您应该有一个单独的表,称为桥表,它引用这些关联。
另一方面,依赖于图书(比如书名)的信息应该存储在图书表中。
以下是书籍和体裁的一个例子:

create table books(
    book_id int primary key,
    title varchar(100),  --dependent column
    pub_date date        --dependent column
);

create table genres(
    genre_id int primary key,
    name varchar(100)
);

create table book_genres(
    book_id int references book(book_id),
    genre_id int references genre(genre_id),
    primary key (book_id, genre_id)
);

现在,假设你想列出所有属于流派的书 'Sci-Fi' ; 你会去:

select b.*
from books b
inner join book_genres bg on bg.book_id = b.book_id
inner join genres g on g.genre_id = bg.genre_id
where g.name = 'Sci-Fi'

应该为模式中的每个多对多关系实现相同的逻辑。

相关问题