Первичные ключи и нормализация - PullRequest
0 голосов
/ 16 июня 2020

Мне нужно нормализовать свою базу данных до BCNF, но меня немного смущает 1NF.

Моя основная таблица посвящена видеоиграм, и она выглядит так:

game_id(PK, AI)    title    developer_id(FK)    publisher_id(FK)    genre                   modes                               release_date  
    1              XYZ          3                   5               FPS, Battle Royale      Single-player, multiplayer          2019-02-04

Меня беспокоят столбцы "режимы" и "жанр", потому что иногда у меня есть несколько значений, так что это не atomi c, верно? В этом комментарии говорится то же самое Объясните, что мне пять -> Как первичный ключ соответствует первой нормальной форме НО в комментарии прямо под ним говорится об обратном ...

Я читал о нормализации и я нашел этот пример таблицы в 1NF. Оглядываясь на свою таблицу, я понял, что не могу сделать то же самое, потому что у меня есть «id», который является PK, поэтому у него не может быть повторяющихся значений. Другие источники говорят, что если у вас есть ПК, это означает, что таблица находится в 1NF, потому что все строки разные.

Я думаю о создании еще двух таблиц, где я храню только «режимы», которые (Single -player / Multiplayer / Single-player, multiplayer) и «жанры». Но как мне вставить 'mode_id' в качестве FK в таблицу 'game', если, опять же, у игры есть только один 'id', который также является PK? ? А для NF3 я должен создать еще две таблицы, в которых я храню отношения nm между режимами игр и жанрами игр ...

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

1 Ответ

1 голос
/ 16 июня 2020

Комментарий, который вы связали, правильный, комментарий ниже, который неверен.

1NF говорит, что каждый атрибут должен быть atomi c (что обычно подразумевается семантически, а не технически. Технически, строка " FPS, Battle Royale "такой же atomi c, как и любой другой, потому что технически любая строка такая же atomi c, как и любая другая.

Но 1NF подразумевается семантически: вы не должны хранить несколько значений в одном столбец одной строки.

Самый простой способ сделать вашу таблицу 1НФ - это просто преобразовать ее в

game_id(PK, AI)    title    developer_id(FK)    publisher_id(FK)    genre          modes                               release_date  
1                  xyz      3                   5                   FPS            Single-player          2019-02-04
1                  xyz      3                   5                   FPS            multiplayer          2019-02-04
1                  xyz      3                   5                   Battle Royale  Single-player          2019-02-04
1                  xyz      3                   5                   Battle Royale  multiplayer          2019-02-04

Конечно, это только 1НФ. Полностью нормализованный, это должно быть что-то по:

table GAMES
game_id(PK, AI)    title    developer_id(FK)    publisher_id(FK)    release_date  
1                  xyz      3                   5                   2019-02-04

table GENRES
genre_id(PK)       name
1                  FPS
2                  Battle Royale

table MODES
mode_id(PK)        name
1                  Single-player
2                  multiplayer

table GAME_GENRE
id      game_id      genre_id
1       1            1
2       1            2

table GAME_MODE
id      game_id      mode_id
1       1            1
2       1            2

``




...