2017-01-09 136 views
0

我正面臨以下問題。關係數據庫模型與關係表?

想象一下,一個關係數據庫與相關的兩個表:

表用戶

idUser | email  | otherColumns 
    ------ | ----------- | ------------ 
     1 | [email protected] | .... 

比爾

idBill | value | otherColumns 
    ------ | ------| ------------ 
     1 | 100$ | .... 

建立與添加外公共關係賬單表的關鍵是將每個賬單與一個用戶相關聯。儘管這樣,也可以創建一箇中間表是這樣的:

關係表比爾用戶

id  | idUser | idBill 
    ------ | ------ | ------------ 
    1  | 1  | 1 

有了這張表,就可以實現同樣的結果,但我認爲有一個更好的組織。這個選項是否比其他選項更好?還是取決於上下文?

最後,我想知道是否有任何標準來創建這些關係。

謝謝。

+1

不要將貨幣存儲在值字段中。使該字段成爲數字數據類型而不是文本數據類型。只有當你想對該列進行算術運算時,它纔會引起你的問題 – RiggsFolly

+1

我每次都是基於關係做它。如果它是1:N我用一個外鍵使用第一個選項,如果有關係M:N我使用中間表。如果它是關係1:N,我認爲沒有必要創建下一個表。您必須分配更多空間,並且下一個表對於某人可能難以閱讀複雜的數據庫設計 – Bulva

回答

3

是的,有標準的 - 或者說,有許多的書籍數據庫設計,告訴你接受的智慧。最後一個我記得讀到的是「數據庫設計和關係理論:正常形式和所有爵士樂」由克里斯托弗J.日期。

您的第一個問題的答案取決於業務領域。它常常有助於總結系統在這樣的僞語言:

一個用戶由合成主鍵標識,並且具有 屬性XYZ。

A bill是由合成主鍵標識,有一個值,有 貨幣,有xyz。

紙幣具有正好一個用戶

(或)

紙幣具有一個或多個用戶

(或)

紙幣具有正好一個用戶和關係具有 屬性的x,y和z。

如果帳單隻有一個用戶,則將「用戶」添加爲帳單表的外鍵。沒有其他信息需要捕捉。

如果賬單可以有多個用戶,則創建一個鏈接/連接表,每個用戶/賬單組合包含一行。

我的帳單隻有一個用戶,而且這種關係還有一些其他屬性 - 例如,該賬單的納稅狀態 - 您可以使用任何一種解決方案。就我個人而言,我更願意創建一個連接表來表明這些屬性涉及賬單和用戶之間的關係,而不是賬單本身。但是,其他人有其他意見。

+0

好的回答@NevilleK我會買這本書的。 – Maik

+0

@Maik事實證明,如果一個表等於一系列無損連接,其中公共列爲CK(候選鍵),那麼歸一化至5NF將永遠不會說您應該將該表退回給它們。 (因爲該表「滿足」「CK所隱含的」連接依賴性「)。這裏,Bill_User-plus-user-column表無損地分解爲Bill和Bill_User在常見的CK上,因此就是這種情況。答案是「取決於業務領域」是正確的,儘管它在規則方面的理由是模糊的。但這就是書籍的寫作原因。 – philipxy

0

我的建議是不要創造另一個表說'關係表比爾映射表賬單和客戶。它是不是看起來很好用:

添加「ID用戶」列在「表草案」,因此你可以很容易地加入billtable和客戶表:

表比爾

idBill | value  | otherColumns | iduser 
------ | ------ | ......  | .... 
1   |  100$  |    | 1 
1

這是關於你的設計。可以說根據我們的設計,one用戶可以有n賬單和one賬單必須屬於one用戶。這意味着我們應該有1-n的關係。將此表示爲pyhisical表取決於您擁有哪種類型的關係。對於1-n,我們可以做到這一點,如:

表用戶

idUser(PK) | email  | otherColumns 
------  | ------ | ------------ 
1    | [email protected] | .... 

表比爾

idBill(PK) | value  | otherColumns | idUser(FK) 
------  | ------ | ------------ | ------ 
1    |  100$  | ....   | 1 
2    |  10$  | ....   | 1 

TableUser.isUserPKUniqueTableBill.idUser不是PKnot unique的一部分。我更喜歡用這種方式來表示1-n,因爲不需要多一個表(在查詢中少一個join操作)。

或者你有上面寫的,我們可以創建關係表將它們連接:

表用戶

idUser(PK) | email  | otherColumns 
------  | ------ | ------------ 
1    | [email protected] | .... 

表比爾

idBill(PK) | value  | otherColumns 
------  | ------ | ------------ 
1    |  100$  | ....   
2    |  10$  | ....   

關係表比爾用戶

idUser(FK)  |  idBill(FK) 
------   | ------------ 
1    |  1 
1    |  2 

在關係表中的idUsernot unique原因,我們應該允許重複userid小號(1-n)。 idBill必須是unique因爲一張賬單必須只有一個所有者。你也可以根據你的設計要求做一些改變,關係是否與identifying有關係。

關係類型:careerride

關於設計問題(ER圖):tutorialspoint

ER到表:tutorialcup

+1

ER模型中的關係不是由表之間的外鍵引用表示的,而是由表中的兩個或多個鍵列的關聯表示的。在「Relational Table Bill User」中,「(idUser,idBill)」這對列代表一個ER關係。從「Bill_User.idBill」到「Bill.idBill」的FK約束只是一個完整性約束。此外,您的鏈接指的是質量差的教程,我建議讀者在適當的教育機構網站上查找結果。 – reaanb