2016-09-19 62 views
0

以下方案將在關係數據庫中實現。用於處理項目列表的表結構

我有以下情況: 有多個用戶,都是唯一的。每個用戶可以屬於一個或多個「團隊」。每個團隊可以擁有未知數量的用戶。

到目前爲止,我得到的是,我應該與所有的隊伍和所有的用戶有一張桌子。 但是關於如何存儲用戶所屬的團隊,我是否需要爲他所屬的每個團隊ID添加一個字段?我是否也需要確定他可以參加的比賽的數量或者是否可以有一定的限制? (如何存儲一個列表,在其他應用程序中的限制是可用的內存)。

理想情況下,我想要一個結構,可以讓我輕鬆查找用戶屬於哪個團隊。

在團隊表中也有類似的問題,我是否也需要定義團隊中用戶的限制?在這種情況下,我需要爲團隊中的每個用戶提供一列嗎?

最後,這個例子應該避免的東西,我應該看看結構不同?如果是這樣,請提供一個例子。

我不是在尋找代碼的例子,只是關於如何建立這些關係的例子。

還接受一些關於哪些數據庫結構類型用於每種類型的問題的文檔的建議。

回答

0

你的問題是所謂的多對多關係

你的數據庫應該是這樣的

用戶表包含(IdUserName,Password,...其他欄)

團隊表包含(Id,Name,..其他列)

UserTeamsUserIdTeamId,其他列)

現在你有一個表UserTeam 2個選項

  1. 兩個用戶名和TeamId是主鍵和外鍵:這意味着每個用戶不能在同一個團隊中註冊兩次,但可以註冊很多但唯一的團隊
  2. UserId和TeamId都是外鍵,並且您有另一個主鍵ID:此結構將允許您舉例跟蹤用戶團隊的歷史記錄,例如,如果您添加了加入日期(必填)和離職日期(可選),並且在用戶離開團隊時更新它,並且您需要添加一些用戶無法在同一團隊中註冊的約束對於同一用戶標識和團隊標識的兩個記錄,請假日期爲空。

第二結構編碼將是如下:

UserTeams

  • Id:主鍵
  • UserId:外鍵引用Users
  • TeamId:外鍵參考Teams表格
  • DateOfJoin:需要時間字段
  • DateOfLeave:可選的時間字段,將每當用戶離開球隊

平時我比較喜歡第二種方法,可以提供所需的結構較少的更多的細節來填充。

希望這將幫助你

+0

我真的很喜歡你在第二種情況下的方法,我沒有想那麼遠,但實際上這符合我心中的想法! 感謝你和Ghost的回答,我現在有了一個很好的主意。非常感謝! – Danyjex

+0

請接受我的回答,如果您覺得有用,請投票 – Monah

0

你是對的。您將擁有一個用於用戶,團隊和連接它們的表格的表格(UserTeam也許)。 UserTeam表將存儲用戶和單個團隊的ID;如果該人員在多個團隊中,則會有多行。

就限制而言,這是一個需求問題而不是數據庫問題。你當然可以限制它,但應該不是一個技術問題。

這裏是MS SQL Server中的表結構:

DECLARE @User TABLE (
    UserID INT, 
    UserName NVARCHAR(200) 
) 

DECLARE @Team TABLE(
    TeamID INT, 
    Name NVARCHAR(200) 
) 

DECLARE @UserTeam TABLE (
    UserID INT, 
    TeamID INT 
) 
+0

所以如果限制取決於問題,如果我認爲在1種情況下用戶可以從1到1000的團隊的任何地方都有。爲了保存每個用戶所屬團隊的名單,是否有一張純粹的表格有意義? 所以我只會將「list」的id存儲在用戶表中,而不必讀取1000個團隊,如果我想讀取1個用戶的整個行。 – Danyjex

+0

適當的表格設計將在與用戶表格或團隊表格分開的表格中每行1個用戶+1個團隊。 – UnhandledExcepSean

+0

你的意思是說我會擺脫用戶表下的「團隊」列。相反,我會有一個表,其中每個用戶會有多行,每行只有一個團隊。所以,如果我想找出用戶屬於哪個團隊,我會查詢該表中的「X」用戶。 此外,原因是因爲任何數據庫都經過優化,不斷添加更多的行而不是列?而且,這樣做會通過犧牲內存爲我提供更好的查詢時間。 – Danyjex