使用varbinary作为外键

时间:2012-03-20 12:08:02

标签: sql-server-2008 c#-4.0

对外键使用数据类型varbinary是否可以? 为什么? 我有一个EvalAnswer表,FK到Score表。 分数很敏感,应加密。加密/解密发生在asp.net(4.0)项目中,而不是在sql server(2008)中,因此数据类型必须是varbinary。

编辑:更多信息

当然。 我有这些列:Id,Score,ScoreText,Description,Index Id是增量计数器。 (PK) 分数是分数(例如1)。 ScoreText是一个字母的分数(分数1等于字母A)。 描述是对每个分数的评论。

我这样做的原因还在于有特殊情况, 例如其中一个问题只有1-4分,其余的分数为1-5分。

所以每个问题都有1分,但描述与另一个问题得分1不同。 所以如果我有5个问题,这会在Score表中提供5 * 5行。 (所有描述不同)

当我加载页面时,我会为每个下拉列表获得正确的评分(包含说明)。通常1-5。 但是当用户保存得分时,我需要知道页面加载时每个问题的早期saaved得分。 因此,我与EvalAnswer和评分之间存在关联。

关于得分表存在一些不敏感的问题。 但有些人是。对他们来说,我需要隐藏EvalAnswer和Score之间的关系。

可能是一个糟糕的设计是我使用相同的表(分数表)作为 一个显示每个问题的可用得分。 并且也是保持用户选择的那个。 (这是EvalAnswer的FK得分)

请建议.......

1 个答案:

答案 0 :(得分:0)

我建议在Score表中添加ID int列,并从EvalAnswer表中引用此字段。

这意味着您的表脚本将更改为

CREATE TABLE Score (
   Id int not null identity primary key
 , Code varbinary(max)  --> The new field containing the encrypted information
 , Score int
 , ScoreText varchar(5)
 , Description varchar(max)
 , Index int) 

CREATE TABLE EvalAnswer (
   Id int not null identity,
   ScoreId int not null references Score(Id)
   ...
)

如您所见,“旧”Id字段现已成为Code字段。新字段是包含唯一编号

identity

在外键中使用varbinary列没有任何反对意见,但它会使查询和调试更加困难。

另请注意,索引宽度有900字节限制,在存储加密blob时可能更容易命中。