2013-07-19 78 views
1

我對數據庫設計一個小問題:MySQL的最好的方式來存儲動態列表

比方說,我有一個「組」表(用戶)。 在這個表格中有基本的字段,其中包含有關組的信息(創建日期,名稱等)和一個應包含該組用戶列表的字段。

我有一個「用戶」表,其中包含有關用戶(真的?)的信息。 此表未鏈接到組表,因爲用戶不被強制設置組。

在一組中,用戶可以是「總統」(只有一個)或「審覈員」(幾個)

因此,在「基團」表,將有一個「總統」的字段,它包含了會長用戶名。 而我需要一個「監票人」字段,其中將包含監票人ID列表。

我不知道如何處理這個列表。也許將每個ID存儲在一個文本字段中,用一個字符(';'或' - ')分隔...

製作另一張表似乎很奇怪,因爲它只是網站的一小部分。

你會如何解決這個問題?

回答

7

我不知道如何處理這個列表。也許將每個ID存儲在一個文本字段中,以字符(';'或' - ')分隔...

不要這樣做。請參閱Is storing a delimited list in a database column really that bad?

製作另一張表似乎很奇怪,因爲它只是網站的一小部分。

這是表示多對多關係的正確標準化方法。

如果一個用戶只能在最多一個組(一個多到一的關係),你可以店在users表組成員資格(離開列NULL如果用戶沒有在任何一組),並在該表中標記其成員資格是否爲presidentscrutineer,或者假設scrutineer,除非它們也是groups表中的president。然而,在這種情況下,我可能仍會試着堅持使用附加表格,並在user列上定義約束條件UNIQUE

+0

看起來我錯了,但如果這是一個非常大的項目呢?如果我那樣做,它將以數百張桌子結束! 也許我的問題似乎很愚蠢,但我只爲小項目工作。這是我的第一件大事,我很擔心性能問題。 – FLX

+0

@FC':你爲什麼最終會有數百個表?只有三個,不管有多少用戶和組。 – eggyal

+0

在這種情況下,是的,這是我的項目中的一個簡化示例。但是我會將其應用到網站的每個部分,我擔心我將不得不處理PHP的表的數量。我讀了一些關於正常化的內容,你說得對,但我不知道,我的印象是我沒有做正確的事情。 – FLX

3

假設一個用戶可以屬於多個組,您最終會得到多對多的關係。這通常通過創建關聯表來解決。

Groups 
id, name 

Users 
id, email, etc. 

Users_Groups 
group_id, user_id 
1

像有些人所說,這是多對多的,所以你需要的是一箇中間表來存儲用戶的一組關係。用戶所屬的每個組都是中間表中的一個條目 - 我稱之爲「成員資格」,這是我存儲這種成員資格的地方。院長會議等描述了用戶與組織的關係,因此會員表是存儲的合理位置。

這種構架變得不那麼困難了,當你熟悉稍微更復雜的查詢(如連接)

進行比較,以你的架構 - 讓一組總統的ID

SELECT PresidentID FROM Groups WHERE GroupID=... 

到:

SELECT UserID FROM Membership WHERE IsPresident=TRUE AND GroupID=... 

或者相同的查詢,只爲IsScrutineer=TRUE --returns所有的。然後,迭代成員變得更簡單,不需要解析。

User: 
    UserID 

Group: 
    GroupID 

Membership: (user is member of a group) 
    GroupID 
    UserID 
    IsScrutineer 
    IsPresident 
+0

需要在'(GroupID,IsPresident)'上定義唯一性約束。 – eggyal

相關問題