тип дата в первичном ключе
От: paucity  
Дата: 13.10.09 08:27
Оценка:
Господа!

Чем плохо и насколько плохо наличие в составном первичном ключе поля типа дата-время?

СУБД: Oracle, MS SQL 2000/2005/2008

Спасибо!
Re: тип дата в первичном ключе
От: _d_m_  
Дата: 13.10.09 08:48
Оценка: :)
Здравствуйте, paucity, Вы писали:

P>Господа!


P>Чем плохо и насколько плохо наличие в составном первичном ключе поля типа дата-время?


- Доктор, у меня в чипсах попался пакетитк с надписью "не съедать". Я умру?
— Hу, все умрут когда-нибудь.
— ВСЕ??? О боже... ЧТО Я HАДЕЛАЛ!!!!!???!!

Re: тип дата в первичном ключе
От: BlackEric http://black-eric.lj.ru
Дата: 13.10.09 10:21
Оценка:
Здравствуйте, paucity, Вы писали:

P>Господа!


P>Чем плохо и насколько плохо наличие в составном первичном ключе поля типа дата-время?


P>СУБД: Oracle, MS SQL 2000/2005/2008


P>Спасибо!


В MS SQL 2000/2005/2008 ничего плохого не замечено
https://github.com/BlackEric001
Re[2]: тип дата в первичном ключе
От: BlackEric http://black-eric.lj.ru
Дата: 13.10.09 10:27
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>Здравствуйте, paucity, Вы писали:


P>>Господа!


P>>Чем плохо и насколько плохо наличие в составном первичном ключе поля типа дата-время?


P>>СУБД: Oracle, MS SQL 2000/2005/2008


P>>Спасибо!


BE>В MS SQL 2000/2005/2008 ничего плохого не замечено.

Единственное это то, что дата не всегда может быть уникальной, как и время.
https://github.com/BlackEric001
Re: тип дата в первичном ключе
От: Ziaw Россия  
Дата: 13.10.09 10:47
Оценка:
Здравствуйте, paucity, Вы писали:

P>Чем плохо и насколько плохо наличие в составном первичном ключе поля типа дата-время?


Тут есть подводный камень.
Многие платформы дату хранят в виде double, совсем не факт, что при чтении первичного ключа не возникнет некое округление. В результате чего, имея на руках ключ прочитанный из базы можно получить 0 после выполнения такого запроса:

select count(*) from tbl t where t.time = @time


Т.е. мы теряем саму суть первичного ключа, т.к. не можем идентифицировать запись.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Re[2]: тип дата в первичном ключе
От: Sheridan Россия  
Дата: 13.10.09 11:19
Оценка:
Приветствую, Ziaw, вы писали:

Z>
Z> select count(*) from tbl t where t.time = @time
Z>


Z> Т.е. мы теряем саму суть первичного ключа, т.к. не можем идентифицировать запись.


Если там заранее не прописаны записи. Ну чтототипа расписания...
avalon 1.0rc2 rev 300, zlib 1.2.3
build date: 19.08.2009 14:13:36 MSD +04:00
Qt 4.5.2
Matrix has you...
Re: тип дата в первичном ключе
От: paucity  
Дата: 14.10.09 06:44
Оценка:
Спасибо!

Собственно, почему возник вопрос:
Насколько я знаю, тип даты внутренне представлен как количество миллисекунд, прошедших от какой-то нулевой даты. Таким образом, на каждую календарную дату приходится порядка 86400000 значений миллисекунд.

Собственно это — 86400000 значений на один календарный день — и вызывает сомнения в целесообразности индексации по полю типа дата, особенно если критерии выборки в основном основаны только на дате, а не на дате-времени:
WHERE field_date = 14/10/2009

А не
WHERE field_date = 14/10/2009 10:45:15:16


Или у меня косяк в рассуждениях?

Практическое приложение первоначального вопроса:
Чтобы отслеживать последовательность состояний чего-либо, какую структуру предпочтительнее использовать с точки зрения производительности и прочих подводных граблей?
1)
CREATE TABLE T (
ID_anything int NOT NULL, /*PK*/
Time_Changed date NOT NULL, /*PK, время перехода в новое состояние*/
State_anythinq int NOT NULL /* значение состояния */
)

2)
CREATE TABLE T (
ID_anything int NOT NULL, /*PK*/
Sequence_number int NOT NULL, /*PK, sequence*/
State_anythinq int NOT NULL /*время перехода в новое состояние*/
Time_Changed date NOT NULL  /* значение состояния */
)

Первый или второй вариант?
Re[2]: тип дата в первичном ключе
От: DmitryV Россия  
Дата: 14.10.09 08:05
Оценка: 4 (1)
Здравствуйте, paucity, Вы писали:

P>Спасибо!


P>Собственно, почему возник вопрос:

P>Насколько я знаю, тип даты внутренне представлен как количество миллисекунд, прошедших от какой-то нулевой даты. Таким образом, на каждую календарную дату приходится порядка 86400000 значений миллисекунд.

P>Собственно это — 86400000 значений на один календарный день — и вызывает сомнения в целесообразности индексации по полю типа дата, особенно если критерии выборки в основном основаны только на дате, а не на дате-времени:

P>
WHERE field_date = 14/10/2009

P>А не
P>
WHERE field_date = 14/10/2009 10:45:15:16


