2016-04-22 4 views
1

Я создаю базу данных, которая имеет как минимум 5 таблиц в 3NF. Из того, что я могу собрать, база данных - это 3NF, когда я смотрю спецификации для daabase 3NF, но я не уверен на 100%, поэтому я спрашиваю здесь, и если это не интересно, как сделать это 3NF , поэтому я могу перейти и попробовать тестовые запросы, триггеры и процедуры в базе данных.Нормализация базы данных до 3NF

Я основываю свою работу на this образец базы данных, который, как я полагаю, находится в 3NF из моего понимания.

Любая помощь или совет вообще очень оценены, поскольку у меня была эта проблема в течение нескольких дней.

CREATE TABLE IF NOT EXISTS xbox (
    game_id char(4) NOT NULL default '', 
    game_name varchar(32) default NULL, 
    developer varchar(32) default NULL, 
    PRIMARY KEY (game_id) 
); 

INSERT INTO xbox (game_id, game_name, developer) VALUES 
('1001', 'Sunset Overdive', 'Insomniac Games'), 
('1002', 'Quantum Break', 'Remedy Entertainment'), 
('1003', 'Gears of War 4', 'The Coalition'), 
('1004', 'Halo 5', '343 Industries'), 
('1005', 'Forza 6', 'Turn10 Studios'); 


CREATE TABLE IF NOT EXISTS playstation (
    game_id char(4) NOT NULL default '', 
    game_name varchar(32) default NULL, 
    developer varchar(32) default NULL, 
    PRIMARY KEY (game_id) 
); 

INSERT INTO playstation (game_id, game_name, developer) VALUES 
('2001', 'Bloodborne', 'From Software'), 
('2002', 'The Witness', 'Thekla'), 
('2003', 'Destiny', 'Bungie'), 
('2004', 'Black Ops 3', 'Treyarch'), 
('2005', 'DriveClub', 'Evolution'); 


CREATE TABLE IF NOT EXISTS pc (
    game_id char(4) NOT NULL default '', 
    game_name varchar(32) default NULL, 
    developer varchar(32) default NULL, 
    PRIMARY KEY (game_id) 
); 

INSERT INTO pc (game_id, game_name, developer) VALUES 
('3001', 'Fallout 4', 'Bethesda'), 
('3002', 'Tomb Raider', 'Crystal Dynamics'), 
('3003', 'Overwatch', 'Blizzard'), 
('3004', 'Rocket League', 'Psyonix'), 
('3005', 'DiRT Rally', 'Codemasters'); 


CREATE TABLE IF NOT EXISTS nintendo (
    game_id char(4) NOT NULL default '', 
    game_name varchar(32) default NULL, 
    developer varchar(32) default NULL, 
    PRIMARY KEY (game_id) 
); 

INSERT INTO nintendo (game_id, game_name, developer) VALUES 
('4001', 'Mario Kart 8', 'Nintendo'), 
('4002', 'Mario Maker', 'Nintendo'), 
('4003', 'Mario Party 9', 'Nintendo'), 
('4004', 'Bayonetta 2', 'Nintendo'), 
('4005', 'Splatoon', 'Nintendo'); 


CREATE TABLE IF NOT EXISTS sales (
    customer_id char(10) NOT NULL default '', 
    game_id char(4) NOT NULL default '', 
    quantity int(11) default NULL, 
    paid double default NULL, 
    payment varchar(32) default NULL, 
    PRIMARY KEY (game_id) 
); 

INSERT INTO sales (customer_id, game_id, quantity, paid, payment) VALUES 
('1234567890', '1002', 1, 79.99, 'Debit'), 
('0987654321', '2003', 1, 50, 'Credit'), 
('1122334455', '2001', 2, 120, 'Cash'), 
('6677889900', '4004', 3, 110.49, 'Cash'), 
('1357924680', '3002', 1, 50, 'Credit'); 


CREATE TABLE IF NOT EXISTS products (
    game_id char(10) default NULL, 
    platform varchar(32) default NULL, 
    stock int(11) default NULL, 
    price double default NULL, 
    PRIMARY KEY (game_id) 
); 

INSERT INTO products (game_id, platform, stock, price) VALUES 
('1001', 'xbox', 33, 69.99), 
('1002', 'xbox', 42, 79.99), 
('1003', 'xbox', 50, 89.99), 
('1004', 'xbox', 80, 59.99), 
('1005', 'xbox', 10, 49.99), 
('2001', 'playstation', 12, 55.99), 
('2002', 'playstation', 44, 34.99), 
('2003', 'playstation', 89, 45.99), 
('2004', 'playstation', 65, 39.99), 
('2005', 'playstation', 73, 19.99), 
('3001', 'pc', 50, 69.99), 
('3002', 'pc', 41, 49.99), 
('3003', 'pc', 77, 59.99), 
('3004', 'pc', 24, 19.99), 
('3005', 'pc', 19, 24.99), 
('4001', 'nintendo', 10, 19.99), 
('4002', 'nintendo', 17, 39.99), 
('4003', 'nintendo', 33, 28.99), 
('4004', 'nintendo', 53, 34.99), 
('4005', 'nintendo', 97, 15.99); 
+0

Глядя на ваши текущие данные, я бы пошел с 3 столами, платформами, играми, разработчиками для базы. Вы даже можете добавить таблицу отношений для платформ X Games для игр, которые могут работать на нескольких платформах, а не ограничивать ее. Вы также можете настроить его по дороге. – Prix

+1

Вы нарушаете 1NF (или что-то еще), имея многочастные ключи: посмотрите на «префикс», который у вас есть. Вы что-то нарушаете с помощью 'products.platform' - что произойдет, если таблица« source »не содержит подходящую строку. Вам не нужна таблица за консоль, так как вам, возможно, придется добавить больше в будущем. У вас должна быть таблица «Разработчик» (по понятным причинам). 'Sales.paid' должен быть абсолютно не' double', вам нужно 'decimal' /' numeric' (вы не можете хранить '.1' в двойном размере) –

+0

Спасибо за ответы, так что сменив 'sales.paid' to int values ​​и удалить «products.platform» полностью лучше? – JamesR

ответ

0

Поскольку ваш Xbox, ПК, Нинтендо и таблицы PlayStation тождественны вы можете рассмотреть вопрос об объединении их в одну и добавление какой-то столбец «типа» (или, как уже упоминалось при, возможно, имеют одно- для многих между платформой и типом, если игра может работать на нескольких платформах).

С текущим дизайном вы столкнетесь с проблемами с любыми запросами, не относящимися к типу. Если я правильно следую вашему образцу, вам нужно будет использовать значение столбца products.platform, чтобы определить, какая таблица платформы содержит данные, которые вы ищете. Это приводит к некорректной обработке строк по времени.

Смежные вопросы