2

複数のコンピューターのサービスのリストを保存する必要があります。考えられるすべてのテーブルのリストを保持する1つのテーブル、考えられるすべてのコンピューター用のテーブル、そしてサービスをコンピューターにリンクするためのテーブルを作成すると思いました。

完全なサービスリストを一意に保つことを考えていました。実行可能ファイルのハッシュをサービスの主キーとして使用できる可能性がありますが、これに欠点があるかどうかはわかりません(ハッシュは識別。いかなる種類のセキュリティ目的でもありません)。バイナリフィールドを主キー/外部キーとして使用するのではなく、値を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自動インクリメントで、またはBIGINT代理PKを使用します。
  2. PKとしてシーケンシャルGUIDを使用します。インデックス作成はINTインクリメンタルほど高速ではないため、時間の断片化が少なくなります。

次に、ハッシュを格納している列を含め、他の列で非クラスター化インデックスを操作できます。また、フルテキストインデックスVARCHARを作成して、特定のハッシュを探すときに完全一致を実行することもできます。

ただし、可能であれば、代わりに数値ハッシュを使用して、非クラスター化インデックスを作成してください。

そしてもちろん、以下のことを考慮して@TomTomください。

于 2012-07-03T13:45:07.840 に答える