powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / String constants vs int
25 сообщений из 95, страница 1 из 4
String constants vs int
    #39817566
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот есть модель, которая проецируется в базу данных и есть у нее некое поле, пусть будет state
В базе данных поле имеет тип int и в модели на всего возможные значения заведены константы:

Код: plaintext
1.
2.
3.
const STATE_ACCEPTED = 10;
const STATE_REJECTED = 20;
const STATE_UNKNOWN = 30;

Данные хранятся в mongodb, которая не имеет ENUM типов, поэтому решил использовать числовые для более оптимальной работы СУБД. Так я делал всегда и думал, что это правильно. Но недавно в команде появился человек, которого очень смутило то, что константы числовые и анализировать базу данных ему не удобно (он не аналитик, он программист), типа с текстовыми было бы проще.

Лично я считаю, что база данных в первую очередь для приложения, а не человека и должна быть оптимизирована под работу приложения. А если нужно раз в год туда залезти что-то посмотреть, то можно и в коде подсмотреть значения констант.

Ну и отдельный разговор, почему 10-20-30, а не 1-2-3. У меня была какая-то мысль, что при таком подходе можно добавить константу "между" существующих, это касается только лаконичности кода.

Что думаете?
...
Рейтинг: 0 / 0
String constants vs int
    #39817615
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hett,

дело вкуса. С одной стороны оперировать числами не удобно (лучше видеть описание констант). С другой стороны проблема быстродействия. Mongo всё равно - строка или число?
...
Рейтинг: 0 / 0
String constants vs int
    #39817622
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXIHett,

дело вкуса. С одной стороны оперировать числами не удобно (лучше видеть описание констант). С другой стороны проблема быстродействия. Mongo всё равно - строка или число?

Количество данных в любом случае больше. Можно использовать 32-битный интерджер (4 байта), с другой стороны получается 8 символов, даже точно не уверен, сколько это займет памяти. Думаю как минимум байт 12 (4 под длину, + 2 байта на каждый символ?).
Как это будет в индексах выглядеть тоже большой вопрос. Особенно если поле участвует в нескольких составных индексах.
...
Рейтинг: 0 / 0
String constants vs int
    #39817625
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думаю римские цифры были бы нагляднее,
сразу же видно сколько там палок: одна, две, или три.

Хотя бухгалтер во мне, гад, просит сумму прописью.
...
Рейтинг: 0 / 0
String constants vs int
    #39817660
alex55555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hettтипа с текстовыми было бы проще
Дай ему таблицу с кодами и названиями, ну и пусть дальше сам джойнит, раз нравится. Заодно справочник констант сделаешь.
...
Рейтинг: 0 / 0
String constants vs int
    #39817671
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex55555Hettтипа с текстовыми было бы проще
Дай ему таблицу с кодами и названиями, ну и пусть дальше сам джойнит, раз нравится. Заодно справочник констант сделаешь.

Программист жеж, знает где найти константы.
...
Рейтинг: 0 / 0
String constants vs int
    #39817681
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettНу и отдельный разговор, почему 10-20-30, а не 1-2-3. У меня была какая-то мысль, что при таком подходе можно добавить константу "между" существующих, это касается только лаконичности кода.

Что думаете?
Я не знаток Монго. Но обычно с точки зрения баз данных - решительно пофиг какие ключи хранить. Числа
и строки (CHAR/VARCHAR) имеют почти одинаковые накладные расходы на хранение. Числа нужны только
для sequence.

Если интересует эстетика - то я-бы предложил завести краткие натуральние STATE KEYS. Типа

Код: sql
1.
2.
3.
const STATE_ACCEPTED = "A";
const STATE_REJECTED = "R";
const STATE_UNKNOWN = "U";


Это даст возможность писать mongo queries "по памяти". Тоесть не заглядывае в справочник.
Про экономию места не стоит беспокоиться. Ключи на фоне ихнего binary-json будут каплей в море.

Вставлять промежуточные значения между ключами - это старая идея как из Бейсика. Типа ключ с номером 15
будет по рангу стоять между STATE_ACCEPTED и STATE_REJECTED. Но какой в этом смысл? Если в системе эти ранги есть.
Если нет - то пофиг.
...
Рейтинг: 0 / 0
String constants vs int
    #39817717
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поддержу предыдущего оратора. Если нет нужды сравнивать на больше-меньше, то строки удобнее. Оверхед на строку в 8 символов (а это в среднем даже меньше чем размер GUID) по сравнению с целым числом ничтожен, будь это хоть монго, хоть какая-нибудь другая БД. Дотнетовский драйвер для монго позволяет настроить сериализацию enum-ов - cохранять их числом или строкой.
...
Рейтинг: 0 / 0
String constants vs int
    #39817729
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поди еще айпи адреса текстом храните?
...
Рейтинг: 0 / 0
String constants vs int
    #39817737
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hett,

