2010-07-30 152 views
0

我正在構建一個聯盟系統,我已經將數據庫的設計與一個部分堆疊在一起。我不知道如何跟蹤誰招募誰。比方說,我們有這樣的事情:聯盟系統的數據庫設計

  • 喬恩·史密斯
    • 亞歷克斯·德爾
      • 吉姆·西
      • 馬爾科馬可波羅
      • 英勇強尼
    • 坑桑普拉斯
      • 薩拉墊
      • 加布裏埃拉白色
      • 安東尼奧聖
    • 瑪雅Grozdanova
      • 阿貢Xheladini

這一切這樣做: 1.Jon招募Alex,Alex招募了Jim,Marko和Johny。 2.Jon招募了Pit,Pit Recruited Sara,Gabriella和Antonio。 3.Jon招募Maja,Maja招募Agon。 Agon可以招募一些ells,並且可以招募到某人ells,這是無限的深度。

有沒有人有一個想法如何解決這個問題。如何設計表格?

爲「實體」

回答

2

只需使用一個自參照表,用一個ID和一個recruitedbyid:

 
ID Name  RecruitedBy 
1 Jon Smith null 
2 Alex Del 1 
3 Marko Polo 1 
... 

你沒有提到你正在使用的數據庫,但SQL Server 2008具有分層的數據類型,適合於剛這種情況下, hierarchyid

+0

抱歉,我使用的MySQL – AXheladini 2010-07-30 07:58:11

+0

這將是一般用戶的表,要不我就只需要爲這個問題創建另一個表? – AXheladini 2010-07-30 07:59:01

+0

@AXheladini - 這將是唯一的表格,因爲您的要求似乎是任何用戶都可以成爲招聘人員。尚未被招募的用戶對於RecruitedBy將具有「空」。 – Oded 2010-07-30 08:00:56

1
  • 一張桌子你處理(個人,企業)
  • 一表「EntityRelation」確定關係

所以,亞歷克斯·戴爾有關係JonSmith,他僱用了他。這是一種非常標準的CRM方法。

1

創建兩列:

  • INT 用戶id:主鍵和AUTO_INCREMENT,如果你的數據庫支持。每個用戶將被分配一個唯一的號碼。
  • int 引用者:這是引用當前用戶的用戶的userId。如果用戶不是任何其他用戶的會員,則可將其設置爲0或NULL。

樹圖可以很容易地用幾行代碼。

編輯:既然你問了,這是樹形圖的一些代碼。我選擇了PHP因爲MySQL查詢很容易實現,但這個概念可以很容易地用Java,C和Ruby,Python等

function listUsers($handler, $id, $prefix) { 

    // Please use MySQLi extension with prepared statements or your code 
    // becomes SQL injection paradise 
    $results = mysql_query("SELECT `user`, `referrer` FROM `users` WHERE `referrer` = $id"); 

    while ($row = mysql_fetch_row($results) { 
     echo $prefix . $row[0]; 
     listUsers($handler, $$row[1], $prefix . "* "); 
    } 
} 


$handler = mysql_connect(. . .); 
listUsers($handler, 0, "") 

做我80%肯定正確實現時,邏輯將起作用。它應該回報:

/* 
Jon smith 
* Alex Del 
* * Jim West 
* * Marko Polo 
* * Johny Bravo 
* Pit Sampras 
* * Sara Mat 
* * Gabriella white 
* * Antonio Santo 
* Maja Grozdanova 
* * Agon Xheladini 
*/ 
+0

你能爲這個樹圖寫一些僞代碼嗎? – AXheladini 2010-07-30 07:54:57

+0

當然可以。我編輯了我的帖子。 – Vortico 2010-07-30 08:25:42

+0

我在這裏做錯了: <?php $ server =「localhost」; \t $ user =「root」; \t $ password =「」; \t $ database =「synergytest」; 功能listUsers($處理,$ ID,$前綴){ //請使用預處理語句MySQLi擴展或代碼 //成爲SQL注入天堂 $結果=請求mysql_query(「SELECT FROM tbl_users名稱,其中Recruitedby = $ ID「); 而($行=和mysql_fetch_row($結果){ 回波$前綴$行[0]; listUsers($處理程序,$ NEWID,$前綴 「*」);。 } } $處理機= mysql_connect($ server,$ user,$ password); listUsers($ handler,0,「」); ?> – AXheladini 2010-07-30 13:09:45