2016-04-22 23 views
1

3NFで少なくとも5つのテーブルを持つデータベースを作成しています。私がデータベースを集めることができるところから、3NFのデータベースの仕様を見ると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つのテーブル、プラットフォーム、ゲーム、ベースの開発者があります。 Platforms X Gamesのリレーションシップ・テーブルを追加することもできます。リレーションシップ・テーブルを制限するのではなく、複数のプラットフォームで実行できるゲーム用に追加することもできます。それを道路の下でさらにカスタマイズすることができます。 – Prix

+1

あなたは1NF(または何か)に違反しています。複数の部分のキーを持っています。そこにある「接頭辞」を見てください。 'products.platform'を使って何かを違反しています - " source "テーブルに一致する行がない場合はどうなりますか?将来はさらにテーブルを追加する必要があるかもしれないので、コンソールごとのテーブルは必要ありません。 'Developer'テーブルがあるはずです(明白な理由から)。 'Sales.paid'は絶対に' double'でなければいけません。 'decimal' /' numeric'が必要です( '.1'をダブルに書くことはできません) –

+0

返事をありがとう。 int値にして 'products.platform'を完全に削除するのが良いでしょうか? – JamesR

答えて

0

あなたのXbox、PC、ニンテンドーおよびプレイステーションテーブルはあなたが多分ワンを持って、グランプリが述べたように、一つにそれらを組み合わせて、「タイプ」欄のいくつかの並べ替えを追加する(または検討する必要があり、すべて同じであるので、ゲームが複数のプラットフォームで実行できる場合は、プラットフォームとタイプの間の多対多)

現在の設計では、タイプに固有でないクエリで問題が発生し始めます。サンプルを正しく追跡している場合は、探している詳細がどのプラットフォームテーブルに含まれているかを判断するために、products.platform列の値を使用する必要があります。これは非常に非効率的な行単位の処理につながります。

関連する問題