我需要存储多台计算机的服务列表。我想我会创建一个表来保存所有可能的表的列表,一个表用于所有可能的计算机,然后是一个表来将服务链接到计算机。
我想保持完整服务列表的唯一性,我可以使用可执行文件的哈希作为服务的主键,但我不确定是否会有任何缺点(请注意哈希值)仅用于识别。不用于任何类型的安全目的)。我正在考虑而不是使用二进制字段作为主/外键,我将该值存储为基本64编码的sha512,并使用nvarchar(88)
。类似的东西:
CREATE TABLE Services
(
ServiceHash nvarchar(88) NOT NULL,
ServiceName nvarchar(256) NOT NULL,
ServiceDescription nvarchar(256),
PRIMARY KEY (ServiceHash)
)
此解决方案是否存在任何固有问题? (我将使用SQL 2008数据库并通常通过C#.Net访问它。
答案 0 :(得分:4)
问题是哈希是按照定义而不是唯一的。你不可能碰撞,但它是可能的。因此,您不能仅使用散列,这意味着整个散列ID都是死胡同。
使用普通ID字段,在ServiceName上使用带索引的唯一约束。
答案 1 :(得分:0)
从性能的角度来看,拥有非增量主键会导致聚簇索引相当快速地分段。
我建议:
INT
或BIGINT
代理PK,并自动增加。INT
快,但增量快,因此碎片时间较短。 然后,您可以在其他列上使用非聚集索引,包括存储哈希值的列。作为VARCHAR
,您还可以对其进行全文索引,然后在查找特定哈希时进行精确匹配。
但是,如果可能,请使用数字哈希,并在其上创建非聚集索引。
当然,请考虑下面提到的@TomTom
。