Если ваша СУБД поддерживает логический тип данных, такой как MySQL, используйте его. Если это не так, как в Oracle, я обычно использую char (1) со значениями Y или N. В последнем случае хорошей идеей будет написать пару функций для преобразования вашего Java или C ++ или любого другого логического типа в и от Y / N, чтобы избежать лишнего кода для этого. Это довольно тривиальная функция, но она должна иметь дело с такими случаями, как нули или значения, отличные от Y или N, и вы хотите делать это последовательно.
Я бы определенно НЕ упаковывал флаги в одну переменную с битовыми операциями. Да, это сэкономит немного дискового пространства, но цена намного сложнее и возможности для ошибок. Если ваша СУБД не поддерживает битовые операции - и, поскольку у меня никогда не было желания делать такие вещи, я не знаю, насколько это возможно, - тогда у вас будет очень сложный выбор или сортировка на основе такого флага. Конечно, вы можете извлечь все записи, отвечающие другим критериям, а затем сделать так, чтобы вызывающий код отсеивал записи с правильным значением флага. Но что, если только небольшой процент записей имеет желаемое значение флага, и у вас есть запрос, который объединяет многие другие записи? Например, «выберите employee.name, sum (pay.amount) из заработной платы сотрудника, используя (employee_id), где employee.executive = true и pay.bonus = true». С предложением where вы, вероятно, получите очень скромное количество записей. Без этого вы получаете всю базу данных.
Дисковое пространство в наши дни дешевое, поэтому любая экономия на диске, вероятно, будет неважной. Если у вас действительно есть огромное количество флагов - например, сотни или тысячи из них на запись - я полагаю, может быть целесообразно их упаковать. Но это будет далеко внизу моего списка вариантов дизайна.
Редактировать: Позвольте мне подробно описать написание класса для преобразования вашего "логического значения SQL" в "логическое значение Java". То же относится и к любому языку, но я буду использовать Java в качестве примера.
Если ваша СУБД имеет встроенный логический тип, то с помощью Java вы можете прочитать это непосредственно в логическую переменную с помощью ResultSet.getBoolean ().
Но если вам нужно сохранить его как, скажем, символ "Y" или "N", то вы должны прочитать его в строку. Поэтому для меня имеет смысл объявить такой класс:
class MyBoolean
{
boolean value;
final static MyBoolean TRUE=new MyBoolean(true), FALSE=new MyBoolean(false);
public MyBoolean(boolean b)
{
value=b;
}
public MyBoolean(String s)
{
if (s==null)
return null;
else if (s.equals("Y"))
return MyBoolean.TRUE;
else
return MyBoolean.FALSE;
}
public static String toString(MyBoolean b)
{
if (b==null)
return null;
else if (b.value)
return "Y";
else
reutrn "N";
}
public String toString()
{
return toString(this);
}
}
Тогда вы можете легко получить логические значения из базы данных с помощью «MyBoolean flag = new MyBoolean (rs.getString (" flag »));" и записать в базу данных с помощью «rs.setString (« flag », flag.toString ());»
И, конечно, затем вы можете добавить любую другую логику, которая вам нужна, к классу, если у вас есть другие логические вещи, которые вам нужно сделать. Если для некоторых целей вы хотите отобразить логическое значение как T / F или Да / Нет, Вкл. / Выкл. И т. Д., Вы можете просто добавить альтернативные варианты toString - toTFString или toString (значение, truetext, falsetext) или как угодно - вместо записи похожий код снова и снова.