Разбираемся со ссылками на таблицы базы данных с помощью внешних и первичных ключей - PullRequest
0 голосов
/ 30 мая 2020

Я относительно новичок в базе данных logi c и пытаюсь понять, как несколько таблиц должны / не должны ссылаться друг на друга.

У меня есть таблица «Книга», в которой должны быть столбцы:

| 'title' | 'genre' | 'author' | 'buyOption' | 'pubDate'
  1. Я хочу, чтобы каждая книга могла иметь один или несколько жанров.
  2. Я хочу, чтобы у каждой книги была возможность иметь 1 или более авторов.
  3. Я хочу, чтобы у каждой книги была возможность иметь 1 или несколько вариантов покупки ('buyOption').
    • и каждый вариант покупки (Amazon, Walmart и т. Д. c.) Для каждой книги имеет уникальный 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 прямо из основной таблицы «Книга»? В конце концов, мне просто нужна гигантская таблица, из которой я могу брать данные ячеек. Прямо сейчас я пытаюсь понять, как заполнять таблицы моими данными и какие таблицы заполнять для каждого фрагмента данных.

(опять же, я новичок в базе данных logi c, поэтому я извиняюсь, если мою формулировку сложно понять)

1 Ответ

1 голос
/ 30 мая 2020

Ваш дизайн выглядит не очень хорошо. Вы описываете отношения "многие ко многим" между книгами и жанрами, книгами и авторами, книгами и вариантами.

Сохранение ссылок на родственный жанр, автора и вариант в таблице книг - неправильный способ go: вы можете хранить только одно связанное значение для каждой книги (один жанр, один автор, один вариант), а вам нужно много. Вместо этого для каждого из этих отношений у вас должна быть отдельная таблица, называемая таблицей мостов, которая ссылается на ассоциации.

С другой стороны, информация, которая зависит от книги (например, название), должна храниться в таблице книг.

Вот один пример для книг и жанров:

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'; вы бы go:

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'

Один и тот же лог c должен быть реализован для всех без исключения отношений «многие ко многим» в вашей схеме.

...