2010-01-15 56 views
0

我需要一些關於如何構建我的數據庫的輸入。在MySQL模式上需要一些輸入

假設我想將成員數據存儲在成員表中。有兩種類型的成員,比方說人員和組織。人員和組織有不同的信息集合,因此我們必須將它們存儲到兩個不同的表格中:讓我們說人員和組織。

我想有以下表格:

成員:

id 
member_type_id 
status 
etc.. 

member_types:

id 
type (person|organization|or any other type if needed) 

人數:

id 
name 
etc 

組織:

id 
name 
etc 

我的問題是:哪一個是最好的以下內容的?

  1. 在這兩個個人和組織表有member_id
  2. 有在成員表中的一個額外的列來存儲或者爲person_id或的organization_ID
  3. 有兩個額外的列成員表來存儲爲person_id或的organization_ID以適用者爲準

還有另一個要求,可能會有另一個表提到個人和組織表。假設我們有一張名爲訪客的表,也可以是一個人或一個組織。

謝謝您的輸入。

回答

1

通常最好繪製出你的關係,以便更容易理解這兩個實體之間的關係。這將讓你輕鬆地說這是一對一,多對一,一對多或多對多等。

這就是說,一旦你知道了這一點,它設置起來微不足道。

如果您使用的是Java或.Net,您可以使用Hibernate/NHibernate通過指定關係自動爲您創建表。

這裏是我會從你勾勒出什麼樣的設計表: (請記住,這是Java命名架構以下)

MemberType 
id  (int11, auto increment, primary key) 
name (varchar31, unique) 

One note about MemberType, if you're using Java and you will not dynamically add/remove member types, you should use an enum here. 


Member 
id (int11, auto increment, primary key) 
memberType_id (int11, on update cascade, on delete cascade) 


Organization 
id (int11, auto increment, primary key) 
name (varchar31, unique) 

-- Depends on how you want this structured (I would design it as a many-to-many relationship 
MemberOrganization 
member_id  (int11, on update cascade, on delete cascade, this links to the member id) 
organization_id (int11, on update cascade, on delete cascade, this links to the organization id) 

要獲得一個特定組織的所有成員名單...

SELECT 
* 
FROM 
Organization o 
INNER JOIN MemberOrganization mo ON mo.organization_id = o.id 
INNER JOIN Member m ON m.id = mo.member_id 
WHERE 
o.name = 'StackOverFlow.com' 

再次查看您的問題後,我認爲您正在尋找不同的答案。

沃爾特

0

你也可以這樣做:

會員 ID 名 狀態

人(延伸會員) ID(鏈接到會員ID)

組織(延伸會員) id

遊客 ID 日期 member_id(同樣,這鏈接到成員表中,你將不得不做外連接,以獲得實際的數據成員,無論是個人或組織)

它使用一個主鍵連接列和通過每個子類的單獨表繼承。在Hibernate中,查詢會自動爲您寫入/處理,但它們並不難編寫。

讓我知道是否有幫助。

另外,你使用PHP,Java等,你能提供更多的背景信息到你需要或正在使用它?可能會有更好的桌子設計,這是非常不同的。

就像我說的那樣,有一些工具可以爲你自動化這些東西,所以你不用擔心低級細節。當然,即使在使用這些工具之前,您也需要了解這種關係,否則,您的狀況並不會好轉。理解它們是很好的,但是這些工具已經爲你需要的東西的90%進行了優化。

Walter