powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / определение наличия атрибута
16 сообщений из 16, страница 1 из 1
определение наличия атрибута
    #32028330
квазя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
народ!

есть сущность, у которой может быть, а может и не быть некая связанная
с ней сущность.
как грамотнее поступать: хранить в таблице два поля типа hasChild bit, ChildID int
или обходиться одним полем ChildID int, дозволив ему быть NULL.
Второй вариант бережет место, но кажется каким-то косвенным способом
определения существования потомка и потому кривым. Я прав?
...
Рейтинг: 0 / 0
определение наличия атрибута
    #32028334
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что, у вас child может быть только один? Судя по полю ChildID.
...
Рейтинг: 0 / 0
определение наличия атрибута
    #32028336
квазя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да, один. только один. либо нет оного.
...
Рейтинг: 0 / 0
определение наличия атрибута
    #32028346
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если оба поля по первому варианту not Null, а по второму одно из этих полей Null, а второе Not Null, то с точки зрения занимаемого записью места они совершенно равноценны. Дело в том, что под каждое поле, которое может быть Null, SQL-сервер отводит "незримое" поле - аналог bit. При установке этого бита значение поля игнорируется и считается равным Null. При сброшенном бите из "настоящего" поля считывается "настоящее" значение, которое уже считается не равным Null.
Есть еще один нюанс. Все поля типа bit и все "незримые" битовые флаги для полей, которые могут быть Null упаковываются в байты. Создав поле Bit, либо установив на любом поле свойство Allow Nulls, ты увеличишь размер записи не на один бит, а на один байт. Добавив еще одно такое поле, ты не увеличишь размер записи (потому что в этом байте еще будут резервные биты). Добавляя битовые поля (либо делая существующие поля Allow Nulls), ты увеличишь размер записи на следующий байт только тогда, когда количество битов пересечет границу байта. Надеюсь, не очень путано я тут наплел.
И еще. Мерять размеры записей на биты IMHO большого смысла нет. Не того масштаба продукт (если только у тебя не длинные частоколы этих битовых полей).
...
Рейтинг: 0 / 0
определение наличия атрибута
    #32028351
квазя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2Garya: невнятно.

первый случай:
create table T (id int not null, hasChild bit not null, ChildID int not null)
для выяснения, есть ли у записи с зананным id потомок проверяем:
if exists(select 1 from T where hasChild= 1 and id=@id)
если есть, то вытягиваем его ChildID

второй случай:
create table T (id int not null, ChildID int null)
проверка тут типа
if exists(select 1 from T where ChildID is not null and id=@id)
...

Вопрос: как надо?
...
Рейтинг: 0 / 0
определение наличия атрибута
    #32028405
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос: как надо?

IMHO
Если вы про экономию места, то каждая запись первой таблицы будет занимать на 1 байт больше.

Если вы про "косвенный а значит кривой способ определения потомка" то он мне таковым не кажется, поскольку в троичной логике NULL является равноправным значением

Если вы про написание интуитивно понятных запросов, то конечно
select 1 from T where hasChild = 1 and id=@id более понятен стороннему человеку, разбирающему ваш код чем
select 1 from T where ChildID is not null and id=@id, хотя лично для меня, исходя опять же из той же троичной логики, не состовит большой проблемы разобраться, что выбирается в данном запросе.
...
Рейтинг: 0 / 0
определение наличия атрибута
    #32028415
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В первом примере:
id int not null занимает 4 байта
hasChild bit not null занимает 1 бит
ChildID int not null занимает 4 байта
____________________________________________________
Итого 8 байт + 1 байт под хранение 1 бита = 9 байт

Во втором примере
id int not null занимает 4 байта
ChildID int null занимает 4 байта + 1 бит под Null-значения
_____________________________________________________
Итого 8 байт + 1 байт под хранение 1 бита = 9 байт

IMHO, разницы никакой. Если речь идет о размере записи.
...
Рейтинг: 0 / 0
определение наличия атрибута
    #32028420
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Garya
Судя по фразе
"If there are fixed-length columns in the table, a portion of the row, known as the null bitmap, is reserved to manage column nullability"
место под null bitmap будет выделяться в обеих таблицах. Или не так ?
...
Рейтинг: 0 / 0
определение наличия атрибута
    #32028456
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Garya
Во втором примере
Если ChildID - не null, то Итого 8 байт + 1 байт под хранение 1 бита = 9 байт
Если ChildID - null, то Итого 4 байт + 1 байт под хранение 1 бита = 5 байт
...
Рейтинг: 0 / 0
определение наличия атрибута
    #32028458
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 alexeyvg. Нет, не 5 байт, а 9. Потому что 4 байта даже соз значением Null все равно место занимают. Просто значение, которое в них лежит SQL-сервер игнорирует.

2 Glory. Я понял эту фразу так, что биты резервируются только под те поля, которые могут быть Null. Возможно, я ошибаюсь. Но аналогичную интерпретацию я видел в книжке (в какой точно, боюсь, с ходу не вспомню - нужно рыться искать). В той же книжке было написано, что битовые поля, определенные пользователем и "системные" битовые поля под значения Null для всех nullable полей упаковываются в единое мессиво единообразно. То есть, если имеется, к примеру, пара полей Null и тройка полей Bit not Null, они займут пять бит в одном и том же байте. Повторяю, на 100% не берусь сие утверждать - нужно сначала откопать первоисточник.
Для заданных квазей двух примеров как ни крути, в любом случае выходит 9 байтов. Под вопросом может быть только, сколько битов 9-го байта задействовано - 3 или 1.
...
Рейтинг: 0 / 0
определение наличия атрибута
    #32028475
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Garya
Покопался в BOL
Из явных описаний выходит, что

