Используйте varbinary в качестве внешнего ключа - PullRequest
2 голосов
/ 20 марта 2012

Можно ли использовать тип данных varbinary для внешних ключей? Зачем? У меня есть таблица EvalAnswer с FK для таблицы Score. Оценка чувствительна и должна быть зашифрована. Шифрование / дешифрование происходит в проекте asp.net (4.0), а не в sql server (2008), поэтому тип данных должен быть varbinary.

РЕДАКТИРОВАТЬ: больше информации

Конечно. У меня есть эти столбцы: Id, Score, ScoreText, Description, Index Идентификатор является инкрементным счетчиком. (ПК) Оценка - это оценка в виде числа (например, 1). ScoreText - это счет в виде буквы (Счет 1 равен букве A). Описание - это комментарий к каждой оценке.

Причина, по которой у меня это так, в том, что есть особые ситуации, например, один из вопросов имеет только оценку 1-4, а остальные 1-5.

Таким образом, каждый вопрос имеет оценку 1, но описание отличается от оценки других вопросов 1. Так что, если у меня есть 5 вопросов, это дает 5 * 5 строк в таблице Score. (Все с разным описанием)

Когда я загружаю страницу, я получаю правильную оценку (с описанием) для каждого выпадающего списка. Обычно 1-5. Но когда пользователь сохранил оценку, мне нужно знать ранее сохраненную оценку для каждого вопроса при загрузке страницы. Поэтому у меня есть связь между EvalAnswer и оценкой.

Есть вопросы относительно таблицы результатов, которая НЕ является чувствительной. Но некоторые есть. И для них мне нужно скрыть связь между EvalAnswer и Score.

Что может быть плохим дизайном, так это тот факт, что я использую ту же таблицу (таблицу оценок), что и один, чтобы показать доступные оценки для каждого вопроса. а также как тот, который содержит то, что выбрал пользователь. (это ФК от EvalAnswer, чтобы забить)

Пожалуйста, совет .......

1 Ответ

0 голосов
/ 20 марта 2012

Я предлагаю добавить столбец ID int в таблицу Score и ссылаться на это поле из таблицы 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 байт на ширину индекса, которое может быть проще при сохранении зашифрованного большого двоичного объекта.

...