2016-04-08 44 views
1

我需要设计一个没有重复组的表格,我想我已经这样做了,但表格看起来是否正确,它们是如何链接的,或者有什么我可以改进的?我跑了所有的查询,我有几个重复的球队经理&经理,因为我把他们都在一个小队表中,所以我把他们分成team_player & team_manager,这样一个或多个经理也可以管理一个球队,反之亦然,体育场等正确的表设计?

drop table football_manager; 
drop table football_player; 
drop table team; 
drop table stadium; 
drop table player; 
drop table manager; 

CREATE TABLE stadium(
stadium_ID NUMBER NOT NULL, 
stadium_Name VARCHAR2(30), 
PRIMARY KEY(stadium_ID)); 

CREATE TABLE team(
team_ID NUMBER NOT NULL, 
stadium_ID NUMBER NOT NULL, 
league VARCHAR2(30), 
league_ID NUMBER(1), 
match_Len NUMBER(3), 
match_Title VARCHAR2(30) NOT NULL, 
year_Released NUMBER NOT NULL, 
PRIMARY KEY(team_ID), 
FOREIGN KEY (stadium_ID) REFERENCES stadium); 

CREATE TABLE manager(
manager_ID NUMBER NOT NULL, 
manager_fname VARCHAR2(30), 
manager_lname VARCHAR2(30), 
PRIMARY KEY(manager_ID)); 

CREATE TABLE player(
player_ID NUMBER NOT NULL, 
player_fname VARCHAR2(15), 
player_lname VARCHAR2(15), 
PRIMARY KEY(player_ID)); 

CREATE TABLE football_player(
team_ID NUMBER NOT NULL, 
player_ID NUMBER NOT NULL, 
PRIMARY KEY(team_ID, player_ID), 
FOREIGN KEY(team_ID) REFERENCES team(team_ID), 
FOREIGN KEY(player_ID) REFERENCES player(player_ID)); 

CREATE TABLE football_manager(
team_ID NUMBER NOT NULL, 
manager_ID NUMBER NOT NULL, 
PRIMARY KEY(team_ID, manager_ID), 
FOREIGN KEY(team_ID) REFERENCES team(team_ID), 
FOREIGN KEY(manager_ID) REFERENCES manager(manager_ID)); 

INSERT INTO stadium (stadium_ID, stadium_Name) VALUES (1, 'Bernabeu'); 
INSERT INTO stadium (stadium_ID, stadium_Name) VALUES (2, 'Old Trafford'); 
INSERT INTO stadium (stadium_ID, stadium_Name) VALUES (3, 'Celtic Park'); 
INSERT INTO stadium (stadium_ID, stadium_Name) VALUES (4, 'Wembley'); 

INSERT INTO team (team_ID, stadium_ID, league, league_ID, match_Len, team_Title, year_Released) VALUES (1, 1, 'BPL', 1, 180, 'Manchester', 2013); 
INSERT INTO team (team_ID, studio_ID, league, league_ID, match_Len, team_Title, year_Released) VALUES (2, 2, 'Eire', 2, 143, 'Bray', 2013); 
INSERT INTO team (team_ID, studio_ID, league, league_ID, match_Len, team_Title, year_Released) VALUES (3, 3, 'Conference', 3, 103, 'Leeds', 2003); 
INSERT INTO team (team_ID, studio_ID, league, league_ID, match_Len, team_Title, year_Released) VALUES (4, 4, 'League 2', 4, 127, 'Swansea', 2009); 

INSERT INTO director (manager_ID, manager_fname, manager_lname) VALUES (1, 'Martin', 'Miles'); 
INSERT INTO director (manager_ID, manager_fname, manager_lname) VALUES (2, 'Gaz', 'Lineker'); 
INSERT INTO director (manager_ID, manager_fname, manager_lname) VALUES (3, 'Miles', 'Teller'); 
INSERT INTO director (manager_ID, manager_fname, manager_lname) VALUES (4, 'Ian', 'Wright'); 

