2016-07-26 93 views
0

從設計的角度來看,我想知道是否基本上有一個表有2個字段(id,名稱)應該有一個副本的名稱。我正在設計一個數據庫,其中有一個名爲projects(pro_id,pro_name)的表和一個名爲categories(cat_id,cat_name)的表。項目名稱肯定是獨一無二的。一個給定的項目可能有多個與它相關的類別,並且會有第三個名爲procat的表(procat_id,pro_id,cat_id)來執行此操作。事情是,可能有幾個項目具有相同名稱的類別。因此項目1和項目7可能都有一個名爲「浴室」的類別。我的問題是我的分類表應該只反映1個「浴室」的條目還是2個單獨的條目和2個ID?請注意,這些類別以及它們在數據庫中執行的操作將有所不同。項目1的浴室可能有​​一組相關數據(顏色=藍色,尺寸= 400等),而Proect 7的浴室可能有​​不同的相關數據(全部記錄在不同的表格中)。我應該避免重複數據庫中的條目嗎?

感謝您的幫助!目前我傾向於在類別表格中重複輸入,但我想確保我不會遺漏稍後會導致問題的內容。

+0

您是否想要顯示某個類別中的所有項目?如果是這樣,你應該避免有愚蠢的,這使得後來更容易查詢,也給你「正常化」的數據。 https://en.wikipedia.org/wiki/Database_normalization – naththedeveloper

+1

在英語中,我們是否有單獨的衛生間字樣的單個副本供每個單獨的浴室使用?不,我們結合在一起:項目1的浴室是藍色的。你可以在數據庫中做同樣的事情,例如(pro_id PK,cat_id PK,顏色)。事實上,將謂詞與每個表相關聯是一種很好的做法。 – reaanb

回答

1

值是否在列中重複取決於表中的行的含義以及根據業務規則可能產生的表值。例如:假設你決定在某種事情中,某種事物都有自己獨特的身份。然後,ids將在一個表中具有唯一性,該表對於每個具有給定屬性的事物都有一行。但是,假設表中的行包含使「東西ID以彩色着色」的顏色值成爲真正的語句的ID &。如果事物只有一種顏色,那麼顏色將是唯一的,但如果事情可能以多種顏色出現,那麼列顏色將不是唯一的。儘管id顏色對將是唯一的。

作爲DBA必須爲這樣的含義做出決定,或者對於在給定情況下確定表格行的每個表的謂詞。即一個由列參數化的語句模板,其中該表包含使模板成爲真實語句的行。

您的表的集合必須有足夠的謂詞才能描述出現的任何情況,而您不希望表中的行表示同一事物。通過學習&應用信息建模方法&規範化確定好的設計。

事情是,可能有幾個項目具有同名的類別。

確保您清楚地分開兩個不同的概念,並沒有通話雙方THM的「類別」:在自己的項目,單獨存在(這是你如何使用在報價「類別」)對一個事這是一個其中一個,它有自己的屬性如名稱,多個項目可能有相同的類型,但與其他屬性在項目類基礎上。看起來你選擇了「類別」這個詞作爲這個同義詞(因爲是部門)所以也許這就是你的意思。即有房間名爲「衛生間」,不同的項目有同類/房間,但不同的項目類/對,即房間在世界各地,有不同的套屬性&對於同一財產的不同值。

我的問題是我的分類表應該只反映1個「浴室」項目還是2個單獨的項目與2個ID?

假設您有唯一的類別&項目ID。考慮表格c(id, name),謂詞「類別ID由名稱名稱調用」。如果一個類別是與一個名稱關聯的事物,則id將是唯一的。否則,一件東西可以與多個名稱關聯,所以id - name子箭頭將是唯一的。你說過不同的類別可以有相同的名稱。另一方面,根據你所說的PC(pid,cid,name)的表格「在項目PID類別CID中通過名稱CNAME調用」,那麼因爲項目不共享類別CID是唯一的,儘管PID不是。請注意,在這種情況下,c的謂詞「類別ID由名稱NAME調用」也表示「對於某個項目PID,在項目PID類別中,CID由名稱NAME調用」。所以c只是select cid as id from pc。所以你不需要c如果你有pc