Почему бы нет. Его обязательно в int паковать - без этого никак? Так можно вообще всю запись целиком в один binary упаковать и так хранить - представляешь, какая экономия будет.
...
Рейтинг: 0 / 0
String constants vs int
    #39817742
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatHett,

Почему бы нет. Его обязательно в int паковать - без этого никак? Так можно вообще всю запись целиком в один binary упаковать и так хранить - представляешь, какая экономия будет.

Зачем фантазируете? Давайте тогда объект в джесон завернем и сохраним в varchar? Я могу тоже какую-нибудь чушь сморозить, будем в остроумии соревноваться?

По существу: ip в int и даже в bitint уже не пакуются давно в свете появления ipv6.
А разница в том, сколько памяти будет израсходовано, особенно если это поле присутствует в нескольких индексах. Часто используемые индексы тем более в ОЗУ желательны.

ps^ Я не говорю про поиск в подсетях, тут то даже спорить было бы не о чем. Допустим это нам точно не понадобится.
...
Рейтинг: 0 / 0
String constants vs int
    #39817756
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hett,

А если у меня IP только в целях логирования/аудита хранится - мне его тоже в бинарном виде хранить надо для экономии? Кстати, не знаю где как, но MSSQL уже поддерживает json поля, а поля с XML так вообще уже почти 15 лет как.
...
Рейтинг: 0 / 0
String constants vs int
    #39817761
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatHett,

А если у меня IP только в целях логирования/аудита хранится - мне его тоже в бинарном виде хранить надо для экономии? Кстати, не знаю где как, но MSSQL уже поддерживает json поля, а поля с XML так вообще уже почти 15 лет как.

Это IP - это не фрагмент текста и хранится в отдельном поле, то почему бы не хранить его в бинарном виде?
...
Рейтинг: 0 / 0
String constants vs int
    #39817864
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hett,

А в чем, в общем-то, преимущество хранения в бинарном виде, кроме размера поля?
...
Рейтинг: 0 / 0
String constants vs int
    #39817868
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
90% надо смотреть от юзкейса. Если например мы храним целый инстаграм картинок - то разумно брать BLOB
или внешнее файловое хранение.

Для IP адресов. Ну … если 99% они используются для печати в лог-файле (а там они представлены в принтабельнов виде)
то можно сразу их складывать в строку. Или для поисковых операций по документу. Где в сущности строки даже легче.
Всё как-то гомогенно получается.

Хранить как int в документно-ориентированной БД... ну не знаю. Рискну предположить что будет польза будет варироваться
от "никакой пользы" до "ненужные преобразования для прочтения человеком на экране".
...
Рейтинг: 0 / 0
String constants vs int
    #39817872
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton90% надо смотреть от юзкейса.
+100500
...
Рейтинг: 0 / 0
String constants vs int
    #39818138
alex55555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatА в чем, в общем-то, преимущество хранения в бинарном виде, кроме размера поля?
Размер влияет на потребление памяти, а память влияет на скорость работы. Поэтому пари меньшем размере больше индексов в память поместится, значит в среднем будет больше скорость. Плюс само сравнение узлов в дереве быстрее для Int делать, нежели для строки - опять ускорение. Плюс коррекция данных, то есть либо они парсятся в int, либо нет, своего рода валидация.

Хотя да, можно забить на всё это. Но такую привычку лучше не тренировать.
...
Рейтинг: 0 / 0
String constants vs int
    #39818151
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex55555,

Да эта тема "int vs guid" обжевана повсюду уже мульон раз - в теории guid в четыре раза меньше, но на практике разницы именно из-за размера никакой.
...
Рейтинг: 0 / 0
String constants vs int
    #39818155
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"в четыре раза больше", конечно.
...
Рейтинг: 0 / 0
String constants vs int
    #39818158
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat"в четыре раза больше", конечно.у кого как, некоторые хранят guid-ы в VARCHAR(36) в виде строки '22345200-abe8-4f60-90c8-0d43c5f6c0f6'.
...
Рейтинг: 0 / 0
String constants vs int
    #39818159
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatalex55555,

