【问题标题】:Use varbinary as foreign key使用 varbinary 作为外键
【发布时间】:2012-04-04 21:34:17
【问题描述】:

是否可以将数据类型 varbinary 用于外键? 为什么? 我有一个 EvalAnswer 表和一个分数表的 FK。 分数很敏感,应该加密。加密/解密发生在 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 个问题,这会在分数表中给出 5*5 行。 (都有不同的描述)

当我加载页面时,我会为每个下拉列表获得正确的评分(带有描述)。一般1-5个。 但是当用户保存了评分时,我需要在页面加载时知道每个问题之前保存的分数。 因此,我在 EvalAnswer 和评分之间建立了关系。

有一些与分数表相关的问题不敏感。 但有些是。对于他们,我需要隐藏 EvalAnswer 和 Score 之间的关系。

可能是一个糟糕的设计是我使用相同的表(分数表)作为 一个显示每个问题的可用分数。 并且还作为一个保存用户选择的东西。 (这是从 EvalAnswer 到 Score 的 FK)

请指教.......

【问题讨论】:

  • 这并不违法,但这是一个非常的坏主意。
  • 好吧,为什么这是个坏主意?请推荐其他解决方案。如果您需要有关我的设计的更多信息,请询问。
  • 好的。请解释为什么您需要加入乐谱?
  • 您的问题没有传达为什么您需要 varbinary 作为外键。使用任何非固定长度值作为外键或主键是个坏主意。
  • 好的,我已经编辑了问题。

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


【解决方案1】:

我建议在 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 时可能更容易命中。

【讨论】:

  • 嗨 Filip 我已经有一个来自 EvalAnswer 的参考来得分。而我拥有的这个身份就是我需要保护的身份。但我需要在 asp.net 应用程序中加密/解密。所以我需要将列改为 varbinary,因此我的问题是。那么,除了将我的 FK 用作 varbinary 之外,没有其他方法了吗?
  • 那么你有 2 个从 EvalAnswer 到 Score 表的外键?
  • 不,我只有一个。我不确定我在哪里误解了你。但它仍然需要是 varbinary。
  • 嗨。我看到了你的更新。我现在很困惑。也许我所寻找的无法完成。我保护任何有权访问数据库服务器的人的数据。他们仍然会看到两个表之间的关系,因此用户得分。当用户第一次访问该页面时,下拉列表数据绑定到值 1-5。默认显示分数 0。用户保存分数 3。EvalAnswer 中的 FK 指向 Score 表中的该行。所以分数 1 到 5 在我的分数列中可见,对吗?我在新的代码列中保护什么?谢谢
  • 加密值无济于事。保存一条新记录并找到匹配的记录以了解值的含义(无需解密)。要真正保护它,您必须将加密(和加盐)结果保存在 EvalAnswer 表中。
猜你喜欢
  • 1970-01-01
  • 2017-03-10
  • 1970-01-01
  • 1970-01-01
  • 2012-05-20
  • 1970-01-01
  • 2020-07-12
  • 1970-01-01
  • 2020-05-20
相关资源
最近更新 更多