在另一方面,如果你決定,類別ID不是唯一的,而是類別由一個項目類別ID對唯一標識,然後在cname不會是唯一的,在cpPID - CID雙將是獨一無二的,但CID & PID不會。

+0

我相信我明白你在做什麼。我應該有兩個表:項目(p_id,p_name)和類別(c_id,p_id,c_name)。我不一定會在數據庫中存儲各種名稱(因爲可能會存儲所有英文單詞)。我的分類名稱只是作爲最終用戶的友好標識符。在我的規則中,可以有幾個「衛生間」的名字,但是如果他們在不同的項目中,他們都是不同的。然後,我只需在類別表中的所有3個字段上添加一個UNIQUE約束,對吧?以確保用戶不會在1個項目中創建2個同名的貓。 – Joe

+0

@Joe在您建議的表格中,爲確保每個項目的名稱是唯一的,您將在(p_id,c_name)上創建唯一約束。如果你包含c_id(假設它是一個鍵),它將不起作用。 – reaanb

+0

@philipxy如果事物只有一種顏色,那麼* id *將是唯一的,但如果事情可能以多種顏色出現,則列* id *將不會是唯一的。 – reaanb

0

我目前看到兩種可能性:

可能性一:立即在類別數據集中包含詳細信息。這使得保留所有重複名稱是合理的,因爲它們在這裏被區分。

可能性二:不要在類別中包含名稱以外的任何細節,因爲您目前擁有它並將它們組合在一起。如果這個ID只是作爲一個名字,並且還有其他因素需要排序(例如,通過項目ID區分另一個浴室項目),那麼您應該將它們合併。如果你不這樣做,你可能會遇到擴展問題,因爲你正在使用這麼多不必要的空間。

0

你的分類表只需要爲每個類別

在分類表「浴室」有區別,實際上應該被存儲在項目表條目,因爲它們是具體到一個項目,而不是具體到一個類別。所有關於「浴室」應該存儲在類別表中的信息都是所有浴室共同的信息。

在關係數據庫中,目標是找到相似的實體並將它們分組到表中。例如,「項目」和「類別」是不同的實體,並且您已將它們正確放置到單獨的表格中。這些表格的行代表這些實體的不同類型(「臥室」,「衣櫃」)等,並且由於改變「浴室」的顏色或大小不會改變其「類別」,該信息應該存儲在別處。就你而言,這可能是項目表。

0

不清楚的問題,但我希望這可以幫助你以某種方式:

記住:

你不需要檢查重複的pro_name但沒錯,如果你的ID字段是重複的(有時它如果您手動嘗試插入,則會發生)並且標識未設置爲列。因此,始終將一個表ID分配給Identity列以使每個字段具有唯一的自動編號並刪除重複的插入。

回答你的問題:

問:我的問題是應我的類別表反映了「浴室」,或者2個IDS 2個獨立的項目只有1項?因爲你以後可能會有類似或相同的名字(比如:「bathroom」),因爲這兩個表的id都設置爲自動識別而不是重複的,你就好了。

例如:

pro_id=1, pro_name="bathroom" 
pro_id=2, pro_name="bathroom" 
pro_id=3, pro_name="bathroom" 
pro_id=4, pro_name="bathroom" 

但是這將是重複的,如果你的表是這樣的,大家都不希望這樣的:

pro_id=1, pro_name="bathroom" 
pro_id=1, pro_name="bathroom" 
pro_id=2, pro_name="bathroom" 
pro_id=2, pro_name="bathroom" 

注: 什麼,我在這裏做的是項目(pro_id, pro_name)和類別(cat_id,cat_name) 我在類別上創建pro_id並鏈接外鍵這是因爲您說 「給定的項目可能有多個與其關聯的類別」。在這之後你甚至可能不需要第三張桌子。