如果在另一個表中有兩個表引用單列時如何設計表,如何在另一個表中有兩個表引用單列時設計表
例如,我有兩個類型的用戶(可以稱它們user1
和user2
),因爲這兩種類型的用戶具有多個不同的信息,所以我創建兩個表中的每個人,並且每個用戶具有一個帳戶登錄到系統。所以我創建了一個表呼叫帳戶,並讓兩個表user1
和user2
參考表帳戶中的ID。所以當我有一個帳戶,我想知道這個帳戶屬於哪一個。這很不方便,因爲我必須在兩張桌子上找。
它有解決這個問題的方法嗎?
如果在另一個表中有兩個表引用單列時如何設計表,如何在另一個表中有兩個表引用單列時設計表
例如,我有兩個類型的用戶(可以稱它們user1
和user2
),因爲這兩種類型的用戶具有多個不同的信息,所以我創建兩個表中的每個人,並且每個用戶具有一個帳戶登錄到系統。所以我創建了一個表呼叫帳戶,並讓兩個表user1
和user2
參考表帳戶中的ID。所以當我有一個帳戶,我想知道這個帳戶屬於哪一個。這很不方便,因爲我必須在兩張桌子上找。
它有解決這個問題的方法嗎?
如果你有一個實體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
即使用戶可以屬於多個類別,並在情況下,有更多列之間沒有重疊,當然你也可以使用最後一種方法並添加多個標記(例如列istype1
和istype2
),儘管這是一種非標準方法。
更新只是爲了闡明您如何使用第一種解決方案:每個用戶在表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列(將基本上可視爲到註釋標記istype1
,istype2
秒解決方案)和缺少的角色列看起來就像只有一個表的第二種方法。
要檢查是否有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
表連接起來。在任何情況下,您都不必擔心檢查兩張表格(如果您決定添加第三種用戶,甚至更多)。
謝謝。我正在考慮爲每種類型的用戶創建兩個表,併爲兩個表之間的某些常見屬性創建一個視圖。這種方法的弱點是什麼? – buggy3
@oopaewem你的方法的一週點是a)它沒有,絕對沒有正確方法的優勢b)你不能確保表1和2中的用戶沒有相同的用戶標識c)你不能使用用戶標識作爲任何表的外鍵d)現在這種類型的問題會在每次嘗試將userdata與其他數據加入時在***中咬你 - 你總是必須檢查兩個表e)添加更多角色f)如果你因爲某種原因絕對想要2個「桌子」,從用戶g創建視圖user1和user2你可能只是想相信我們這是錯的 – Solarflare
我現在明白了。謝謝 :) – buggy3