11

我正在开发允许人们在线创建个人资料的网站。我想知道使用 MySQL AUTO_INCREMENTed ID 作为我的用户 ID 是否是正确的选择。还要记住,有一天我可能不得不在多台服务器上复制数据库?

例如,您会在 Twitter 或 Facebook 等网站上对 userId 使用此方法吗?


我之前尝试过用 PHP 生成用户 ID。我用过这样的东西:

function generateID() {
      $possible = "1234567890";
      $code = "";
      $characters = mt_rand(7,14);
      $i = 0;
      while ($i < $characters) { 
            $code .= substr($possible, mt_rand(0, strlen($possible)-1), 1);
            $i++;
      }
      return $code;
}

这给出了我需要的值类型,但如果该 ID 尚不存在,我总是必须从数据库中检查。

没有更好的方法吗?

4

5 回答 5

22

mysql自动增量是否可以安全地用作用户ID?

如果您的安全系统是可靠的,基本上,是的。但一般来说,Web 开发人员对暴露允许通过增加或减少一个数字来猜测其他ID 的ID 感到不舒服。许多人转而使用随机的多位数 ID。

在一个更模糊的说明中,数字 ID 还可以让竞争对手通过跟踪增量价值如何增加来估计您的增长。

于 2011-11-10T11:41:36.880 回答
6

不,这不是一个好主意,因为 auto_increment id 不容易移植。对于您的用户 id,您需要可以在数据库实例之间备份、恢复、移动等的 id,而不必担心 id 的冲突。

使用 UUID 之类的东西生成唯一数字或字母数字字符串会更好。

于 2011-11-10T11:43:16.330 回答
2

鉴于您正在提前计划并且可能会跨数据库分发数据,您最好考虑使用 UUID() 函数来获取唯一标识符。这使得未来数据的合并变得更加容易。

于 2011-11-10T11:42:43.257 回答
0

就个人而言,是的,我认为是的,直到某一点。当使用自动增量字段复制数据库表时,我认为该字段保留其最大值(取决于您如何复制它,我想到的场景是带有数据的 mysqldump)所以当您添加新行时,它将被分配下一个 ID。

但是,如果您要同时在多个数据库上运行它,并且它们没有被复制,那么您将需要其他一些生成 ID 的方法以避免获取具有相同 ID 的行(尽管我想不出一个场景,您会这样做)。

我不能说这是否是最佳实践,但它确实有效。

于 2011-11-10T11:43:06.253 回答
0

是的,如果您删除 id 为 7 的行,则自动增量的下一个值将是 8 而不是 7。所以所有的价值观肯定是独一无二的。并且您将需要截断表格以再次开始自动增量。因此,您始终可以为用户 ID 使用自动递增字段。

于 2011-11-10T11:46:41.100 回答