如何存储属性数量可变的java对象
我看过了,但它没有完全回答我的问题。我正在实现的系统相当大,因此我将坚持使用我关心的对象:Item和Category。根据项目所属的类别,项目具有可变数量的属性。例如,属于“T恤”类别的项目将具有“大小”属性,而属于“汽车”类别的项目将具有“型号”属性。以管理员身份登录系统的人可以创建具有全新属性的新类别。在我的Java代码和数据库中构造此结构的最佳方法是什么 如果类别不是动态创建的,我会使用继承,这样我会有一个TShirtItem对象,并填充它的特定属性。但由于它是动态的,我感到困惑。我看到一个类似的问题,建议使用地图数据结构,但我不确定这将如何工作如何存储属性数量可变的java对象,java,database,Java,Database,我看过了,但它没有完全回答我的问题。我正在实现的系统相当大,因此我将坚持使用我关心的对象:Item和Category。根据项目所属的类别,项目具有可变数量的属性。例如,属于“T恤”类别的项目将具有“大小”属性,而属于“汽车”类别的项目将具有“型号”属性。以管理员身份登录系统的人可以创建具有全新属性的新类别。在我的Java代码和数据库中构造此结构的最佳方法是什么 如果类别不是动态创建的,我会使用继承,这样我会有一个TShirtItem对象,并填充它的特定属性。但由于它是动态的,我感到困惑。我看到一
我在顶部提到的问题会在数据库端建议我有一个类别表、属性表和关系表,将哪些属性与哪些类别联系起来。这是有道理的。但是当我想到物品对象时,我又被绊倒了。我可以在Item表中存储唯一的Category_ID,但是我应该在哪里存储每个Item的属性呢 下面是一个简单的java方法。在设计大型系统时,我总是建议从更大的角度考虑问题。这里的问题是动态更改属性。这并不容易,但的确很有趣 item类的结构必须如下所示:
class Item{
private String itemName; // I assume all items will have a name.
private Map<ItemAttibuteName , Object> attributeMap ; // this will be a dynamic map.
public Map<ItemAttibuteName, Object> getAttributeMap(){//getter for attribute map
if( null == attributeMap)
return new HashMap<String, Object>();
return attributeMap ;
}
// you can synchronize this if needed
public void setAttribute(ItemAttibuteName name, Object value){
attributeMap.put(name, value);
}
public Object getAttribute(ItemAttibuteName name){
return attributeMap.get(name);
}
}
public enum ItemAttibuteName{
SIZE,
COLOUR
}
很乐意帮忙
Dharam如果您必须使用SQL数据库,并且需要对属性进行有效的类型识别(而不仅仅是字符串)查询(例如列出所有大小在4到8之间的项目),那么数据库的结构是最难的部分。Java将从此开始。如果我理解正确,您将需要以下内容:
categories:
id : integer (pk)
name : varchar
attributes:
id : integer (pk)
of_category : integer (fk -> categories.id)
name : varchar
type : char(1) // 'N' for number, 'S' for string, etc.
items:
id : integer (pk)
of_category : integer (fk -> categories.id)
number_values:
value : number
of_item : integer (pk, fk -> items.id)
of_attribute : integer (pk, fk -> attributes.id)
string_values:
value : varchar
of_item : integer (pk, fk -> items.id)
of_attribute : integer (pk, fk -> attributes.id)
... additional table for each attribute type
下面是示例查询:
select * from categories c, items i, attributes a, number_values v
where c.name = 'shirt' and
a.of_category = c.id and
a.name = 'size' and
a.id = v.of_attribute and
i.id = v.of_item and
v.value between 4 and 8
毛茸茸的多重连接是为运行时定义的属性付出的代价
一旦您确定了表的正确位置,就可以直接将它们建模为Java映射。上面的结构中存在冗余:例如属性行中的字符“type”字段。考虑触发器进行一致性检查。
而不是java,它更像是设计级问题。您必须找出定义DB表的方法,这将帮助您找到Java对象
让我们从分类开始。。。一个类别可能包含很多项目,而一个项目只属于一个类别(尽管我认为这不是一个正确的假设) 所以在数据库中有一个名为Category的表。如果您想基于category定义属性,那么有另一个名为category\u attribute的表,它将保存属性的默认值 现在让我们转到一个项目。某个项目属于某个类别,因此项目表将具有Category_键,以便对项目n Category进行映射。。。项目将具有其存储在项目属性表中的属性 DB对象的简单形式必须如下所述Category
C_Id
Name
Category_Attribute
CA_ID
Name
Default_value
Category_Id(FK)
Item
I_ID
Name
C_ID(FK)
Item_attribute
IA_ID
Ca_ID(FK from category_attribute table)
I_ID(FK from item table)
Value
所以,每当您创建一个类别时,您都会要求用户定义该类别的关联属性
在创建项目时,将其映射到类别。。。和类别关联的属性应该使用默认值进行复制,并映射到项目
因此,您将能够轻松地创建Java对象…我想您可以以这样一种方式构造您的数据,即在一个表中定义所有对象类型 然后使用下面的方法 您可以定义如下表:
- 对象类型
- 物体
- 对象属性定义
- 对象属性值
在对象类型中 在此处定义所有对象类型 对象类型代码(pk)对象名称
4 car
5 t-shirt
在对象中
对象代码(pk)对象类型代码(fk)对象名称
在OBJ_属性中 定义与此表中的对象对应的所有特性 注意:使用常量文件来定义属性类型将避免另一个表。 希望您能更早地了解数据类型 对象属性代码(pk)对象代码(fk)属性类型属性名称 -------------------------------------------
12 6 8 (Integer) size
13 6 9 (String) color
14 6 10 (float) weight
15 6 11 (Boolean) is_coloured
16 6 9 (String) comments
17 3 9 (String) model
18 3 8 (Integer) version
19 3 9 (String) color
20 3 9 (String) comments
101 12 30 -
102 13 green -
103 14 126 gms
104 15 0 -
105 16 looks cool -
106 17 c532 -
107 18 3.22 -
108 19 black -
109 20 awesome car -
在OBJ_属性值中
您可以插入上述指定属性的值
对象属性值代码(pk)对象属性代码(fk)对象属性值(VARCHAR)属性值
-----------------------------------------------------
12 6 8 (Integer) size
13 6 9 (String) color
14 6 10 (float) weight
15 6 11 (Boolean) is_coloured
16 6 9 (String) comments
17 3 9 (String) model
18 3 8 (Integer) version
19 3 9 (String) color
20 3 9 (String) comments
101 12 30 -
102 13 green -
103 14 126 gms
104 15 0 -
105 16 looks cool -
106 17 c532 -
107 18 3.22 -
108 19 black -
109 20 awesome car -
注册Java分类:
定义具有相应属性的所有类。
例如:
- ObjectTypeData
- 对象数据
- ObjectPropertyDefData
- ObjectPropertyValuesData
private ObjectTypeData objType;//specifies the type
private List<ObjectPropertyValueData> listProps; //will have all property values
//setter & getters and other req props
私有对象类型数据对象类型//指定类型
私有列表道具//将具有所有属性值
//setter&getter和其他req道具
我认为有些属性是主要属性(尺寸、颜色……),有些属性是次要属性(材料、重量……)。我将为此描述简化的模式(当然,存在另一个库存实体,它存储带有颜色、大小的确切项目-用条形码标识-但为了简单起见省略)。这种设计将有所帮助,而不是硬编码某些属性的一部分,这对于分类项目很重要 使用此设计添加数据
private ObjectTypeData objType;//specifies the type
private List<ObjectPropertyValueData> listProps; //will have all property values
//setter & getters and other req props
enum CategoryTarget{
F, M, K
}
entity Category{
name String,
imageUrl String,
showHomepage Boolean,
target CategoryTarget,
accOrder Integer,
isLastNode Boolean
}
entity Article{
status Integer,
name String,
code String,
rating Double,
imageUrl String,
isPopular Boolean
}
relationship ManyToOne{
Category{parent} to Category,
Article{category} to Category{article},
Category{sizeType} to SizeType
}
relationship ManyToMany{
Category{attribute} to Attribute{category}
}
entity Attribute{
name String
}
entity AttributeOption{
name String
}
relationship OneToMany{
Attribute{attributeOption} to AttributeOption{attribute}
}
entity SizeType{
name String
}
entity ArticleSize{
name String,
accOrder Integer
}
relationship OneToMany{
SizeType{articleSize} to ArticleSize{sizeType}
}
relationship ManyToMany{
Article{attributeOption} to AttributeOption{article}
}