P>Или у меня косяк в рассуждениях?


P>Практическое приложение первоначального вопроса:

P>Чтобы отслеживать последовательность состояний чего-либо, какую структуру предпочтительнее использовать с точки зрения производительности и прочих подводных граблей?
P>1)
P>
P>CREATE TABLE T (
P>ID_anything int NOT NULL, /*PK*/
P>Time_Changed date NOT NULL, /*PK, время перехода в новое состояние*/
P>State_anythinq int NOT NULL /* значение состояния */
P>)
P>

P>2)
P>
P>CREATE TABLE T (
P>ID_anything int NOT NULL, /*PK*/
P>Sequence_number int NOT NULL, /*PK, sequence*/
P>State_anythinq int NOT NULL /*время перехода в новое состояние*/
P>Time_Changed date NOT NULL  /* значение состояния */
P>)
P>

P>Первый или второй вариант?

лучше третий вариант:
CREATE TABLE T (
Sequence_number int NOT NULL, /*PK, sequence*/
ID_anything int NOT NULL, /*FK*/
Time_Changed date NOT NULL, /*IX, время перехода в новое состояние */
State_anythinq int NOT NULL /* значение состояния */
)

индексация по дате нужна в любом случае, если запросы идут по дате.
вопрос в другом — за одну дату могут быть несколько изменений состояния?
С уважением
Re[3]: тип дата в первичном ключе
От: paucity  
Дата: 14.10.09 09:03
Оценка:
Здравствуйте, DmitryV, Вы писали:

DV>лучше третий вариант:

DV>
CREATE TABLE T (
Sequence_number int NOT NULL, /*PK, sequence*/
ID_anything int NOT NULL, /*FK*/
Time_Changed date NOT NULL, /*IX, время перехода в новое состояние */
State_anythinq int NOT NULL /* значение состояния */
)
DV>

DV>индексация по дате нужна в любом случае, если запросы идут по дате.
DV>вопрос в другом — за одну дату могут быть несколько изменений состояния?
Да, может быть несколько изменений
Re[2]: тип дата в первичном ключе
От: Sinclair Россия https://github.com/evilguest/
Дата: 14.10.09 09:38
Оценка: 4 (1)
Здравствуйте, paucity, Вы писали:
P>Насколько я знаю, тип даты внутренне представлен как количество миллисекунд, прошедших от какой-то нулевой даты.
Не совсем. Дата
P> Таким образом, на каждую календарную дату приходится порядка 86400000 значений миллисекунд.
Нет. Из-за того, что дата представлена с плавающей запятой, "плотность" значений на календарную дату сильно зависит от самой даты.
См. accuracy в http://technet.microsoft.com/en-us/library/ms187819.aspx

P>Практическое приложение первоначального вопроса:

P>Чтобы отслеживать последовательность состояний чего-либо, какую структуру предпочтительнее использовать с точки зрения производительности и прочих подводных граблей?
P>1)
P>
P>CREATE TABLE T (
P>ID_anything int NOT NULL, /*PK*/
P>Time_Changed date NOT NULL, /*PK, время перехода в новое состояние*/
P>State_anythinq int NOT NULL /* значение состояния */
P>)
P>

P>2)
P>
P>CREATE TABLE T (
P>ID_anything int NOT NULL, /*PK*/
P>Sequence_number int NOT NULL, /*PK, sequence*/
P>State_anythinq int NOT NULL /*время перехода в новое состояние*/
P>Time_Changed date NOT NULL  /* значение состояния */
P>)
P>

P>Первый или второй вариант?

create table Changes
(
  ID int identity not null primary key, -- последовательность определяется этим полем.
  TargetID int not null foreign key references Target(ID),
  ChangeDate datetime not null,
  NewState int
)
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: тип дата в первичном ключе
От: MasterZiv СССР  
Дата: 14.10.09 18:42
Оценка:
paucity пишет:

> Насколько я знаю, тип даты внутренне представлен как количество

> миллисекунд, прошедших от какой-то нулевой даты. Таким образом, на
> каждую календарную дату приходится порядка 86400000 значений миллисекунд.

По крайней мере в контексте указания в топике нескольких СУБД это утверждение
неверно.

> Или у меня косяк в рассуждениях?


Косяк.
Posted via RSDN NNTP Server 2.1 beta
Re[3]: тип дата в первичном ключе
От: paucity  
Дата: 14.10.09 22:03
Оценка:
Здравствуйте, MasterZiv, Вы писали:

>> Или у меня косяк в рассуждениях?


MZ>Косяк.

Лаконичненько ))
Re: тип дата в первичном ключе
От: wildwind Россия  
Дата: 15.10.09 15:59
Оценка:
Здравствуйте, paucity, Вы писали:

P>Чем плохо и насколько плохо наличие в составном первичном ключе поля типа дата-время?


предлагаю сначала рассмотреть вопрос "Чем плохо и насколько плохо наличие составного первичного ключа"
Re[2]: тип дата в первичном ключе
От: paucity  
Дата: 15.10.09 20:08
Оценка:
Здравствуйте, wildwind, Вы писали:

P>>Чем плохо и насколько плохо наличие в составном первичном ключе поля типа дата-время?


W>предлагаю сначала рассмотреть вопрос "Чем плохо и насколько плохо наличие составного первичного ключа"


Нееее! Не канает!
Уже где-то тут обсуждалось
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.