2015-03-31 156 views
-1

我應該從說我對SQL和數據庫相當陌生。我讀了很多,我已經縮小了我的分貝設計和問題。我現在試着解釋一下。SQL電影表設計和查詢

所以我想建立'典型'電影/電影數據庫(對於SQL服務器)。

每部電影可以有很多演員,每個演員都可以參與很多電影。 導演和類型相同。 (與dbo.Films的多對多關係)

電影也有日期和預算被視爲一對一的關係(我把它們放在dbo.Films中)。

參與者可以有1個fname,1個lname和0個或多個電子郵件地址。 導演有1個fname和1個lname。 您可以在下圖中看到我的設計(PK是主鍵)。

See my db_design

1)如何是我設計的,到目前爲止的思維方式?
2)我應該如何設計dbo.Emails表?如果我沒有弄錯,這與演員有一對多的關係。
3)比方說,我想爲單個電影獲取所有可以獲得的信息(標題,日期,預算,演員,導演,類型),全部在一行/行中。我想我必須使用INNER JOIN。我嘗試了以下,但我得到了同一個演員的多行,但不同的類型(實際上我認爲我可以獲得所有組合)。我使用Temp來擺脫結果中的(電影)ID列。它太複雜還是我錯過了一些東西?

IF OBJECT_ID('dbo.Temp', 'U') IS NOT NULL 
DROP TABLE dbo.Temp 

SELECT f.*, a.fname, a.lname, g.name INTO Temp 
FROM [Video].[dbo].[films] f 
INNER JOIN [Video].[dbo].[film_actor] af 
    ON f.id = af.film_id 
INNER JOIN [Video].[dbo].[actors] a 
    ON af.actor_id = a.id 
INNER JOIN [Video].[dbo].[film_genre] gf 
    ON f.id = gf.film_id 
INNER JOIN [Video].[dbo].[genres] g 
    ON g.id = gf.genre_id 

WHERE f.title = 'SomeMovie' 

ALTER TABLE Temp 
DROP COLUMN id 
/* Get results and drop temp table */ 
SELECT * FROM Temp 
DROP TABLE Temp 
+0

您在關係的方式所思所想。別擔心。你的數據庫看起來確定您可以添加ActorEmails(ID,ActorID,Email)。在Film_Genres,Film_Actors和Film_Directors中添加PK。 – 2015-03-31 13:12:48

+0

1)我應該在Film_Genre中爲film_id和genre_id添加PK嗎?那麼Film_Actors和Film_Directors呢?這裏PK的目的是什麼? 2)你可以更具體的關於.Persons表?如果我添加。人員,並有ID,FNAME,LNAME,電子郵件我要怎麼告訴誰是演員和誰是導演? – Tsafou 2015-03-31 14:16:16

回答

1
  1. 有一個例外的設計似乎沒什麼問題。然而,我會有一個表格dbo.Person或類似的東西,因爲演員和導演都共享一些漂亮的人物屬性(例如姓名)。而那些也直接指導和其他方法的演員呢?你不需要兩個數據庫條目。
  2. 關於lilbo.Emails表,我沒有看到任何問題。我期望與上述人員的表格有一對多的關係。因此,該表可能會有'Id'列,'Person'Id'和電子郵件本身。
  3. 只需使用JOIN語句,您將無法檢索一行內的所有信息,因爲JOIN會爲每個匹配的兩個結果集組合提供一行。所以一個由十位演員主演的電影將會產生十行。如果那部電影屬於兩種類型,你最終會得到20行,依此類推。有一些方法可以在一列中獲得所有演員的姓名(例如逗號分隔),但通常這不是人們想要的。不過,這取決於您的應用程序或用例。
+0

1.可以添加第三個表格Person和Change Actor和Director,以便它們包含到Person的鏈接。或者用PersonTypes表格製作Person表格。但我更喜歡第一。 – 2015-03-31 13:20:47

+0

@papatoob你可以解釋dbo.Person。你會有Person.id,Person.fname,Person.lname,Person.email嗎?那麼Film.Actor和Film_Director表格呢?保留還是刪除它們? – Tsafou 2015-03-31 14:20:54

+0

@tsafou'dbo.Person'將具有Id和名稱列;如果只有一封電子郵件,那麼它也會去那裏。對於多個電子郵件,你需要一個不同的表格(見上文)。 'dbo.FilmActors'和'dbo.FilmDirector'表仍然是需要的,但是它們會有'PersonId'列,因爲不會有特定的Actor-ID和Director-ID。 – 2015-04-01 07:50:24

0

這確實是一個很大的話題。有關於數據庫規範化的完整書籍。

  1. Genres(ID(PK), Name)是確定的。
  2. Films(ID(PK), Title, Date, Budget)是OK
  3. FilmGenres(FilmID, GenreID)在這裏你可以做以下

    一個。添加複合物PK FilmGenres(FilmID(PK), GenreID(PK))

    b。添加替代品PK FilmGenres(ID(PK), FilmID, GenreID)以及FilmID上的唯一索引,GenreID FilmGenres(ID(PK), FilmID(U), GenreID(U))。 這裏你想要組合FilmID和GenreID的獨特。我想你明白爲什麼。

  4. ActorsDirectors。在這裏,您可以添加 Persons(ID(PK), FirstName, LastName)Actors(PersonID(PK,FK), ...)Directors(PersonID(PK,FK), ...)

  5. FilmActors(FilmID, ActorID)鏈接此表 - 在這裏您將子彈3

  6. FilmDirectors(FilmID, DirectorID) - 在這裏您將子彈3

  7. 添加PersonEmails(PersonID, EmailID) - 在這裏你應用子彈3.

子彈4,5,6可以更改如果:

  • PersonTypes(ID(PK), Name):導演,演員,製片人......

    Persons(ID(PK), FirstName, LastName)

    PersonTypesPersons(PersonID, PersonTypeID) - 在這裏您將子彈3

  • FilmActors - 唐」不再需要了。

  • FilmDirectors - 不再需要了。

  • 添加PersonEmails(PersonID, EmailID) - 在這裏您將子彈3

  • +0

    根據您的設計,導演是否應該只有PersonID(PK,FK)或更多信息,例如FirstName,LastName? – Tsafou 2015-03-31 19:15:20

    +0

    沒有名字,姓氏將去人員表。導演將有自己的導演信息,演員將擁有自己的演員相關 – 2015-03-31 19:18:14

    +0

    好吧,我明白了。我想我的設計可能不需要這個。或者我只需要演員而不是導演? (演員只有名字,姓氏和電子郵件,導演只有名字,姓氏)。 對不起,但我第一次和我很困惑。 – Tsafou 2015-03-31 20:01:41