2009-03-24 4 views
2

В наборе Starwind Starters Kit Первичные ключи из базы данных отображаются на строки в C#.База данных Первичный ключ C# mapping - String или int

Это хорошая практика? И если да, то почему?

ТНХ, Ливен Cardoen

пс: Извините за может быть неправильный вопрос ...

В Northwind Пускатели Kit некоторые таблицы имеют автоинкрементный первичный ключ с типом данных Int и другие иметь не авто- инкрементный первичный ключ с типом данных nchar (5). Почему это? Ну, по-видимому, некоторые первичные ключи - это просто коды (формат nchar (5)). Так жаль, что вы использовали свое время.

Я думал, что тип данных int был сопоставлен с строкой C#, которая казалась мне очень неправильной (но это не так).

+0

Какой тип SQL являются первичными ключами в базе данных Notwind Starters Kit? – Lucas

+0

Все нормально. Получил 50 быстрых очков ... ;-) –

+0

Спасибо, что выбрали мой ответ как правильный. Я надеюсь, что информация будет полезной. –

ответ

3

Для чистой эффективности использование Int в качестве основного ключа лучше всего благодаря поддержке сравнения Ints на уровне машинного кода. Строки сравниваются с использованием алгоритмов, реализованных на уровне базы данных. Если ваши строки не очень короткие, ключ Integer займет меньше места на странице (страница db).

Обновление: Основываясь на другом ответе на доске, я не уверен, правильно ли я понял ваш вопрос. Вы спрашиваете, лучше ли использовать Integer в качестве ключа по сравнению со строкой (где либо можно выбрать)? Или вы спрашиваете, должен ли ваш тип C# соответствовать типу вашей базы данных? Я предполагаю, что бывший ... и был бы очень удивлен, если бы он был последним, чей ответ, который я думаю, очевиден.

Обновление: Теперь Ливен разъяснил свою просьбу сказать, что он действительно спрашивал, будет ли поле Int или nchar лучше в качестве индекса, поэтому мой первоначальный вопрос по этому вопросу был правильным.

Чтобы добавить к моему ответу, Ливен, почти всегда лучше иметь Int как ваш ПК. Исключением является когда есть естественный ключ, который может быть захвачен как короткая строка символов (например, в системе учета, где записи «Item» являются строками символов). Причины трижды.

Во-первых, целые числа представляются в виде нативного машинного типа (32 или 64-разрядное слово) и управляются с помощью машинных операций, тогда как строки не должны, а должны сравниваться с использованием подхода char-by-char. Так, например, при перемещении индекса PK (обычно некоторого варианта BTree), чтобы найти запись, операция сравнения на каждом узле является одной операцией. Это огромная вещь? Вероятно, нет, если вы не работаете с действительно массивной базой данных или транзакционной нагрузкой. Если у вас есть натуральный символ, тогда, конечно, используйте его! Однако, если ваш «ключ» - это первые пять букв фамилии плюс первый начальный плюс номер, чтобы сделать его уникальным, то, очевидно, вам будет намного лучше с полем Int.

Во-вторых, целые числа просто занимают меньше места, чем почти любой символ ключа (кроме char (1), предполагающий использование Unicode). И это не просто комната на главной странице таблицы, помните, что поля индекса также представлены в индексе. Опять же, это очень важно? Не совсем, если вы еще не работаете с массивной базой данных.

Наконец, наш выбор ключей часто имеет эффекты в других местах. Так, например, если вы используете первичный ключ в одной таблице в качестве внешнего ключа на другом, оба вышеупомянутых эффекта увеличиваются, когда вы вставляете или обновляете записи в таблице, используя внешний ключ.

Сумма: используйте наиболее естественный ключ. Однако, если у вас есть выбор между Int и Char, и оба они по существу произвольны, идите с Int над Char.

+0

Привет, Марк, если вы посмотрите на схему для северного ветра (см. Здесь: http://www.sqledit.com/sr/samples/northwind.html), похоже, что в большинстве таблиц используются символы для ПК. Я бы рассмотрел эту довольно нестандартную практику, и я думаю, что это то, о чем идет речь. Возможно, ошибаюсь. –

+0

Да, это на самом деле мой вопрос ... извините за недоразумение. –

+0

Если вы посмотрите на клиентов в северном ветре, они используют символы для ПК. Было бы лучше иметь int как PK и дополнительный столбец для символов? –

4

Все зависит от типа данных столбца в базе данных.

Хорошей практикой является использование совместимого/соответствующего типа данных. Если база данных использует int, используйте int. Если база данных использует uniqueidentifier, используйте Guid. Если база данных использует nvarchar, используйте строку.

Все остальное вызовет проблемы по линии. Гарантированный.

+0

Вы уверены, что это то, о чем спрашивает Lieven? Задавая вопрос о том, должен ли Varchar быть сопоставлен с строкой, Int to int и т. Д., Кажется настолько невероятно очевидным, что никто на самом деле не спрашивал об этом. Конечно, я мог ошибаться ... –

+0

Ад я не знаю. Конечно, это то, о чем он просит ;-) –

+0

Извините. Не посмотрел на базу данных. Похоже, что иногда в качестве типа первичного ключа используется nchar (5). В этих случаях идентификатор является строкой. –

1

Всегда используйте соответствующий тип данных C# для типа данных Sql. Как отмечали другие плакаты, делать что-либо еще нужно позже.

Просмотрите эту статью: http://msdn.microsoft.com/en-us/library/ms131092.aspx для получения полного списка эквивалентов типа данных Sql Server/C#.

Смежные вопросы