
Al
27.05.2018
15:34:40
не понятно стремление хранить именно как битовую маску

Sheldhur
27.05.2018
15:36:33
так я и не стремлюсь
я спрашиваю чё лучше
создать по отдельной колонке или хранить битовую маску

Google

Dmitrii
27.05.2018
16:01:53
А база то какая?

Sheldhur
27.05.2018
16:02:26
мускуль

Dmitrii
27.05.2018
16:02:36
Ой, все.

Sheldhur
27.05.2018
16:02:51
ой, всё

Dmitrii
27.05.2018
16:03:08
Там способов кроме как создавать колонки не существует
Я не уверен что ты не выстрелишь себе в ногу если будешь использовать битмаску.

Sheldhur
27.05.2018
16:04:03
ну есть ещё вариант с SET и JSON

Dmitrii
27.05.2018
16:04:12
На btree селективность битмаски будет плохая, а у постгреса есть оптимизации свои для ьитовых операций
А что, в MySQL уже можно делать индексы по JSON?
Только вот про вот эти виртуальные поля, и экстрактирования полей из JSON не надо сейчас.

Sheldhur
27.05.2018
16:06:26
ой всё

lost
27.05.2018
16:34:20
либо денормализация, либо битовая маска, либо eav, либо json вот тебе 4 стула

Dmitrii
27.05.2018
16:35:18
eav так вообще бутылка.

Google

lost
27.05.2018
16:35:56
ну каждый сам выбирает на что садиться

Al
27.05.2018
17:13:59

lost
27.05.2018
17:14:54
Так и не говорил что плохо)

Dmitrii
27.05.2018
17:40:37

Al
27.05.2018
17:48:13
Что не устраивает?

Dmitrii
27.05.2018
17:50:19
Мой бит может быть установлен в составе другого или ещё шести в комбинации которой я ваще ниипу
Так как мне число то собрать я не понял

Al
27.05.2018
18:15:06

Skench
27.05.2018
18:30:19
Добрый всем день, не хотелось бы изобреть велосипед со скриптами, написал чисто для отдела маленькую БД с лицензиями ПО, в связи с тем, что сотрудники часто меняются или переезжают между залами, есть ли в mysql возможность, чтобы рандом просили проверить актуальность записи в таблице рандомных строк, какими то средствами которые есть в mysql выходил запрос на актуализацию данных в таблице? Я не разработчик БД, если вопрос глупый прошу подсказать какими средствами можно это реализовать, объяснять полностью не нужно. Спасибо заранее всем.

lost
27.05.2018
18:58:57
Встроенный планировщик и скрипт который будет проверять expire

Skench
27.05.2018
19:02:11

Dmitrii
27.05.2018
19:16:42
Это тоже можно посчитать
Каждая из сущностей хранит int, которое на самом деле битмаска:
10010000 = 144
10011001 = 153
01011001 = 89
Теперь мне надо найти все записи, у которых подняты биты под номерами 8, 5 и 4 и не содержит бита под номером 1.
Интересно мне узнать, какое (какие)же числа вы поставите в WHERE часть...

Al
27.05.2018
19:18:39

Dmitrii
27.05.2018
19:18:55

Al
27.05.2018
19:27:50

Dmitrii
27.05.2018
19:28:39
Типичный пример под номером 1.

Google

Dmitrii
27.05.2018
19:29:07
Вопрос то читали? Что будет в WHERE части.

Al
27.05.2018
19:31:07

Danil
27.05.2018
19:31:37

Dmitrii
27.05.2018
19:32:36
С функциями побитовых операций все понятно. Выше предлагали ставить челочисленное число и считать маску в приложении

Danil
27.05.2018
19:33:33
А, так это не исходная задача)

Dmitrii
27.05.2018
19:34:12
Собираешь маску которую ищешь. Получаешь число. Ищешь число.
Для меня это выглядит как WHERE mask = 152
Или я читать разучился?

Al
27.05.2018
19:39:23

Danil
27.05.2018
19:39:25

Sheldhur
27.05.2018
19:39:54
нет
WHERE mask & n = n или WHERE mask & n > 0

Danil
27.05.2018
19:41:24
Первое скорее = mask

Sheldhur
27.05.2018
19:41:44
бля, маски нинужны на самом деле
SET хранится как маска
но опять же вопрос будет ли работать индекс в этом случае?
SELECT * FROM tbl_name WHERE FIND_IN_SET('value',set_col)>0;
если я всё правильно понимаю - нет

lost
27.05.2018
19:50:20
Индекс не будет работать никогда если на индексированную колонку применяются функции или любые преобразования

Danil
27.05.2018
19:53:59
Я помню лет 7 назад была у меня похожая идея, с масками, при установлении соответствия произвольному шаблону с атрибутами и свойствами, но в итоге положил на это болт, стал в бд хранить все компактнее, а вычисления делал на клиенте. По сравнению с скл-запросами (включая использование команд реляционной алгебры) производительность выросла порядка на 2 на больших объемах. На мелких тоже почти не просела.
Что же касается битовых масок, смотрите не нарвитесь на то, что свойств будет так много, что маска выйдет за границы максимального целочисленного типа в вашей бд.

Google

Al
27.05.2018
19:57:00
https://dev.mysql.com/doc/refman/8.0/en/numeric-type-overview.html
BOOL, BOOLEAN
These types are synonyms for TINYINT(1). A value of zero is considered false.

lost
27.05.2018
19:58:24
Это ты к чему?

Al
27.05.2018
19:59:18
К 100500 столбикам :)

Sheldhur
27.05.2018
20:01:53

Al
27.05.2018
20:02:20

Danil
27.05.2018
20:03:28
Тут получается потолок - 64 свойства. У меня в том примере было больше.

Dmitrii
27.05.2018
20:06:02
(никак)

Al
27.05.2018
20:07:05

Dmitrii
27.05.2018
20:07:31
О, становится интереснее. И сколько же таких сравнений мне придется в базу отправить?

Danil
27.05.2018
20:07:35

Dmitrii
27.05.2018
20:07:37
Давайте ка разберемся.

Al
27.05.2018
20:09:02

Dmitrii
27.05.2018
20:09:27
А вас кто то ограничивает одним сравнением?
Ваше число — посчитанная маска, она уже жестко задает выключенные биты. Значит мне придется собрать все кобинации всего чего можно игнорировать и что нельзя и придется перечислять с индивирульаной OR маской
И об этом я сказал в самом начале. Сначала вы прикинулись валенком, а теперь таки признали наличие проблемы
После какой-то дебильной ссылки на булеву алгебру. Сюр.

Al
27.05.2018
20:11:00

Danil
27.05.2018
20:11:02

Google

Dmitrii
27.05.2018
20:11:34
За сим я удаляюсь.

Al
27.05.2018
20:11:41

Dmitrii
27.05.2018
20:12:43
Не понимаю зачем вы дальше продолжаете дискуссию. Все же обсудили уже, не?

Al
27.05.2018
20:13:21

Dmitrii
27.05.2018
20:13:22
Мой опыт и ваш никто не просил обсуждать.

Danil
27.05.2018
20:15:02
Это один оператор

Al
27.05.2018
20:15:23

Dmitrii
27.05.2018
20:16:16
Неизвестном количестве битов, условий и так далее.
10010000
10011001
11011001
Задачу можно искусственно уложнять сколько угодно
В конце концов вы придете к веренице говна в WHERE части или к 64м (лол) запросам.

Konstantin
27.05.2018
20:19:54
Блин
Я не понял немного чё ты пытаешься сказать