【发布时间】:2018-07-01 05:05:28
【问题描述】:
我们有一个电子商务网站,其中一个项目(移动)具有两种类别。一个是'good-mobiles',另一个是'bad-mobiles'。
我们通过对某个参数进行一些计算来决定这一点。
我们有两个数据库表,一个存储所有好手机(表名:gMobiles),另一个存储所有坏手机(表名:bMobiles)。我们在前面添加 'g' 或 'b' 并带有一些自动递增的 id 并将其存储在相应的表中。
所以gMobiles 包含所有以“g”开头的 id,bMobiles 包含所有以“b”开头的 id。我们将这个 ids 添加到详细信息页面的 url 中。
现在的问题是用户可以通过查看 url 或将鼠标悬停在桌面列表页面上的项目上轻松识别移动设备的好坏。
为了解决这个问题,我们想到了使用编码(例如 base64 编码),但编码的问题是编码字符串中的“g”被其他一些字符替换,并且对于所有“g”,它总是给出相同的字符,所以它不会解决我们的问题。
Orig Text | Encoded Text
----------|-------------
g1234 | ZDEyMz
g1267 | ZDEyUS
b3456 | YTEyMz
b7654 | YTMyQs
g7654 | ZDMyQs
我们没有使用加密,因为加密的字符串会很长(对于 8 个字符的输入字符串,它将给出 40-50 个字符)。
是否有任何方法可以对结果字符串进行排序,并且仅通过查看 URL 就无法确定移动设备的好坏。
【问题讨论】:
-
为什么不对每个产品都使用 GUID?
-
我会争辩说,首先为好手机和坏手机分别设置表格是一个糟糕的设计选择,假设唯一能区分好坏的是我想要的一个属性建议使用单个表格并添加一列来指示移动设备的好坏。这样一来,您根本不必向用户公开这些信息,并且您拥有更好的数据库设计。
-
“选择 32 个字符的查询会影响性能” - 我非常怀疑这会不会很明显。
-
@yajiv 你错了。如果使用 GUID 会“减慢”您的查询,那么您有一个严重的设计和实现问题
-
可能吗?几乎可以确定。假设您控制 ID 生成,您可以使用秘密盐对 ID 进行散列,然后只查看散列的最后一位,如果它不是您想要的方式,则丢弃该 ID。这是一个非常非常糟糕的主意。您不应该尝试在 ID 中嵌入额外信息。