2010-12-01 130 views
2

我開始了基於 「人才」 網站一個新的項目 - 例如:關係數據庫設計(MySQL的)

  • 模型
  • 演員
  • 歌手
  • 舞者
  • 音樂家

我建議這樣做的方式是每個這些人才將h自己的表,幷包括一個user_id字段將記錄映射到特定的用戶。

任何在網站上註冊的用戶都可以創建一個或多個這些人才的檔案。例如,演員可以是電視演員,戲劇演員或配音演員。因此,例如我有用戶A--他是一個模特(時裝表演模特)和一個演員(電視演員,劇場演員,配音演員)。

我的問題是:

  1. 我需要創建單獨的表來存儲該用戶的分型人才?

  2. 我該如何爲這個用戶執行頂級人才的查找?即在用戶表中是否應該有每個人才ID的字段?或者我應該在每個頂級天賦表中執行查找以查看該user_id是否存在於那裏?

  3. 還有什麼我應該知道的?

回答

1

好的抱歉,不正確的答案..這是一種不同的方法。

我看到它的方式,一個用戶可以有多個職業(演員,模特,音樂家等)。通常我所做的事情是首先在對象中思考,然後將其轉化爲表格。在P.O.O.你有一個類User和子類Actor,Model等等,它們中的每一個也可以有像TvActor,VoiceOverActor等子類,在每個人才和子類中都有一張表,所有人都分享相同的主鍵(用戶的ID),所以如果用戶4是和Actor和一個模型,你將有一個註冊表在演員的表和模型表上的另一個,兩個id = 4

正如你可以看,存儲很容易..複雜的部分是檢索信息。這是因爲數據庫不具有繼承(我認爲MySQL有,但我還沒有嘗試過)的概念..所以,如果你想現在用戶4的subclases,我看到三個選項:

  • 多選擇您擁有的每個人才和子表,並詢問他們的ID是否爲4.

    SELECT * FROM Actor WHERE id = 4; SELECT * FROM TvActor WHERE id = 4;

  • 做大查詢在左側的接合部的天賦和subtalent表從用戶LEFT JOIN

    SELECT * JOIN演員ON User.id = Actor.id LEFT JOIN TvActor ON User.id = LEFT TvActor.id JOIN ... WHERE User.id = 4;

  • 與用戶NxN的關係,建立一個人才表來存儲的每一個人才和subtalents該用戶具有參考,所以你不會要問所有的表。您必須對Talents表進行查詢以找出需要查詢的第二個查詢表。

alt text

的這三個選項中的每一個都有各自的優點和缺點..也許還有另外一個=)

好運

PS:啊,我發現另一種選擇here或也許這只是第二個選項的改進

2

您應該有一張表,其中包含關於用戶(名稱,dob,關於用戶的任何其他信息)的所有信息。你應該擁有一張擁有關於天賦(id,talentName,TopLevelTalentID(將「sub」天賦放入「Parent」天賦的參考)的所有內容)的表格。你應該有第三個表格來表達用戶和天分之間的多對多關係:UserTalents存儲UserID和TalentID。

下面是說明如何獲得第3 NF的文章:

http://www.deeptraining.com/litwin/dbdesign/FundamentalsOfRelationalDatabaseDesign.aspx

2

這是一個很好的問題表現出一定的面向對象的思想和關係模型之間的異同。

首先,沒有關於創建表格的嚴格規則,它取決於您嘗試建模的問題空間(然而,每個表格的字段根本沒有必要,並構成設計缺陷 - 主要是因爲它不靈活且難以查詢)。 對於在這種情況下,例如完全可以接受的設計是具有表

Names (Name, Email, Bio) 

Talents (TalentType references TalentTypes, Email references Names) 

TalentTypes (TalentType, Description, Parent references TalentTypes) 

上述設計將讓你有層次TalentTypes並跟蹤其名具有天賦,你將有一個單一的表,從中可以得到所有的名字(爲了避免註冊重複),你有一張表,從中你可以得到一個人才名單,你可以很容易地添加新的人才類型和/或亞型。

如果您確實需要在每種天賦類型中存儲一些特殊文件,您仍然可以將這些文件添加爲引用普通天賦表的表格。 作爲一個例證

Models (Email references Talents, ModelingSalary) -- with a check constraint that talents contain a record with modelling talent type 

請注意,這只是一個例子,它可能是明智的有薪酬在人才表,而不是對特定人才的表。

如果你與在某種意義上,你可以看看錶人才作爲排序從一個特定的天賦或子繼承的天賦屬性的類的特定人才的表結束。回答你的問題之前

3

...我認爲,USER_ID不應該在人才表......這裏的主要思想是「1個人才你有很多用戶,一個用戶有多個人才」。 。這樣的關係應該是N×N的,你需要一箇中間表

見:many to many

現在

我需要創建單獨的表來存儲這個 用戶的分型人才?

如果你想做一些動態的事情(添加或刪除子節點),你可以使用遞歸關係。這是關係到自身的表

TABLE TALENT 
------------- 
id PK 
label 
parent_id PK FK (a foreign key to table Talent) 

見:recursive associations

我應該如何執行的頂級人才查找此 用戶?即在用戶表中應該有 有字段爲每個人的ID爲 ?或者我應該在每個頂級天賦表中執行查詢 以查看 ,如果那個user_id存在那裏的話?

如果你之前使用的型號,它可能是一個噩夢進行查詢,因爲你的表人才,現在是可以包含多個層次..你可能要自己限制在一定數量的樹你想在你的天賦桌上的水平,我想兩個就足夠了......這樣你的查詢會更容易

還有什麼我應該知道的?

用遞歸關係...外鍵應有alow空,因爲高層人才不會有PARENT_ID時

...

祝你好運! :)

編輯:確定..我創建了模型..解釋它更好

model

編輯第二種模式(在聖誕樹的形狀= d)注意型號&人才和演員之間的關係&人才是一個1x1的關係,也有不同的方法要做到這一點(the same link on the comments

alt text

找到,如果用戶有才華..加入三個表的查詢=) 希望這有助於

+0

嗨,我想這可能已被誤解,但基本上我想說的是會有b e分開的人才表,其中我爲每個擁有該人才的用戶創建條目。每個天賦表中的字段都與該特定人才相關。 – GSTAR 2010-12-01 15:15:00

+0

@pleasedontbelog +1 @GSTAR,其實我不認爲它被誤解了。我懷疑你不知道如何從上述設計中獲得用戶的所有才能?如果是這樣,讓我們​​知道,我們可以演示如何獲得用戶擁有的所有人才,或擁有人才的所有用戶,等等...... – Unreason 2010-12-01 16:47:13