Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Какой тип данных лучше всего для ключей?  [new]
_GUEST
Guest
Доброго времени суток всем!
Кто-нибудь проводил анализ по поводу того, какой тип данных лучше всего использовать для ключевых полей таблиц? То бишь по каким ключам выборки производятся быстрее и т.д.
15 июл 03, 10:01    [261665]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных лучше всего для ключей?  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
По ключевым полям, как правило, есть индекс. В этом случае абсолютно все-равно какой тип данных используется. Время поиска будет сопоставимо при любом типе данных.

Так что с точки зрения быстродействия - это дело исключительно личных предпочтений программиста.
15 июл 03, 12:14    [261947]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных лучше всего для ключей?  [new]
MaestroEv
Guest
Символьный, потому, что чем меньше поле тем лучше!
Все буквы во всех регистрах и все цифры и всякие там значки...
То есть все что можно увидеть, ввести и напечатать. (на всякий случай)
22 авг 03, 08:11    [310742]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных лучше всего для ключей?  [new]
Hel!Riser
Member

Откуда: Нижний Новгород
Сообщений: 972
и я за символьный! Потому что грабли от VFP30 до шестерки с тем же комбо, в кот результат хочеца получить как ИД, а если он цифрой, то начинаеца беда с возвратом индекса комбы, а не значения ИД'а таблицы... Кстати эта фича до 8 тоже дожила?
22 авг 03, 08:55    [310790]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных лучше всего для ключей?  [new]
Aijik
Member

Откуда:
Сообщений: 147
то начинаеца беда с возвратом индекса комбы, а не значения ИД'а таблицы... Кстати эта фича до 8 тоже дожила?

Не юзаю комбы в гридах, но вроде как Гринчишин утверждал, что баг исправили. Лабай тестовый пример, выкидывай сюда - прогоню...
22 авг 03, 09:42    [310857]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных лучше всего для ключей?  [new]
chagoserg
Member

Откуда: Rostov Don
Сообщений: 157
да всё таже фигня с комбами ...
22 авг 03, 10:07    [310903]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных лучше всего для ключей?  [new]
Равиль
Member

Откуда: Уфа
Сообщений: 127
Если ключ нужен только для уникального ID, думаю символьный лучше, т.к. компактнее и функции типа Sys(2015) возвращают символьные значения.
В тех же случаях, когда нужна сортировка по нему, я выбираю тип по контексту :)
22 авг 03, 10:17    [310929]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных лучше всего для ключей?  [new]
Hel!Riser
Member

Откуда: Нижний Новгород
Сообщений: 972
2 Aijik
эта беда не гридах, а комбах вцелом.. примера нету, потому что фс:е на символьных ключах заточено, а лабать так просто... chagoserg уже крикнул, что осталась ;(
22 авг 03, 10:37    [310977]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных лучше всего для ключей?  [new]
Gustaf
Member

Откуда: г. Минск
Сообщений: 24
Извините, а поподробней о сути проблемы можно (не очень понимаю), какие проблемы вылазят при использоании комбо и отражении в нём таблицы с numeric ID (и индексу по нём)? .. просто не сталкивался с таким раньше.
22 авг 03, 11:43    [311172]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных лучше всего для ключей?  [new]
chagoserg
Member

Откуда: Rostov Don
Сообщений: 157
не знаю, как кто, а я эту проблему вижу так:
таблица - два поля
одно - смысловое значение, второе -идентификатор(нумерик)
у комбо источник - поля этой таблы table.field1,field2
BoundColumn2
BoundTo=.t.
выбираем значение из комбо
тип value комбо - char

2 Gustaf
а можно с Вами по проблемам использования Sybase пообщаться?
22 авг 03, 11:53    [311203]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных лучше всего для ключей?  [new]
Gustaf
Member

Откуда: г. Минск
Сообщений: 24
2 chagoserg
Это ты в профиле увидел? :) Мои познания в SyBase ограничены версией 5.0 (AnyWhere) и почерпнуты лишь из самого мануала, поставляемого с самим продуктом. Простяцкий SQL сервер, клиентская, серверная часть, легко ставится, легко настраивается, в хелпе я нашёл ответы на все интересующие меня вопросы. Чем могу - помогу.

