2

我需要存储多台计算机的服务列表。我想我会创建一个表来保存所有可能的表的列表,一个用于所有可能的计算机的表,然后是一个将服务链接到计算机的表。

我正在考虑保持完整服务列表的唯一性,我可以使用可执行文件的哈希作为服务的主键,但我不确定这是否会有任何缺点(请注意,哈希仅适用于识别。不用于任何类型的安全目的)。我在考虑而不是使用二进制字段作为主/外键,而是将值存储为 base 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 访问它)。

4

2 回答 2

4

问题是散列在定义上不是唯一的。您不太可能发生碰撞,但有可能。结果,您不能只使用哈希,这意味着整个哈希 id 是死胡同。

使用普通的 ID 字段,在 ServiceName 上使用带有索引的唯一约束。

于 2012-07-03T13:42:05.863 回答
0

从性能的角度来看,拥有非增量主键会导致聚集索引很快变得碎片化。

我建议:

  1. 使用具有自动增量的INT或代理 PK。BIGINT
  2. 使用顺序 GUID作为 PK。索引不如INT增量索引快,因此碎片时间低。

然后,您可以在其他列上使用非聚集索引,包括存储哈希的列。VARCHAR您还可以对其进行全文索引,然后在查找特定哈希时进行精确匹配。

但是,如果可能,请改用数字哈希并在其上创建非聚集索引。

当然,请考虑@TomTom下面提到的内容。

于 2012-07-03T13:45:07.840 回答