Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Тип данных для поля ID  [new]
zenik
Member

Откуда:
Сообщений: 100
Есть таблица товаров - Article. В ней есть поле - ID (первичный ключ). Сейчас оно int. Но в принципе, как int оно нигде не используется, на клиента отдается через CAST(ID AS varchar(10)).

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

SELECT * FROM Article WHERE ID = '1234567890'

С клиента данные могу тоже строкой передавать. Поле участвует только в подобных выборках, сравнение только "=" и никаких "<>","<",">","like"

Есть ли в таком случае разница по скорости отбора между int и varchar?
3 сен 09, 22:18    [7615588]     Ответить | Цитировать Сообщить модератору
 Re: Тип данных для поля ID  [new]
iljy
Member

Откуда:
Сообщений: 8711
zenik,

разница по скорости отбора конечно есть (4 байта и 10 байт), только на "только таких" выборках вы ее врядли заметите. Это может стать заметно на сотнях миллионов записей, на выборках с соединениями и т.п. Так что вопрос не в этом, а в том, каким это поле должно быть. Если по смыслу оно число - так пусть будет число. Тип полей вообще есть смысл выбирать по типам значений, которые в них предпологается хранить. Ну и для целого помимо всего прочего можно задавать автогенерацию identity.
3 сен 09, 22:27    [7615604]     Ответить | Цитировать Сообщить модератору
 Re: Тип данных для поля ID  [new]
zenik
Member

Откуда:
Сообщений: 100
identy там не нужен, ID передается с клиента (генерится вообще в другой базе, сюда попадает по необходимости).
Вот с типом значения я пытаюсь определится. Хранятся там только цифры. Количество записей 90 000. С клиента передается так:
ALTER PROCEDURE [dbo].[UpdateArticle] (
	@ArticleID int, @Name varchar(100), @Article varchar(20),
	@ParentID int, @Level tinyint, @isFolder bit, @isDel bit )

AS
BEGIN
	SET NOCOUNT ON

	IF EXISTS (SELECT * FROM Article (NOLOCK) WHERE ID = @ArticleID)
		UPDATE Article SET Name=@Name, Article=@Article, ParentID=@ParentID, Level=@Level, isFolder=@isFolder, isDel=@isDel WHERE ID = @ArticleID
	ELSE
		INSERT Article VALUES (@ArticleID,@Name,@Article,@ParentID,@Level,@isFolder,@isDel)
...

Уходят на клиента через CAST в varchar

Хоть ID и содержит только числа, но нумерация идет примерно так:
100001
100002
100003
...
190000
...
999999 - предел

Количество сравнений, условно говоря, схоже с количеством чем CAST(ID vachar). Вот я и думаю, где я больше потеряю на int или varchar...
3 сен 09, 22:45    [7615637]     Ответить | Цитировать Сообщить модератору
 Re: Тип данных для поля ID  [new]
iljy
Member

Откуда:
Сообщений: 8711
zenik,

вы не о том думаете. На 90000 записей можете хоть decimal использовать - не будет у вас разницы никакой. Решите что удобнее. Например - возможна в будещем ситуация, когда ID идет с модификаторами типа "10013-1" или "25678а"?
3 сен 09, 22:49    [7615641]     Ответить | Цитировать Сообщить модератору
 Re: Тип данных для поля ID  [new]
zenik
Member

Откуда:
Сообщений: 100
Мне удобнее varchar, потому как на клиента данные уходят в таком виде:
SELECT id+';'+name+';'... FROM Article
И каждый раз забываешь добавить CAST и сервер начинает ругаться :) Article - это одна из подобных таблиц

з.ы. Нескромный вопрос: примерно на каких объемах разница станет существенной?
3 сен 09, 22:58    [7615663]     Ответить | Цитировать Сообщить модератору
 Re: Тип данных для поля ID  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
zenik
Но в принципе, как int оно нигде не используется, на клиента отдается через CAST(ID AS varchar(10)).
Это с каких пор при выборе первичного ключа начали ориентироваться на клиента? Неужели так трудно передавать как число и приводить к строковому типу там же, на клиенте, если уж так прижало отображать PK?
3 сен 09, 22:58    [7615664]     Ответить | Цитировать Сообщить модератору
 Re: Тип данных для поля ID  [new]
iljy
Member

