我可以使用优雅的配对功能作为数据库中的主键吗?
Can I use Elegant Pairing Function as primary key in DB?
我正在写一个服务器,让多个用户可以修改一个post。
所以我创建了包含用户 ID、post ID 和权限数据的权限 table。
而我只想用一个值查询这个(我只是认为用一个值查询比用两个值查询更有效),所以我用谷歌搜索并找到 this.
不过,我也发现 Cantor Pairing Function isn't unique,
所以我们不能使用 Cantor 配对函数作为主键。
但这只涉及 Cantor 方式,而不是 Elegant Pairing Function (by Matthew Szudzik)
优雅的配对功能如何?
使用优雅配对密钥作为数据库中的主键是否安全?
或者我应该放弃并用两个值查询吗?
除非您的存储强制执行单个 ID 字段约束,否则我相信这是著名的示例
Premature optimization is the root of all evil. (D.Knuth).
请注意,Cantor 配对函数对于 real 数字不是唯一的,但它对于 是唯一的]integers 而且我认为您的 ID 不是非整数。我认为这与您引用的优雅配对功能完全相同,因为在结构上它基于相同的想法。如果你需要一个具体的反例,这里有一个:
ElegantPair(1, 2) = 2^2 + 1 = 5 = 2.1^2 + 0.59 = ElegantPair(0.59, 2.1)
另一方面,真正的问题是无论您使用什么巧妙的技巧,您都无法将两个 32 位(或您使用的任何大小)int 值放入一个相同大小的 int 值中。配对函数背后的技巧是基于这样一个事实,即整个 N 是无限的并且 NxN 有"size" 与 N 相同,这对于固定大小的真实(计算机)世界整数显然不正确。因此,无论您在固定大小的整数上使用什么映射,它都不会是唯一的。
我正在写一个服务器,让多个用户可以修改一个post。
所以我创建了包含用户 ID、post ID 和权限数据的权限 table。
而我只想用一个值查询这个(我只是认为用一个值查询比用两个值查询更有效),所以我用谷歌搜索并找到 this.
不过,我也发现 Cantor Pairing Function isn't unique,
所以我们不能使用 Cantor 配对函数作为主键。
但这只涉及 Cantor 方式,而不是 Elegant Pairing Function (by Matthew Szudzik)
优雅的配对功能如何?
使用优雅配对密钥作为数据库中的主键是否安全?
或者我应该放弃并用两个值查询吗?
除非您的存储强制执行单个 ID 字段约束,否则我相信这是著名的示例
Premature optimization is the root of all evil. (D.Knuth).
请注意,Cantor 配对函数对于 real 数字不是唯一的,但它对于 是唯一的]integers 而且我认为您的 ID 不是非整数。我认为这与您引用的优雅配对功能完全相同,因为在结构上它基于相同的想法。如果你需要一个具体的反例,这里有一个:
ElegantPair(1, 2) = 2^2 + 1 = 5 = 2.1^2 + 0.59 = ElegantPair(0.59, 2.1)
另一方面,真正的问题是无论您使用什么巧妙的技巧,您都无法将两个 32 位(或您使用的任何大小)int 值放入一个相同大小的 int 值中。配对函数背后的技巧是基于这样一个事实,即整个 N 是无限的并且 NxN 有"size" 与 N 相同,这对于固定大小的真实(计算机)世界整数显然不正确。因此,无论您在固定大小的整数上使用什么映射,它都不会是唯一的。