如何存储属性数量可变的java对象

如何存储属性数量可变的java对象,java,database,Java,Database,我看过了,但它没有完全回答我的问题。我正在实现的系统相当大,因此我将坚持使用我关心的对象:Item和Category。根据项目所属的类别,项目具有可变数量的属性。例如,属于“T恤”类别的项目将具有“大小”属性,而属于“汽车”类别的项目将具有“型号”属性。以管理员身份登录系统的人可以创建具有全新属性的新类别。在我的Java代码和数据库中构造此结构的最佳方法是什么 如果类别不是动态创建的,我会使用继承,这样我会有一个TShirtItem对象,并填充它的特定属性。但由于它是动态的,我感到困惑。我看到一

我看过了,但它没有完全回答我的问题。我正在实现的系统相当大,因此我将坚持使用我关心的对象: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

在ObjectData.java中

private ObjectTypeData          objType;//specifies the type
private List<ObjectPropertyValueData>   listProps; //will have all property values

//setter & getters and other req props
私有对象类型数据对象类型//指定类型
私有列表道具//将具有所有属性值
//setter&getter和其他req道具


我认为有些属性是主要属性(尺寸、颜色……),有些属性是次要属性(材料、重量……)。我将为此描述简化的模式(当然,存在另一个库存实体,它存储带有颜色、大小的确切项目-用条形码标识-但为了简单起见省略)。这种设计将有所帮助,而不是硬编码某些属性的一部分,这对于分类项目很重要

使用此设计添加数据
  • 对于在本设计中创建数据=>您正在使用其属性、尺寸类型创建一些类别(例如鞋子=>39,40,41…(选项);Tshirt=>s,M,L…,Iphone 7,8,X…)=>此类别内的特定文章-Iphone(在您的电子商务系统上以这种方式存在Iphone)

  • 您将特定物品Iphone X(尺寸)-颜色黑色添加到仓库或库存中,并添加其他类别
    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}
    }