我有一个TCG卡的数据库,我试图决定一个主键。最初,我用代理键解决了这个问题,但是我意识到,有时候,有些卡片是我忘记添加的,例如促销卡片。这是代理键问题,因为它们以最新的自动增量添加到数据库中,并且我不希望它们的ID依赖于它们插入的顺序。我在想也许我可以对一些卡的功能进行散列,并将其用作主键而不是?crc32作为主键的自然键
就拿下面的伪代码:
// set code, date released, collector number, name
$crc = crc32(implode(',', ['A', '1993-08-03', '232a', 'black lotus']));
echo $crc; // 4199975187
的卡的数量可能只徘徊25K左右,现在和成长每6个月左右100-300。
- 以这样的速度,不会有碰撞的权利?
- 这是一个很好的做法吗?我有其他好的选择吗?
我知道我可以做的哈希通过将其转换为base 62
短,但我将加入到这些用户的库存表所以我想保持这些在int
将是最好的选择。
一般来说,“智能钥匙”(例如从连接列产生的钥匙)是一个_bad_想法。你能解释一下为什么'代理钥匙'不能解决你的问题吗?密钥只是一个唯一的数字,如果密钥的值也恰好对应于插入的顺序,它又有什么关系? – hashbrown 2015-03-25 04:06:40
查看应用程序的用户将看到“ID”。最有可能在$ _GET参数中。我不希望他们根据他们的ID猜测卡片插入数据库的顺序。 – voldomazta 2015-03-25 04:11:53
为什么插入顺序对最终用户有影响?这不像你揭露表名或实际秘密。大多数Web应用程序都使用密钥的身份。很大比例在某处公开这些密钥。没什么大不了的。 – Tim 2015-03-25 04:32:18