Откуда:
Сообщений: 8711
Кстати +1. Вы уверены что это у вас именно первичный ключ? Использование естесственных первичных ключей - отдельная песня.
3 сен 09, 23:05    [7615682]     Ответить | Цитировать Сообщить модератору
 Re: Тип данных для поля ID  [new]
zenik
Member

Откуда:
Сообщений: 100
Senya_L, постом выше я написал как данные уходят на клиента...
В таком виде сервер выдает ошибку приобразования типов.
3 сен 09, 23:06    [7615683]     Ответить | Цитировать Сообщить модератору
 Re: Тип данных для поля ID  [new]
zenik
Member

Откуда:
Сообщений: 100
Ну а чего же нет... Вот:
CREATE TABLE [dbo].[Article](
	[id] [int] NOT NULL,
	[Name] [varchar](100) COLLATE Cyrillic_General_CI_AS NULL,
	[Article] [varchar](20) COLLATE Cyrillic_General_CI_AS NULL,
	[ParentID] [int] NULL,
	[Level] [tinyint] NOT NULL,
	[isFolder] [bit] NOT NULL,
	[isDel] [bit] NOT NULL,
 CONSTRAINT [PK_Article] PRIMARY KEY CLUSTERED 
(
	[id] ASC
) ON [PRIMARY]
) ON [PRIMARY]
3 сен 09, 23:08    [7615687]     Ответить | Цитировать Сообщить модератору
 Re: Тип данных для поля ID  [new]
iljy
Member

Откуда:
Сообщений: 8711
zenik,

в каком - таком?? это же ваш кусок!
CAST(ID AS varchar(10))
вы уж определитесь тогда, что где в каком виде хранится и куда как уходит
3 сен 09, 23:10    [7615693]     Ответить | Цитировать Сообщить модератору
 Re: Тип данных для поля ID  [new]
iljy
Member

Откуда:
Сообщений: 8711
zenik,

Вы уверены что это у вас именно первичный ключ?

не в смысле, что так есть, а в смысле что так надо? Что будет например если это значение понадобится изменить?
3 сен 09, 23:12    [7615695]     Ответить | Цитировать Сообщить модератору
 Re: Тип данных для поля ID  [new]
zenik
Member

Откуда:
Сообщений: 100
Да я то определился.

На клиенте мне нужно получить строку в чистом виде (там не делается преобразование данных, за ненадобностью). Строка должна быть такой: 100001;Название;....
Следовательно и запрос:
SELECT CAST(id AS varchar(10)+';'+name+';'... FROM Article
Потому как:
SELECT id+';'+name+';'... FROM Article
Говорит ошибку:
Syntax error converting the varchar value ';' to a column of data type int.


Изменять его не надо. Данные в таблицу попадают через UpdateArticle (приводил выше). Сам по себе ID (как поле) больше ни с чем не связан.
3 сен 09, 23:19    [7615709]     Ответить | Цитировать Сообщить модератору
 Re: Тип данных для поля ID  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21519
zenik

SELECT CAST(id AS varchar(10)+';'+name+';'... FROM Article


Скобка потеряна...


Так не мучайтесь с cast-ом каждый раз, сделайте представление с уже преобразованным полем (а может уже и склеенным через ";") и делайте остальные выборки из этого представления.
4 сен 09, 01:37    [7615870]     Ответить | Цитировать Сообщить модератору
 Re: Тип данных для поля ID  [new]
eJack
Member

Откуда: Сибирь => Не резиновая
Сообщений: 825
zenik,

Сделайте копию базы и измените тип первичного ключа, да прогоните тестовые запросы там и там.
посмотрите на результат в обоих случаях увидите разницу, да и учтите прирост данных в год. Можно сгенерить данных и посмотреть что будет скажем через три года и через пять лет. И тогда поймете надо переходить на строки или нет.
4 сен 09, 07:10    [7615979]     Ответить | Цитировать Сообщить модератору
 Re: Тип данных для поля ID  [new]
Denis Reznik
Member

Откуда: Киев
Сообщений: 156
zenik,

как вариант, для своей выборки можете добавить в таблицу вычислимой столбец, а id оставить интовым. Что-то типа:

[client_id] AS CAST(id AS varchar(10)) + ';' + name + ';'...
4 сен 09, 11:13    [7616878]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить