Задача стоит в проектировании БД для интернет магазина.
У каждого товара есть набор характеристик (связь многие ко многим разбивается через промежуточную табличку). У сущности "характеристика" есть кроме id еще String name и ??? value
Вопрос в том, какой лучше тип выбрать для value ?? пока склоняюсь к типу String, в который можно писать все вышеперечисленные типы. Еще есть мысли по поводу не заморачиваться и написать туда Object или Serializible.
С точки зрения проектирования какое решение будет правильнее?
Spring Boot (Spring JPA)
Еще есть мысли по поводу не заморачиваться и написать туда Object или Serializible.
А заморочиться придется...
Это ровно та задача, которая стоит перед любым разработчиком универсальной структуры данных. Путь известен и проторен не одним десятком прогеров, включая и меня самого. Основные положения:
Если подробнее то примерно так (простейшая реализация для двух типов строка и целое число):
abstract class MyType {
abstract void setValue(int value);
abstract void setValue(String value);
abstract String getValue();
}
class MyTypeString extends MyType {
private String valueString=null;
@Override
void setValue(int value) {
valueString=new StringBuilder().append(value).toString();
}
@Override
void setValue(String value) {
valueString=value;
}
@Override
String getValue() {
return value;
}
}
class MyTypeInt extends MyType {
private Integer valueInt=null;
@Override
void setValue(int value) {
valueInt=value;
}
@Override
void setValue(String value) {
try {
int val=Integer.parseInt(value);
valueInt=new Integer(val);
}
catch(Exception ex) {
valueInt=null;
}
}
@Override
String getValue() {
return new StringBuilder().append(valueInt).toString();
}
}
Выбрать "правильнее" не получится, зависит от реализации и необходимых задач. Как вариант, добавить таблицу справочник характеристик, в которой хранить название характеристики и её тип (например Ватт, число), а в самой характеристике хранить переменную с типом Object. В таком случае, когда нам необходимо добавить значение на экран, можно просто воспользоваться .toString(), когда нам необходимо сделать фильтрацию (например, показать для товара ползунок с максимальным и минимальным значением (блок питания 300-1000 Ватт)) используем справочник характеристик и конвертируем значение в нужный формат.
Я сталкивался с 2 вариантами реализации подобных задач. В обоих случаях требуется завести справочник характеристик с информацией о типе значения (число, строка, дата и пр.).
Вариант 1
Для каждого типа значений создать отдельную таблицу number_values(товар, характеристика, значение-число)
, string_values(товар, характеристика, значение-строка)
и т.д.
Плюсы:
Контроль данных на уровне БД (например, для числовой характеристики в number_values
не получится записать строку и пр. мусор).
Расширяемость - при добавлении нового типа данных не требуется изменять существующие сущности (нужно только создать таблицу для значений нового типа и добавить условие в общий SQL-запрос (см. далее)).
Минусы:
Вариант 2 - использовать одну разряженную таблицу values(товар, характеристика, значение-число, значение-строка, значение-дата, ...)
, где заполнено только одно из значений.
Плюсы:
Минусы:
В обоих случаях я бы советовал вам в результатах выборки запроса возвращать типизированные значения, а уже на уровне бизнес-логики проводить определенные манипуляции.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Здравствуйте, вот такая проблемаКак из строки удалить символы [], если ] ещё можно удалить, то с [ я не справился
Пытаюсь запустить пример использования KeyListener, но компилятор выдает ошибку