|
String constants vs int
|
|||
---|---|---|---|
#18+
Вот есть модель, которая проецируется в базу данных и есть у нее некое поле, пусть будет state В базе данных поле имеет тип int и в модели на всего возможные значения заведены константы: Код: plaintext 1. 2. 3.
Данные хранятся в mongodb, которая не имеет ENUM типов, поэтому решил использовать числовые для более оптимальной работы СУБД. Так я делал всегда и думал, что это правильно. Но недавно в команде появился человек, которого очень смутило то, что константы числовые и анализировать базу данных ему не удобно (он не аналитик, он программист), типа с текстовыми было бы проще. Лично я считаю, что база данных в первую очередь для приложения, а не человека и должна быть оптимизирована под работу приложения. А если нужно раз в год туда залезти что-то посмотреть, то можно и в коде подсмотреть значения констант. Ну и отдельный разговор, почему 10-20-30, а не 1-2-3. У меня была какая-то мысль, что при таком подходе можно добавить константу "между" существующих, это касается только лаконичности кода. Что думаете? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2019, 10:46 |
|
String constants vs int
|
|||
---|---|---|---|
#18+
Hett, дело вкуса. С одной стороны оперировать числами не удобно (лучше видеть описание констант). С другой стороны проблема быстродействия. Mongo всё равно - строка или число? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2019, 11:19 |
|
String constants vs int
|
|||
---|---|---|---|
#18+
KreatorXXIHett, дело вкуса. С одной стороны оперировать числами не удобно (лучше видеть описание констант). С другой стороны проблема быстродействия. Mongo всё равно - строка или число? Количество данных в любом случае больше. Можно использовать 32-битный интерджер (4 байта), с другой стороны получается 8 символов, даже точно не уверен, сколько это займет памяти. Думаю как минимум байт 12 (4 под длину, + 2 байта на каждый символ?). Как это будет в индексах выглядеть тоже большой вопрос. Особенно если поле участвует в нескольких составных индексах. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2019, 11:25 |
|
String constants vs int
|
|||
---|---|---|---|
#18+
Думаю римские цифры были бы нагляднее, сразу же видно сколько там палок: одна, две, или три. Хотя бухгалтер во мне, гад, просит сумму прописью. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2019, 11:26 |
|
String constants vs int
|
|||
---|---|---|---|
#18+
Hettтипа с текстовыми было бы проще Дай ему таблицу с кодами и названиями, ну и пусть дальше сам джойнит, раз нравится. Заодно справочник констант сделаешь. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2019, 11:56 |
|
String constants vs int
|
|||
---|---|---|---|
#18+
alex55555Hettтипа с текстовыми было бы проще Дай ему таблицу с кодами и названиями, ну и пусть дальше сам джойнит, раз нравится. Заодно справочник констант сделаешь. Программист жеж, знает где найти константы. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2019, 12:11 |
|
String constants vs int
|
|||
---|---|---|---|
#18+
HettНу и отдельный разговор, почему 10-20-30, а не 1-2-3. У меня была какая-то мысль, что при таком подходе можно добавить константу "между" существующих, это касается только лаконичности кода. Что думаете? Я не знаток Монго. Но обычно с точки зрения баз данных - решительно пофиг какие ключи хранить. Числа и строки (CHAR/VARCHAR) имеют почти одинаковые накладные расходы на хранение. Числа нужны только для sequence. Если интересует эстетика - то я-бы предложил завести краткие натуральние STATE KEYS. Типа Код: sql 1. 2. 3.
Это даст возможность писать mongo queries "по памяти". Тоесть не заглядывае в справочник. Про экономию места не стоит беспокоиться. Ключи на фоне ихнего binary-json будут каплей в море. Вставлять промежуточные значения между ключами - это старая идея как из Бейсика. Типа ключ с номером 15 будет по рангу стоять между STATE_ACCEPTED и STATE_REJECTED. Но какой в этом смысл? Если в системе эти ранги есть. Если нет - то пофиг. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2019, 12:20 |
|
String constants vs int
|
|||
---|---|---|---|
#18+
Поддержу предыдущего оратора. Если нет нужды сравнивать на больше-меньше, то строки удобнее. Оверхед на строку в 8 символов (а это в среднем даже меньше чем размер GUID) по сравнению с целым числом ничтожен, будь это хоть монго, хоть какая-нибудь другая БД. Дотнетовский драйвер для монго позволяет настроить сериализацию enum-ов - cохранять их числом или строкой. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2019, 12:52 |
|
String constants vs int
|
|||
---|---|---|---|
#18+
Поди еще айпи адреса текстом храните? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2019, 13:06 |
|
String constants vs int
|
|||
---|---|---|---|
#18+
Hett, Почему бы нет. Его обязательно в int паковать - без этого никак? Так можно вообще всю запись целиком в один binary упаковать и так хранить - представляешь, какая экономия будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2019, 13:17 |
|
String constants vs int
|
|||
---|---|---|---|
#18+
fkthatHett, Почему бы нет. Его обязательно в int паковать - без этого никак? Так можно вообще всю запись целиком в один binary упаковать и так хранить - представляешь, какая экономия будет. Зачем фантазируете? Давайте тогда объект в джесон завернем и сохраним в varchar? Я могу тоже какую-нибудь чушь сморозить, будем в остроумии соревноваться? По существу: ip в int и даже в bitint уже не пакуются давно в свете появления ipv6. А разница в том, сколько памяти будет израсходовано, особенно если это поле присутствует в нескольких индексах. Часто используемые индексы тем более в ОЗУ желательны. ps^ Я не говорю про поиск в подсетях, тут то даже спорить было бы не о чем. Допустим это нам точно не понадобится. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2019, 13:23 |
|
String constants vs int
|
|||
---|---|---|---|
#18+
Hett, А если у меня IP только в целях логирования/аудита хранится - мне его тоже в бинарном виде хранить надо для экономии? Кстати, не знаю где как, но MSSQL уже поддерживает json поля, а поля с XML так вообще уже почти 15 лет как. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2019, 13:44 |
|
String constants vs int
|
|||
---|---|---|---|
#18+
fkthatHett, А если у меня IP только в целях логирования/аудита хранится - мне его тоже в бинарном виде хранить надо для экономии? Кстати, не знаю где как, но MSSQL уже поддерживает json поля, а поля с XML так вообще уже почти 15 лет как. Это IP - это не фрагмент текста и хранится в отдельном поле, то почему бы не хранить его в бинарном виде? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2019, 13:52 |
|
String constants vs int
|
|||
---|---|---|---|
#18+
Hett, А в чем, в общем-то, преимущество хранения в бинарном виде, кроме размера поля? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2019, 16:03 |
|
String constants vs int
|
|||
---|---|---|---|
#18+
90% надо смотреть от юзкейса. Если например мы храним целый инстаграм картинок - то разумно брать BLOB или внешнее файловое хранение. Для IP адресов. Ну … если 99% они используются для печати в лог-файле (а там они представлены в принтабельнов виде) то можно сразу их складывать в строку. Или для поисковых операций по документу. Где в сущности строки даже легче. Всё как-то гомогенно получается. Хранить как int в документно-ориентированной БД... ну не знаю. Рискну предположить что будет польза будет варироваться от "никакой пользы" до "ненужные преобразования для прочтения человеком на экране". ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2019, 16:11 |
|
String constants vs int
|
|||
---|---|---|---|
#18+
mayton90% надо смотреть от юзкейса. +100500 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2019, 16:15 |
|
String constants vs int
|
|||
---|---|---|---|
#18+
fkthatА в чем, в общем-то, преимущество хранения в бинарном виде, кроме размера поля? Размер влияет на потребление памяти, а память влияет на скорость работы. Поэтому пари меньшем размере больше индексов в память поместится, значит в среднем будет больше скорость. Плюс само сравнение узлов в дереве быстрее для Int делать, нежели для строки - опять ускорение. Плюс коррекция данных, то есть либо они парсятся в int, либо нет, своего рода валидация. Хотя да, можно забить на всё это. Но такую привычку лучше не тренировать. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2019, 10:46 |
|
String constants vs int
|
|||
---|---|---|---|
#18+
alex55555, Да эта тема "int vs guid" обжевана повсюду уже мульон раз - в теории guid в четыре раза меньше, но на практике разницы именно из-за размера никакой. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2019, 11:45 |
|
String constants vs int
|
|||
---|---|---|---|
#18+
"в четыре раза больше", конечно. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2019, 11:56 |
|
String constants vs int
|
|||
---|---|---|---|
#18+
fkthat"в четыре раза больше", конечно.у кого как, некоторые хранят guid-ы в VARCHAR(36) в виде строки '22345200-abe8-4f60-90c8-0d43c5f6c0f6'. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2019, 12:06 |
|
String constants vs int
|
|||
---|---|---|---|
#18+
fkthatalex55555, Да эта тема "int vs guid" обжевана повсюду уже мульон раз - в теории guid в четыре раза меньше, но на практике разницы именно из-за размера никакой. GUID используется в распределённых и JMS системах где вам нужно гарантировать уникальность ключа при отсутствии глобального распределённого объекта типа sequence. Поэтому выбор GUID - это не "количественный" а архитектурный выбор. На интах вы такое не сможете построить. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2019, 12:12 |
|
String constants vs int
|
|||
---|---|---|---|
#18+
miksoftfkthat"в четыре раза больше", конечно.у кого как, некоторые хранят guid-ы в VARCHAR(36) в виде строки '22345200-abe8-4f60-90c8-0d43c5f6c0f6'. Эти некоторые уже выше отписались. Если IP хранят в виде строки, то GUID/UUID аналогично, подозреваю. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2019, 15:29 |
|
String constants vs int
|
|||
---|---|---|---|
#18+
Это я к тому, что если уж говорить про эти ваши GUID/UUID, то опять же в том контексте, как его хранить, бинарно (с обертками субд) или строкой. А сравнивать его с Int смысла нет, думаю это очевидно. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2019, 15:30 |
|
String constants vs int
|
|||
---|---|---|---|
#18+
HettЧто думаете? В принципе, мнемокоды, конечно, более наглядны, нежели числа - скажем, RUB понятнее, чем 643, да и поле GENDER с возможными значениями 0/1 не сказать чтобы сверхудобно. С другой стороны, числа удобны тем, что в них существует логичный порядок - это иногда удобно применять, например, для статусов, а в булёвых полях - коих обычно больше, чем всех остальных вместе взятых - 0/1 не требуют гадать, записать ли туда 'Y', 'y', 'yes' или 'да', да и расширение числовых вариантов новыми значениями обычно проходит проще (скажем, если в поле GENDER нужно добавить ещё нейтралов и трансгендеров). В общем, это больше вопрос вкусов - можно так, можно эдак, но нужно выбрать цельную концепцию, использовать её и адекватно документировать, тогда ни у кого не будет проблем. Всего лишь Код: plsql 1. 2. 3. 4. 5. 6. 7.
и ни у кого не возникает вопросов. maytonНо обычно с точки зрения баз данных - решительно пофиг какие ключи хранить. Числа и строки (CHAR/VARCHAR) имеют почти одинаковые накладные расходы на хранение. Ну это как-то сильно сказано. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2019, 19:24 |
|
String constants vs int
|
|||
---|---|---|---|
#18+
maytonGUID используется в распределённых и JMS системах где вам нужно гарантировать уникальность ключа при отсутствии глобального распределённого объекта типа sequence. Поэтому выбор GUID - это не "количественный" а архитектурный выбор. Ну могут быть еще другие резоны. Например, его случайность, и возможность сгенерить ключ записи еще на клиенте до вставки в таблицу. При желании, кстати, guid вполне можно и укоротить. В "мс-овском" гуиде 6 битов всегда одни и те же, остальные просто случайные. Теоретически даже возможна коллизия, но практически она нереальна. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2019, 21:38 |
|
|
start [/forum/topic.php?fid=16&fpage=9&tid=1339936]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
72ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
67ms |
get tp. blocked users: |
2ms |
others: | 248ms |
total: | 437ms |
0 / 0 |