0

我正在构建一个附属系统,并且我已经将数据库的设计堆叠在一个部分中。我不知道如何跟踪谁招募了谁。假设我们有这样的事情:

  • 乔恩·史密斯
    • 亚历克斯·德尔
      • 吉姆·韦斯特
      • 马可波罗
      • 约翰尼布拉沃
    • 坑桑普拉斯
      • 萨拉马特
      • 加布里埃拉白
      • 安东尼奥·桑托
    • 玛雅·格罗兹丹诺娃
      • 阿贡·谢拉迪尼

这一切都是这样进行的: 1.Jon 招募了 Alex,Alex 招募了 Jim、Marko 和 Johny。2.Jon招募了Pit,Pit招募了Sara、Gabriella和Antonio。3.Jon招募了Maja,Maja招募了Agon。阿贡可以招募一些人,而那个人可以招募一些人,这是无限深的。

有没有人知道如何解决这个问题。如何设计桌子?

4

3 回答 3

2

只需使用一个自引用表,带有一个 ID 和一个recruitedbyid:

ID 姓名 RecruitedBy
1 乔恩·史密斯 null
2 亚历克斯·德尔 1
3 马可波罗 1
...

您没有提及您使用的是哪个数据库,但 SQL Server 2008 有一个分层数据类型,它仅适用于这些情况,hierarchyid

于 2010-07-30T07:42:49.053 回答
1
  • 您处理的“实体”一张表(人员、企业)
  • 一张表“EntityRelation”确定关系

因此,Alex Dell 与 JonSmith 有关系,他雇用了他。这是一种非常标准的 CRM 方法。

于 2010-07-30T07:42:22.263 回答
1

创建两列:

  • int userId : PRIMARY KEY 和 AUTO_INCREMENT 如果您的数据库支持它。每个用户都将被分配一个唯一的号码。
  • int referrer:这是推荐当前用户的人的 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
*/
于 2010-07-30T07:47:53.940 回答