2016-05-24 60 views
0

如果在另一個表中有兩個表引用單列時如何設計表,如何在另一個表中有兩個表引用單列時設計表

例如,我有兩個類型的用戶(可以稱它們user1user2),因爲這兩種類型的用戶具有多個不同的信息,所以我創建兩個表中的每個人,並且每個用戶具有一個帳戶登錄到系統。所以我創建了一個表呼叫帳戶,並讓兩個表user1user2參考表帳戶中的ID。所以當我有一個帳戶,我想知道這個帳戶屬於哪一個。這很不方便,因爲我必須在兩張桌子上找。

它有解決這個問題的方法嗎?

回答

1

如果你有一個實體user,只創建一個表user他們。

用戶是一個用戶,不管他是否有一些特殊的角色。所有用戶都會有一些共同的字段,例如一個名字。

table user: 
user id 
user name 
age 
homepage 

,爲不同類型的用戶的特定信息,爲您打造專業化表對這些角色的信息:

table role1: 
user id 
roleinfo1 
roleinfo2 

table role2: 
user id 
roleinfo3 
roleinfo4 
roleinfo5 

通過這種方式,用戶可以在同一時間有多個角色,但你當然可以限制他們只有一個。

如果用戶只能是其中一個角色(稱爲分離),那麼您可以使用附加的statndard方法將role列添加到用戶表中,並將所有信息並排放入用戶表中,留下那些不屬於用戶角色null

table user: 
user id 
user name 
age 
homepage 
roletype 

roleinfo1 
roleinfo2 

roleinfo3 
roleinfo4 
roleinfo5 

即使用戶可以屬於多個類別,並在情況下,有更多列之間沒有重疊,當然你也可以使用最後一種方法並添加多個標記(例如列istype1istype2),儘管這是一種非標準方法。

更新只是爲了闡明您如何使用第一種解決方案:每個用戶在表user(例如,與user id = 1。這也確保角色user1和user2的用戶不能具有相同的用戶ID。 User id是角色表中的主鍵和用戶表的外鍵。

要讓該用戶成爲角色1的用戶,請在表role 1上添加user id = 1。如果他(也)是角色2的用戶,則可以使用user id = 1向表角色2添加條目。

你可以加入表來獲得「整體」的畫面,

select * from user 
left join role1 on user.`user id` = role1.`user id` 
left join role2 on user.`user id` = role2.`user id` 

這種意志,除了雙ID列(將基本上可視爲到註釋標記istype1istype2秒解決方案)和缺少的角色列看起來就像只有一個表的第二種方法。

要檢查是否有user id = 1用戶角色1,您可以檢查是否role1.user id在此查詢null,或檢查user id = 1在表role1。例如,列出所有數據只是角色1,您可以使用

select * from user join role1 on user.`user id` = role1.`user id` 

(它使用一個連接,而不是左的加入,因爲和角色1項已存在)。

在大多數情況下,您甚至不需要專門的數據,因此您可以將您的account表與user表連接起來。在任何情況下,您都不必擔心檢查兩張表格(如果您決定添加第三種用戶,甚至更多)。

+0

謝謝。我正在考慮爲每種類型的用戶創建兩個表,併爲兩個表之間的某些常見屬性創建一個視圖。這種方法的弱點是什麼? – buggy3

+0

@oopaewem你的方法的一週點是a)它沒有,絕對沒有正確方法的優勢b)你不能確保表1和2中的用戶沒有相同的用戶標識c)你不能使用用戶標識作爲任何表的外鍵d)現在這種類型的問題會在每次嘗試將userdata與其他數據加入時在***中咬你 - 你總是必須檢查兩個表e)添加更多角色f)如果你因爲某種原因絕對想要2個「桌子」,從用戶g創建視圖user1和user2你可能只是想相信我們這是錯的 – Solarflare

+0

我現在明白了。謝謝 :) – buggy3

1

帳戶表的要點是什麼?如果每個用戶都有一個帳戶,那麼爲什麼不將帳戶列存儲在用戶表中。

此外,您仍然可以爲他們共享的列創建父用戶表,然後爲特定用戶創建子表。

例如
家長:用戶
兒童:員工/客戶

+0

但是,當我有一位家長,我怎麼能找到它的孩子?我仍然需要在兩張桌子上找? – buggy3

+0

你不能,父母甚至不知道他有孩子,但孩子知道他的父母是誰。 也許給一個用例你到底想要完成什麼。 從我的例子中,如果你想要一個客戶你呼叫客戶表的客戶,如果你想要一個員工你,員工表 – mimzee

相關問題