2014-07-18 60 views
0

我已經研究過這個問題。我不是唯一一個提出這個問題的人......但是我希望你對最佳做法有所想法。與類別和子類別相關的數據庫設計

我試圖設計一個數據庫,將跟蹤金融交易。爲了簡單起見,每筆交易只能有一個類別,每個類別只能有一個子類別。

我有一個自引用表,就像這樣:

Table: Categories 
ID, int, primary key 
parentID, int, foreign key 
description, text 

長話短說,你最終得到這樣的數據:

1 Auto [null] 
2 Bills [null] 
3 Healthcare [null] 
4 Maintenance 1 
5 Gasoline 1 
6 Cell Phone 2 
7 Rent 2 
8 Prescriptions 3 
9 Dentist 3 

到目前爲止,一切都很好。 這裏是我的問題

我不知道我應該涉及所有這一切回到我的交易表的正確方法。 'Transactions'有一個'Category'和'Subcategory'的列。 Transaction.ID將是PK,而Categories.ID將是FK。

隨着上述規定的方式,這意味着從分類的任何值可以被寫入類別或子類別相關的分類交易...

這是我的責任,程序員通過控制訪問表形成?換句話說,我唯一的選擇是「以編程方式控制」進入「類別」和「子類別」列的內容。

請記住,每個類別只能有一個子類別。選擇的類別應該只允許該類別的孩子...

我有道理嗎?

GOOD:汽車 - 維護 BAD:醫療保健 - 汽油

+0

...爲什麼你只能有一個子類?這是否意味着像「汽油 - 汽油」這樣的東西會被禁止?或者你的意思是你只想要一個嵌套層次? 'Transactions'應該只有一列 - 'category',它可能包含一個子類別。或者,或者定義一個多列外鍵。你如何預測加載數據?該程序/過程有責任首先不加載不良數據,因此請將所需的任何基本保護放在那裏。 –

+0

你的意思是說每個子類別只能有一個類別? –

+0

目前,我並不太在意層次結構的深度......每個子類別可能只有一個父級。這部分很簡單...我的問題是限制寫入交易表的內容。例如:如果我使用「自動」填充Transactions.Category,那麼當我到達Transaction.SubCategory時,我應該只能選擇自動的孩子。 – raydlevel5

回答

0

所以你的類別是否不是正交的,獨立的(如性別和城市),而是等級(如州和縣)。

爲了強制執行分級分類,請使用ID列爲主鍵的單個分類表(在數據表中引用爲外鍵)以及兩個描述性字段Category和Subcategory。

爲了便於數據輸入,您可以提供一個組合框類別,用於過濾可用的子類別。然而,實際的外鍵引用是由在子類別組合框中進行的選擇提供的,該組合框必須列出兩個字段,分類和子類別。通常將這兩個字段與分隔符(如短劃線( - )或管道(|))連接起來。

+0

單個FK子類別就足夠了。子類別表可以具有FK引用類別。因此,與汽油相關的所有交易都與汽車間接相關。 –

+0

@WalterMitty:這是以子類別*描述*始終是唯一的。考慮州和縣的例子;在美國的50個州中有很多重複的縣名,因此只有在與州描述相結合的情況下才能確保任何特定的縣名。 –

+0

它假定子類別具有身份。沒有身份的實體是一個問題,即使其他事情都是正確的。 –

1

您提出的情況是關係表中編碼分層數據樹結構的更一般問題的子集。自從關係數據庫在20世紀70年代後期首次提出這個案例以來,這個案例就已經被詳細研究了。

特別是在簿記系統中,每一次都會出現子類別和類別的概念。較大規模的工業系統傾向於具有四級系統,總體賬戶類型(費用),類別(運輸),子類別(汽車)和子子類別(汽油)。

如果您使用以下搜索詞:「關係設計中的樹結構」,則可能會提高您的研究的效率。該搜索產生以下維基百科摘要:

http://en.wikipedia.org/wiki/Hierarchical_database_model

你可以找到很多相關的問題和答案在這裏SO。在「嵌套集」或「鄰接列表」下搜索幾種技術。

你的問題是要簡化你將找到的答案,只有兩個級別:類別和子類別。

我認爲你選擇的任何設計都希望明確下列規則:子類別決定類別。而IMO則希望DBMS強制執行此規則,以避免事務以與其類別不一致的子類別結束。

+0

我認爲我們處於同一頁面! Transactions.SubCategory必須與Categories.Table中的正確父對齊。編碼是我的責任,還是我可以通過關係強制執行? 我似乎無法建立適當的關係....迄今爲止我所做的最好的事情是分別爲Transactions.Categories和Transactions.SubCategories顯示ALL Categories和SubCategories。換句話說,我還沒有找到一種方法來限制基於Transaction.Category的Transaction.Subcategories。 – raydlevel5

+0

在子類別/類別關係中強化一致性基本上是數據規範化的問題。規範化的設計將只存儲一次這種關係。看看規範化的設計。至於數據輸入表單如何向用戶提供選項,這是表單設計而不是數據庫設計的問題。 –