INSERT INTO actor (player_ID, player_fname, player_lname) VALUES (1, 'Mike', 'McDonnagh'); 
INSERT INTO actor (player_ID, player_fname, player_lname) VALUES (2, 'John', 'Ryan'); 
INSERT INTO actor (player_ID, player_fname, player_lname) VALUES (3, 'Robbie', 'Keane'); 
INSERT INTO actor (player_ID, player_fname, player_lname) VALUES (4, 'Ronnie', 'Tunner'); 
INSERT INTO actor (player_ID, player_fname, player_lname) VALUES (5, 'Larry', 'Dunne'); 
INSERT INTO actor (player_ID, player_fname, player_lname) VALUES (6, 'Tom', 'Maguire'); 
INSERT INTO actor (player_ID, player_fname, player_lname) VALUES (7, 'Joel', 'Ryan'); 
INSERT INTO actor (player_ID, player_lname, player_lname) VALUES (8, 'Kevin', 'Smith'); 
INSERT INTO actor (player_ID, player_lname, player_lname) VALUES (9, 'Andrew', 'Ward'); 
INSERT INTO actor (player_ID, player_lname, player_lname) VALUES (10, 'Gary', 'Hawkins'); 
INSERT INTO actor (player_ID, player_lname, player_lname) VALUES (11, 'Joey', 'Ward'); 
INSERT INTO actor (player_ID, player_lname, player_lname) VALUES (12, 'Matthew', 'Walsh'); 

INSERT INTO team_player (team_ID, player_ID) VALUES (1, 1); 
INSERT INTO team_player (team_ID, player_ID) VALUES (1, 2); 
INSERT INTO team_player (team_ID, player_ID) VALUES (1, 3); 
INSERT INTO team_player (team_ID, player_ID) VALUES (1, 4); 
INSERT INTO team_player (team_ID, player_ID) VALUES (2, 2); 
INSERT INTO team_player (team_ID, player_ID) VALUES (2, 5); 
INSERT INTO team_player (team_ID, player_ID) VALUES (2, 6); 
INSERT INTO team_player (team_ID, player_ID) VALUES (2, 7); 
INSERT INTO team_player (team_ID, player_ID) VALUES (3, 5); 
INSERT INTO team_player (team_ID, player_ID) VALUES (3, 8); 
INSERT INTO team_player (team_ID, player_ID) VALUES (3, 9); 
INSERT INTO team_player (team_ID, player_ID) VALUES (3, 10); 
INSERT INTO team_player (team_ID, player_ID) VALUES (4, 5); 
INSERT INTO team_player (team_ID, player_ID) VALUES (4, 8); 
INSERT INTO team_player (team_ID, player_ID) VALUES (4, 11); 
INSERT INTO team_player (team_ID, player_ID) VALUES (4, 12); 

INSERT INTO team_manager(team_ID, director_ID) VALUES (1,1); 
INSERT INTO team_manager(team_ID, director_ID) VALUES (2,2); 
INSERT INTO team_manager(team_ID, director_ID) VALUES (3,3); 
INSERT INTO team_manager(team_ID, director_ID) VALUES (4,4); 
+0

不知道为什么这是用sql和oracle标记的......它更多的是关于数据库设计,关系数据库的问题......没有什么特别与SQL或oracle有关 – mathguy

+1

您的模式显示SYSTEM。在系统模式中创建表不是一个好主意。只需创建一个用户并在那里完成您的工作。良好的习惯开始早。 – kevinsky

+0

你怎么知道只有一个工作室会拍电影?是否会有合作作品暗示许多电影公司与一个电影关系? – kevinsky

回答

1

我同意sdmon - 因为导演和演员有相同的属性,它是有道理的,让他们所有在单个表中,并将它们分配给“事实”表中的角色。

电影可以有多个导演吗?如果不是,那么你不需要film_director表,你只需要在电影表中为“导演”添加一列。否则,你需要film_director表。

电影可以绑定到多个工作室吗?在你的模型中,你有一个电影表中的studio_id列,但也有一个film_studio表。你不需要两个。如果电影总是由单个工作室制作,您需要列(但不是表格)。如果您需要为电影显示多个演播室,则需要额外的表格,但不需要列。

一切看起来不错。祝你好运!

+0

是的,那studio_id链接我忘了删除,因为我刚刚做了改变,但我不知道是否要处理我给与否的数据,但我想我现在可能会过时。 – Poena

1

我只会对用户(导演/演员)1台,因为如果一个导演也喜欢谁出现在他的大部分电影昆汀·塔伦蒂诺的演员会发生什么。你将不得不重复数据。

https://en.wikipedia.org/wiki/Database_normalization

尝试把你的模型达到BCNF或4NF,你会没事的