ЗЫ. А тутошний форум по SyBase не помощник?
22 авг 03, 13:09    [311406]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных лучше всего для ключей?  [new]
Aijik
Member

Откуда:
Сообщений: 147
2 Hel!Riser

Хэл! Вот слабал небольшой тест. Все работает правильно. В зареманых строках то же самое для символьных iD. Работает точно так же... Как именно увидеть баг?


CREATE CURSOR TChild (Weather C(15), WiD I)
INSERT INTO TChild (Weather,WiD) VALUES ("Жарко",10)
INSERT INTO TChild (Weather,WiD) VALUES ("Холодно",20)


CREATE CURSOR TParent (Day C(15), WiD I)
INSERT INTO TParent (Day,WiD) VALUES ("Понедельник",20)
INSERT INTO TParent (Day,WiD) VALUES ("Вторник",10)
INSERT INTO TParent (Day,WiD) VALUES ("Среда",20)
INSERT INTO TParent (Day,WiD) VALUES ("Четверг",10)


*!* CREATE CURSOR TChild (Weather C(15), WiD C(2))
*!* INSERT INTO TChild (Weather,WiD) VALUES ("Жарко","10")
*!* INSERT INTO TChild (Weather,WiD) VALUES ("Холодно","20")


*!* CREATE CURSOR TParent (Day C(15), WiD C(2))
*!* INSERT INTO TParent (Day,WiD) VALUES ("Понедельник","20")
*!* INSERT INTO TParent (Day,WiD) VALUES ("Вторник","10")
*!* INSERT INTO TParent (Day,WiD) VALUES ("Среда","20")
*!* INSERT INTO TParent (Day,WiD) VALUES ("Четверг","10")


oForm=CREATEOBJECT("comboform")
oForm.Show(1)


DEFINE CLASS comboform AS form

AutoCenter = .T.

ADD OBJECT combo1 AS combobox WITH ;
BoundColumn = 2, ;
RowSourceType = 6, ;
RowSource = "TChild.Weather, WiD", ;
ControlSource = "TParent.WiD", ;
Height = 24, ;
Left = 24, ;
Style = 2, ;
Top = 40, ;
Width = 100, ;
BoundTo = .T., ;
Name = "Combo1"


ADD OBJECT command1 AS commandbutton WITH ;
Top = 100, ;
Left = 20, ;
Height = 27, ;
Width = 84, ;
Caption = "ComboValue", ;
Name = "Command1"


ADD OBJECT list1 AS listbox WITH ;
RowSourceType = 6, ;
RowSource = "TParent.Day", ;
Height = 197, ;
Left = 168, ;
Top = 32, ;
Width = 169, ;
Name = "List1"



PROCEDURE combo1.InteractiveChange
ACTI SCRE
?VARTYPE(This.Value)
?This.Value
ENDPROC


PROCEDURE command1.Click
ACTIVATE SCREEN
?VARTYPE(ThisForm.Combo1.Value)
?ThisForm.Combo1.Value

ENDPROC


PROCEDURE list1.InteractiveChange
ThisForm.Combo1.Refresh()
ENDPROC



ENDDEFINE
22 авг 03, 13:28    [311444]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных лучше всего для ключей?  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Проблема с Combo возникает если:

1) В качестве источника данных выступают напрямую поля таблицы (RowSourceType = 6)
2) Ключевое поле имеет числовой тип

Соответсвенно, решением проблемы является замена источника данных (я использую массивы) или изменение типа (что проблематично)

===========================================================
Насчет длины ключа.

Как правило, в качестве ключевого поля используются поля типа Integer. Т.е. физически они занимают 4 байта на каждую запись. При этом, опять же как правило, используются только положительные значения, т.е. диапазон значений ключа от 0 до 2 147 483 647.

