2016-09-19 39 views
-2

我的應用程序有2種類型的用戶,所以我採用標準方法之一來設計的架構:哪個ID應該標識具有兩種用戶類型的MySQL架構中的用戶?

用戶(保持字段二者用戶類型之間共享):

+----+----------------+---------+ 
| id |  email  | type_id | 
+----+----------------+---------+ 
| 1 | [email protected] |  1 | 
| 2 | [email protected] |  2 | 
| 3 | [email protected] |  1 | 
+----+----------------+---------+ 

user_types

+----+----------+ 
| id | name | 
+----+----------+ 
| 1 | person | 
| 2 | company | 
+----+----------+ 

(第一用戶類型):

+----+---------+------------+-----------+ 
| id | user_id | first_name | last_name | 
+----+---------+------------+-----------+ 
| 21 |  1 | John  | Smith  | 
| 23 |  3 | Sohn  | Kmith  | 
+----+---------+------------+-----------+ 

公司(第二用戶類型):

+----+---------+--------------+ 
| id | user_id | name   | 
+----+---------+--------------+ 
| 31 |  2 | Company Inc. | 
+----+---------+--------------+ 

user_id字段中personscompanies是一個外鍵引用users.id。現在

,在某些時候,我需要創建用戶個人資料頁,並且URL會使用用戶的ID,像這樣:

  • /公司/ [ID] -company-INC
  • /人/ [ID] - 約翰 - 史密斯

我的問題是:

其中ID應該用來識別用戶嗎?哪個ID應該是將在整個應用中使用的「用戶ID」?

它應該是從users表(users.id)的人,還是應在相應的表(persons.id或​​)之一的一個,因爲他們都有自己的主鍵?

我的假設是,every table should have a primary key,所以我會去從任何用戶特定的表 - 個人或公司的ID。

這種方法是否正確?

+0

我可能會誤解,但似乎您暗示由於'persons'和'companies'是「第一和第二」用戶類型,所以每個表中每個用戶只有一個條目* 。那是對的嗎?如果是這樣,那麼我不確定爲什麼這些都是單獨的表格。 (在任何情況下,'users.id'都是可以使用的) – aaronofleonard

+0

@Amleonard由於性能原因,用戶表主要是分開的。這兩個用戶類型是非常不同的(上面的表格被簡化了),所以如果我想把所有的用戶信息保存在'users'表中,這個行會變得非常寬。相反,我想保持清潔,特別是將來可能會有更多的用戶類型,如果邏輯上分離,添加它們會更容易。擁有「簡短」用戶表格也會提高登錄速度。 ---關於你的建議 - 你說的'user.id'。你能寫出原因嗎? 「人員」和「公司」中的主鍵不會無用嗎? – lesssugar

+0

主鍵可能沒用,這沒關係。你甚至可以重用用戶ID作爲這些表中的主鍵,所以你只有一個ID。用戶ID的好處是它是唯一的,它不需要額外的步驟就可以到達用戶表。如果您使用人員/公司ID,那麼您必須先查找人員/公司,然後獲取用戶ID(或者您可以使用連接 - 無論哪種方式,您都在查看三個表格,這會否定一個首先是小型用戶表)。 – siride

回答

1

我認爲對於一個用戶,你將只有一個人或只有一個公司。 如果這是我推薦的公司和個人的表一樣從USER_ID

爲ID使用,因此例如companies表看起來像這樣的情況:

+----+--------------+ 
| id | name   | 
+----+--------------+ 
| 2 | Company Inc. | 
+----+--------------+ 

所以users.id = companies.id

人桌也一樣。

這樣就很清楚要選擇什麼樣的ID,因爲它在所有表中都是一樣的,不會造成混淆。

如果你不想改變這樣的表格,我想你應該從二級表中選擇ID。因此,公司要從該表中選擇ID,並將其稱爲company_id(在代碼中,而不是mysql),對於人員也是如此。這樣代碼就會清楚你所指的是什麼ID。

+0

因此,在你最初的想法中,你建議將'company.id'作爲引用'users.id'的外鍵,或者使其成爲硬編碼的主鍵? – lesssugar

+0

我建議''公司.id'主鍵和外鍵'users.id' –

+1

感謝澄清這一點。有趣的是,我不確定你是否可以將PK與FK結合起來。一個好帖子:http://stackoverflow.com/questions/8949028/mysql-using-foreign-key-as-primary-key-too。另外,我需要重新考慮將用戶分成不同的表格。不能100%確定這是否是最終的正確方法。 – lesssugar

相關問題