【问题标题】:Making sense of database table references with foreign and primary keys理解带有外键和主键的数据库表引用
【发布时间】:2020-09-17 14:50:22
【问题描述】:

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

我有一个表“书”,它应该有列:

| 'title' | 'genre' | 'author' | 'buyOption' | 'pubDate'
  1. 我希望每本书都有可能拥有一种或多种类型。
  2. 我希望每本书都有可能拥有一位或多位作者。
  3. 我希望每本书都有一个或多个购买选项('buyOption')。
    • 并且每本书的每个购买选项(亚马逊、沃尔玛等)都有一个唯一的网址。

我认为有道理的地方(请纠正我的错误):

   __________________________
   |                        |
   |           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   |
           |____________|___________|

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

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

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

【问题讨论】:

  • FK 是表中的一组列,其子行值在另一个列中出现一次,即参与一个关系(船舶)/关联,而这些列参与另一个列。与所有其他类型的约束(包括 PK 和基数)一样,只要其他声明未暗示 FK 约束,就会声明 FK 约束。它们用于 DBMS 实现完整性,不需要记录或查询。
  • 您认为这里的合理答案是什么?现在你只是要求我们用定制的教程重写一本教科书。是时候关注已出版的关于信息建模、关系模型和数据库设计的学术教科书了。 (记录和使用设计的语言和工具的手册不是这样的教科书。)(维基文章或网络帖子也不是。)问一个特定的研究过的非重复问题。

标签: sql database database-design foreign-keys many-to-many


【解决方案1】:

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

在 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'

应该为架构中的每一个多对多关系实现相同的逻辑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    • 2014-04-12
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多