Да эта тема "int vs guid" обжевана повсюду уже мульон раз - в теории guid в четыре раза меньше, но на практике разницы именно из-за размера никакой.
GUID используется в распределённых и JMS системах где вам нужно гарантировать уникальность ключа
при отсутствии глобального распределённого объекта типа sequence. Поэтому выбор GUID - это не "количественный"
а архитектурный выбор.

На интах вы такое не сможете построить.
...
Рейтинг: 0 / 0
String constants vs int
    #39818194
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftfkthat"в четыре раза больше", конечно.у кого как, некоторые хранят guid-ы в VARCHAR(36) в виде строки '22345200-abe8-4f60-90c8-0d43c5f6c0f6'.

Эти некоторые уже выше отписались. Если IP хранят в виде строки, то GUID/UUID аналогично, подозреваю.
...
Рейтинг: 0 / 0
String constants vs int
    #39818196
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это я к тому, что если уж говорить про эти ваши GUID/UUID, то опять же в том контексте, как его хранить, бинарно (с обертками субд) или строкой. А сравнивать его с Int смысла нет, думаю это очевидно.
...
Рейтинг: 0 / 0
String constants vs int
    #39818243
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettЧто думаете?
В принципе, мнемокоды, конечно, более наглядны, нежели числа - скажем, RUB понятнее, чем 643, да и поле GENDER с возможными значениями 0/1 не сказать чтобы сверхудобно. С другой стороны, числа удобны тем, что в них существует логичный порядок - это иногда удобно применять, например, для статусов, а в булёвых полях - коих обычно больше, чем всех остальных вместе взятых - 0/1 не требуют гадать, записать ли туда 'Y', 'y', 'yes' или 'да', да и расширение числовых вариантов новыми значениями обычно проходит проще (скажем, если в поле GENDER нужно добавить ещё нейтралов и трансгендеров).

В общем, это больше вопрос вкусов - можно так, можно эдак, но нужно выбрать цельную концепцию, использовать её и адекватно документировать, тогда ни у кого не будет проблем. Всего лишь

Код: plsql
1.
2.
3.
4.
5.
6.
7.
SQL> desc dm_lineup

Name         Type       Nullable Default Comments                                                                 
------------ ---------- -------- ------- ------------------------------------------------------------------------ 
OBJ_VER_CODE NUMBER(30)                  # Первичный ключ                                                         
MAP_CODE     NUMBER(30)                  # Карта                                                                  
STATUS       NUMBER(1)           0       Состояние (0 - к выполнению, 1 - выполнена, 2 - не выполнена и не будет) 


и ни у кого не возникает вопросов.

maytonНо обычно с точки зрения баз данных - решительно пофиг какие ключи хранить. Числа
и строки (CHAR/VARCHAR) имеют почти одинаковые накладные расходы на хранение.
Ну это как-то сильно сказано.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SQL> create table ttt$(i integer, v varchar2(100 char));
Table created

SQL> insert into ttt$ values (1234567890, 'АБВГДЕЁЖЗИ');
1 row inserted

SQL> select i, v, length(i), length(v), dump(i), dump(v) from ttt$;

         I V           LENGTH(I)  LENGTH(V) DUMP(I)                   DUMP(V)
---------- ---------- ---------- ---------- ------------------------- --------------------------------------------------
1234567890 АБВГДЕЁЖЗИ         10         10 Typ=2 Len=6: 197,13,35,57 Typ=1 Len=20: 208,144,208,145,208,146,208,147,208,
                                            ,79,91                    148,208,149,208,129,208,150,208,151,208,152
...
Рейтинг: 0 / 0
String constants vs int
    #39818264
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonGUID используется в распределённых и JMS системах где вам нужно гарантировать уникальность ключа
при отсутствии глобального распределённого объекта типа sequence. Поэтому выбор GUID - это не "количественный"
а архитектурный выбор.
Ну могут быть еще другие резоны. Например, его случайность, и возможность сгенерить ключ записи еще на клиенте до вставки в таблицу. При желании, кстати, guid вполне можно и укоротить. В "мс-овском" гуиде 6 битов всегда одни и те же, остальные просто случайные. Теоретически даже возможна коллизия, но практически она нереальна.
...
Рейтинг: 0 / 0
25 сообщений из 95, страница 1 из 4
Форумы / Программирование [игнор отключен] [закрыт для гостей] / String constants vs int
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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