Много это или мало?

Опять же, как правило, срок жизни программы не превышает 2...3 лет. Данные живут несколько больше, примерно 10...15 лет. Предположим, что данные у нас "вечные" и живут 100 лет.

Это значит, что для того, чтобы достичь предела насыщения типа Integer пользователи должны в течении 100 лет ежедневно без перерыва на праздники и выходные вколачивать в базу данных примерно по 60 тысяч записей.

Согласен, бывают и такие задачи. НО!!! Для подобных задач DBF-таблицы становятся уже неприемлимыми, поскольку они просто физически не могут вместить такое количество записей. Предел DBF-таблиц - это 1 миллиард записей, т.е. примерно половина диапазона типа Integer.

Если вернуться к типу Character, то исходя из предположения, что длина ключа не должна превышать тип Integer, мы должны установить длину C(4). Предположим, что в качестве значения могут использоваться все 254 символа кодовой страницы. Это значит, что предельно возможное количество значений такого ключа составит:

254**4= 4,162,314,256

Т.е. всего в 2 раза больше чем для типа Integer. Если же вспомнить, что ряд символов использовать неудобно по разным причинам, то остается около 100 допустимых символов для использования в качестве ключа. Т.е. возвращаемся примерно к тому же диапазону значений, что и для типа Integer.

Итого, с точки зрения длины ключа тип Character не дает никаких преимуществ при использовании в DBF-таблицах по сравнению с типом Integer.

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

Если же вспомнить, что в MS SQL и в VFP8 существует такое понятие как автоинкрементные поля, которые просто не могут не быть числовыми. То вопрос о типе ключевого поля вообще становится чисто теоретическим. И опять же переходит из области чисто практической в область личных предпочтений программиста.
25 авг 03, 12:33    [313408]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных лучше всего для ключей?  [new]
Aijik
Member

Откуда:
Сообщений: 147
Владимир, почему тогда вышеприведенный тест работает без проблем (VFP7SP1 - VFP8)? И вообще как проявляется баг? ФоксКлуб, к сожалению, не досупен - знаю, что в Ваша статья по этому поводу там есть, но не помню, в чем конкретно там проблема была, а посмотреть ироды (буржуи) не дают :)
25 авг 03, 12:43    [313420]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных лучше всего для ключей?  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Суть бага заключается в том, что выбранное текущее значение НЕ ОТОБРАЖАЕТСЯ. Т.е. значения Value абсолютно правильные, но вот вместо DisplayValue отображается пустая строка.

Как правило, этот баг проявляется при использовании ComboBox внутри Grid. Причем при потере фокуса в текущей ячейке правильное отображение восстанавливается. Проблема именно в той ячейке, где в данный момент находися фокус.
25 авг 03, 13:15    [313482]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных лучше всего для ключей?  [new]
Aijik
Member

Откуда:
Сообщений: 147
Да, действительно, этот баг остался и в VFP8 :(
26 авг 03, 11:16    [314893]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных лучше всего для ключей?  [new]
P.Ol
Member

Откуда: Kaliningrad
Сообщений: 14
Да, действительно, этот баг остался и в VFP8 :(
Я с ним тока на VFP8 и столкнулся :(
26 авг 03, 11:55    [314978]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных лучше всего для ключей?  [new]
Любопытный
Guest
А так нельзя: юзать не .value, а напрямую обращаться к значению поля? кажись, указатель тоже перемещается при играх с комбо?
26 авг 03, 12:50    [315111]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных лучше всего для ключей?  [new]
chagoserg
Member

Откуда: Rostov Don
Сообщений: 157
2 Любопытный
так дело в том, как сказано выше - проявление бага только в отображении комбо в гриде, и не важно что использовать...
причём баг проявляется в случае, если источником комбо является поля или алиас (даже если id конвертирован в char)
если используется массив или select с конвертированием - всё нормально
26 авг 03, 12:59    [315128]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить