暴露密钥时屏蔽数据库大小? (没有杀死性能)

时间:2012-04-10 23:01:37

标签: database

我们有一个数据库表,将有1000万条记录。我们不想使用auto_increment,因为这样我们的用户就可以知道我们有多少条记录。我们不想向竞争对手揭露这一点。我看到的问题是使用UUID或类似的东西会破坏查询性能。

例如,这是禁忌: http://domain.com/widgets?id=34345

因为竞争对手可以抓取网站以确定我们拥有多少小部件。是否应该在应用程序级别处理此业务屏蔽,还是可以在数据库级别处理它?大多数人在这种情况下做了什么?我们使用的数据库是postgres,但我认为解决方案仍然是数据库无关的。

2 个答案:

答案 0 :(得分:3)

使用GUID作为键。您可以查看this question以了解为什么可以这样做。您可以使用GUID号的子集逃脱,但比特大小越小,冲突的可能性越大。 GUID不是太大,应该能够存储为数字。转移的密钥是密钥的4倍,但这在很大程度上是不相关的。

对于1000万行,存储可能大约多120 MB,但在如此大的尺寸下,这似乎可以忽略不计。您是否测试过GUID的性能并发现它们缺乏?

答案 1 :(得分:2)

我使用基于slug的网址,其中slug是唯一的,因此是索引字段,另外你会得到像http://example.com/awesome-blue-widget这样的网址。你可以通过小写小部件名称来创建slug,用连字符替换空格等。我的web框架有一个简单的slugify函数,如果已经使用了slug,我会扩展到最后添加一个增量。

Slugs通常匹配模式[a-z0-9-]+。您仍然可以使用自动递增的主键,以便在其他表中使用外键,而不会影响您的业务数据。