随机ID生成器,映射与同列

时间:2010-01-24 03:52:15

标签: java sql database hibernate

我们希望从客户那里隐藏一些实体,但主要原因是,我们不希望客户知道数据库中有多少实体。

e.g。来自网址http://mydomain/user/get/27,它表示这是第27个用户。

因此,我正在实施一个分配随机ID的解决方案(必须是唯一的)。换句话说,不是使用唯一的序列号,而是使用唯一的非序列+随机数解。

e.g。来自网址http://mydomain/user/get/8534023,实际上是第27个用户。

我的问题是,知道这里的一些用户可能有类似问题的经验,我应该使用地图还是将随机ID分配给主键列?

e.g。

CREATE TABLE IF NOT EXISTS `test` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `somethingElse` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
)

CREATE TABLE IF NOT EXISTS `map` (
  `id` int(10) unsigned NOT NULL,
  /* Foreign Key to test table */
  `parent` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `parent` (`parent`)
)

VS

CREATE TABLE IF NOT EXISTS `test` (
  /* Assign random ID here */
  `id` int(10) unsigned NOT NULL,
  `somethingElse` varchar(255) NOT NULL
  PRIMARY KEY (`id`)
)

对我而言,后者变得更加方便,因为我不需要维护地图,也不必自定义DAO /应用程序以使用映射的ID(或内部的确切ID)。对于这两种情况,我必须编写自己的随机ID生成器。

2 个答案:

答案 0 :(得分:3)

你是对的 - 后者是更好的方法。这是一对一的关系 - 没有理由有一个单独的表。我建议:

  • “假”user_id的索引,因为它将用于查找
  • 对列的UNIQUE约束,以确保不插入重复值

您的担忧也适用于不公开实际的主键值。它确保如果数据库发生更改,并且实际的主键值已更改 - 用户将不知道更改。

答案 1 :(得分:2)

为什么不将增量种子起始值设置为8534023?您的第一个客户是8534023,您的第二个客户是8534024等。您的客户永远不会知道这意味着什么,但您会。