Соединение между разными типами данных

В конкретном сценарии у меня есть таблица поиска с MachineNumber (Varchar) и ее MachineID (Int). В моей таблице транзакций я ссылаюсь на номер машины, используя MachineID таблицы поиска.

Требование: Могу ли я установить тип поля MachineID как Varchar в таблице транзакций, сохраняя его тип как Int в таблице поиска? Причина в том, что для некоторых машин номер машины не хранится в таблице поиска, и мне нужно сохранить фактический номер машины, предоставленный пользователем, в самой таблице транзакций, а поскольку номер машины является буквенно-цифровым, я хочу изменить тип этого ссылочного поля с Int к Варчар.

В двух словах в таблице транзакций поле MachineID должно содержать как MachineID (ссылка из таблицы поиска), так и фактический номер машины (предоставленный пользователем и сохраненный непосредственно здесь).

Вопрос: рекомендуется ли иметь разные типы для этих ссылочных полей или это обычная практика, как это повлияет на запросы с соединением между этими двумя таблицами?

Спасибо, Алинд


person Alind Gupta    schedule 22.09.2011    source источник
comment
Какой диалект SQL (Microsoft, Oracle, mySQL) и версию вы используете.   -  person Sparky    schedule 22.09.2011
comment
Мы используем стандартную версию MS SQL 2005.   -  person Alind Gupta    schedule 23.09.2011


Ответы (1)


Как правило, использование натуральных данных в качестве ключа предпочтительнее, если, конечно, вам гарантировано его присутствие и уникальность во всех случаях.

В вашем случае, если вы можете использовать фактический идентификатор машины (varchar), сделайте это и сделайте его ключом для поиска и т. д.

Добавлю, что когда-то я работал в компании, у которой терминалы EFTPOS взаимодействовали с нашим сервером. Мы решили использовать удобный уникальный идентификатор терминала EFTPOS, но у нас возникла проблема, когда они сломались и были заменены ремонтником из банка. У нового терминала был другой идентификатор, но использовать можно было «тот же самый» терминал. Наши проблемы усугубились, когда терминал был отремонтирован и снова введен в эксплуатацию в другом месте клиента - с тем же исходным идентификатором терминала! Сначала это доставляло нам массу хлопот. В итоге мы использовали искусственный идентификатор и использовали текущий идентификатор физического терминала в качестве атрибута.

person Bohemian♦    schedule 22.09.2011
comment
Спасибо за ваше предложение, но моя дилемма заключается в том, что между разными группами компьютеров могут быть одинаковые номера машин, поэтому использование номера машины в качестве ключа не вариант, вторая проблема заключается в том, что есть вероятность, что номер машины будет отредактирован позже, это причины для использования Идентификатор машины. Опять же, мой вопрос: будет ли целесообразно иметь поля разных типов данных (Int и Varchar) для связи полей MachineID между двумя таблицами? - person Alind Gupta; 23.09.2011
comment
В этом случае используйте int в качестве первичного ключа вашей машинной таблицы и сохраните текстовый машинный номер как атрибут (обычный столбец) машинной таблицы. Пусть все остальные таблицы используют ссылку внешнего ключа int на таблицу вашего компьютера. - person Bohemian♦; 23.09.2011