data type fixed-length variable-length
char X -
varchar - X
nchar X -
nvarchar - -
binary X -
varbinary - X



Т.е. логически вроде бы получается fixed-length поле - это поле, которое в каждой записи будет занимать всегда постоянное количество байтов. Но тогда опять же вроде бы получается что поле типа int, ввиду того, что оно занимает 4 байта в любой записи (???), является fixed-length полем.

Если же просто переводить фразу
"If there are fixed-length columns in the table, a portion of the row, known as the null bitmap, is reserved to manage column nullability"
то у меня лично получается(литературно)
"Если в таблице существуют столбцы с фиксированной длиной(!!!), то для управления состоянием NULL столбца, в структуре записи выделяется часть, иначе именуемая NULL-маска"

Что-то как-то не сходится у меня пока - пойду читать MSDN
...
Рейтинг: 0 / 0
определение наличия атрибута
    #32028573
Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня тут небольшой вопрос по ходу дела ...
а если Child'a может не быть, то как вы собираетесь делать поле ChildID int not null?
...
Рейтинг: 0 / 0
определение наличия атрибута
    #32028575
Фотография jimmers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую

Г-ну Andrey: вероятно, автор сообщения ошибся, указав

\ncreate table T (id int not null, hasChild bit not null, ChildID int not null)


Либо хотел хранить фиктивное значение вроде 0 или -1 в случае отсутствия
потомка. Хотя, если есть флаг hasChild, то какое имеет значение содержимое
поля ChildID - его можно игнорировать при отсутствии потомка.

Удачи
...
Рейтинг: 0 / 0
определение наличия атрибута
    #32028646
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если кому интересно,
то в книге Kalen Delaney "Inside Microsoft SQL Server 2000" - Part III Using Microsoft SQL Server - Chapter 6 Tables - Internal Storage - The Structure of Data Rows

сказано в первом байте каждой записи (этот байт имеет имя Status Bits A) "Bit 4 Indicates that a NULL bitmap exists; in SQL Server 2000, a NULL bitmap is always present, even if no NULLs are allowed in any column "
Размер NULL bitmap в SQL Server 2000 будет - Ceiling(Number of columns / 8 )

Таким образом размер записи предложенных таблиц будет разным в разных версиях SQL и для SQL2000 он будет 9 и 8 байт соответсвенно.


ЗЫ
Еще раз спасибо jimmers за книгу
...
Рейтинг: 0 / 0
определение наличия атрибута
    #32028755
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть у меня дурная привычка запоминать только то, что может поднадобиться (голова - это сундук, в который нужно складывать только нужные вещи). Где я вычитал про Null bitmap, так и не вспомнил. Пошерстил по Мамаеву, понял, что не там. Значит, в какой-то статье (есть же такая дурная привычка учитываться статьями в неограниченном количестве). Короче, ссылку на первоисточник привести не смогу.
По приведенной Glory (большое ему спасибо) информации получается некоторое уточнение по той части, в которой у меня были сомнения. А именно:
...in SQL Server 2000, a NULL bitmap is always present, even if no NULLs are allowed in any column
Мой перевод:
...в SQL Server 2000 Null-маска присутствует всегда, даже если нет ни одной колонки, позволяющей вводить Null-значения.

>Таким образом размер записи предложенных таблиц ... для SQL2000 ... будет 9 и 8 байт соответсвенно.
Glory, объясни пожалуйста, как ты получил 8 байт. В каком конкретно байте размещается Null bitmap?
По приведенной тобой информации следует, что в первом случае под Null bitmap отводится 3 бита, во втором случае - 2. Итого в 9-й байт упаковывается Null bitmap (3 бита под 3 поля) + поле HasChild = 4 бита. Во втором случае в 9-й байт упаковываются 2 бита (под 2 поля) Null bitmap. Но у меня получается для обеих случаев размер записи = 9 байт. Если поставить под вопрос упаковку полей типа bit с Null bitmap в единую совокупность байтов (поскольку я не смог нарыть первоисточник), то получается, что в первом случае 10 байтов (поле HasChild - в одном байте, Null bitmap - в другом), по второму ничего не меняется - 9 байтов. Но 9 и 8 у меня не получается никак...
...
Рейтинг: 0 / 0
определение наличия атрибута
    #32028781
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В той же книге(если кому надо, она все еще лежит здесь http://www.hot.ee/gloryee)
сказано, что NULL-bitmap
1. размещается после полей с фиксированной длиной (до полей с переменной длиной)
2. имеет постоянный размер

т.о. NULL-bitmap не "упакован" вместе с полями данных типа bit. Т.е. он не влияет на размер данных конкретной записи.



id int not null занимает 4 байта
hasChild bit not null занимает 1 бит
ChildID int not null занимает 4 байта
____________________________________________________
Итого 8 байт + 1 байт под хранение 1 бита = 9 байт
NULL-bitmap = 1 байт


Во втором примере
id int not null занимает 4 байта
ChildID int null занимает 4 байта
_____________________________________________________
Итого 8 байт
NULL-bitmap = 1 байт


ЗЫ
Проверил практически.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / определение наличия атрибута
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]