了解具有外键和主键的数据库表引用

问题描述 投票:0回答:1

我对数据库逻辑还比较陌生,正在尝试弄清楚应该/不应该相互引用多个表。

我有一个表'Book',应该有列:

| '标题'| '流派'| '作者'| 'buyOption'| 'pubDate'

  1. 我希望每本书都有一种或多种体裁的可能性。
  2. 我希望每本书都有一位或多位作者。
  3. 我希望每本书都可以有1个或多个购买选项('buyOption')。
    • 以及每本书的每个购买选项(亚马逊,沃尔玛等)都有唯一的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   |
           |____________|___________|

(...花了一段时间才大声笑)

拥有标题表是否有意义?如果是这样,我可以使用它的主键来填充其他各种表,如图所示吗?

如果“购买选项”表将为每本书提供一堆不同的选项和相关的url,是否可以直接从主“书籍”表中获取buyBrand和buyUrl?最后,我只想要一个可以从中获取单元格数据的巨型表。现在,我正在尝试弄清楚如何用我的数据填充表,以及为每个数据填充哪些表。

(再次,我是数据库逻辑的新手,因此,如果我的措辞难以理解,我深表歉意)

database foreign-keys logic primary-key
1个回答
0
投票

您的设计看起来不太好。您正在描述书籍和流派,书籍和作者,书籍和选项之间的多对多关系。

在书中存储对相关体裁,作者和选项的引用不是正确的方法:每本书只能存储一个相关值(一种体裁,一个作者,一个选项),而您需要很多。相反,对于每个关系,您应该有一个单独的表,称为桥表,该表引用了关联。

另一方面,取决于书籍的信息(例如书名)应存储在书籍表中。

这里是书籍和流派的一个例子:

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'

对于每个多对多关系,应实现相同的逻辑/

© www.soinside.com 2019 - 2024. All rights reserved.