Эффективность многозначных логических флагов и мультиплексированных целых (бит) в Java и MySQL - PullRequest
1 голос
/ 07 декабря 2011

Это вопрос разработки, касающийся как Java, так и MySQL.

Клиент требует добавления 14 логических флагов (T / F) для отслеживания некоторой новой информации в существующем классе / таблице.

Я могу добавить эти флаги в существующую таблицу или создать новый класс и таблицу только для этих данных. Добавление 14 логических флагов к существующей таблице даст ей довольно много атрибутов, которых я склонен избегать (особенно, если количество флагов увеличивается со временем). Создание нового класса / таблицы чище, но действительно ли это необходимо в этом случае?

С другой стороны, я мог бы использовать 16-битное целое число с масками для мультиплексирования данных, а затем я добавляю только одну переменную в существующий класс / таблицу.

Мой основной вопрос заключается в следующем: более эффективно хранить 14 отдельных логических переменных в базе данных MySQL и загружать их в класс, или лучше хранить одно целое число, а затем (в Java) мультиплексировать флаги, используя битовые манипуляции (т.е. маски)?

Вторичный вопрос: если отдельные флаги более эффективны, то лучше ли иметь много атрибутов в одной таблице или разделить их? Какое наказание за хранение множества логических флагов в таблице, в которой уже есть довольно много сущностей?

Если ответ на основной вопрос «целое число + мультиплекс», то второй вопрос становится спорным.

Спасибо.

-R

Ответы [ 4 ]

3 голосов
/ 08 декабря 2011

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

1 - пробел не должен учитываться, если только класс / таблица не увеличится до огромных объемов.для имитации логических флагов достаточно маленького int (1), и все, что вам нужно, это значения 0/1.

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

3 - будет гораздо сложнее построить индексы для этого столбца, когда они понадобятся, если это будетвообще возможно (на основе базы данных)

4 - работать больше и писать больше кода не должно быть проблемой.Вы работаете больше сейчас, но вы будете работать меньше в будущем.думать, что это меньше работы для программиста / DBA это просто иллюзия ИМХО.Вот некоторые соображения:

a - будет сложнее поддерживать код и писать запросы к базе данных.может быть, вы все делаете сейчас в своем Java-коде, но никогда не знаете, что нас ждет в будущем.

b - сделать структурные изменения сложнее.Что делать, если клиент требует удаления двух флагов и добавления 4?Вы сохраняете оригинальные два бита, которые содержали удаленные флаги в базе данных, и добавляете 4 бита?или вы используете их для двух новых флагов, а затем добавляете еще два бита?Как это повлияет на код, который уже написан?и насколько легко было бы отслеживать все места и вносить изменения в код?

в небольшом приложении это не большая проблема.но приложения растут со временем.если стол получит широкое распространение, это очень опасно.если у вас был код, работающий с 7-м и 8-м флагами, и они были удалены, и было решено (скажем, другим программистом) повторно использовать те же места, любой код, который использовался для доступа к 7-му и 8-му битам, будет продолжать работать (неправильно)) пока что не заметил.он может уже делать вредные вещи, пока проблема не будет обнаружена и устранена.если у вас были отдельные столбцы, и вы их отбросили, ошибка появится на поверхности при самом первом использовании этого кода, поскольку столбцов там не будет.

c- это, без сомнения, будет сложнеесоздавать сценарии, которые обновляют данные и / или изменяют структуру для базы данных.Опытный DBA не будет сидеть и писать имена столбцов один за другим и будет использовать свои инструменты для генерации сценариев.с помощью битовых манипуляций ему придется работать вручную и не ошибаться в выражениях, которые он производит в различных операциях выбора / обновления

5 - все вышеперечисленное связано с базой данных.как только оно достигнет вашего приложения, вы свободны.вы можете прочитать 16 флагов из базы данных и получить целое число, и с этого момента ваш код может использовать битовые манипуляции с ним, и вы можете сэкономить время (написав свои функции, которые имеют дело с ним один раз, и используя их).Я лично считаю, что и здесь лучше не делать этого, но в любом случае это ваш выбор.

Я знаю, что я не сосредоточен, и что я мог бы повторить здесь и там.Но я также надеюсь, что смог помочь вам увидеть долгосрочные соображения, которые помогут вам сделать правильный выбор для вашего случая.

1 голос
/ 07 декабря 2011

Вы можете использовать EnumSet . Это лучший способ эмулировать флаги - гораздо более понятный по дизайну и имеющий почти такую ​​же производительность, как int. Может быть легко переведен в int (для чтения / ввода в базу данных). Дополнительную информацию смотрите в книге «Эффективная Java», глава «EnumSet»

1 голос
/ 07 декабря 2011

взгляните на SET Тип столбца

0 голосов
/ 07 декабря 2011

В основном вопросе вы спрашиваете, что лучше, а что лучше.Это усложняет ответ.

С точки зрения разработчика и администратора баз данных, имеющих один столбец, является более эффективным решением.Поскольку вы экономите место и используя маски, вы увеличиваете производительность вставок и обновлений.

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

Как и мне, я предпочитаю маски - Les изменения в коде - Лучшее управление (ограниченная целочисленная емкость - риск здесь)

...