我看过How to store data with dynamic number of attributes in a database,但并没有完全回答我的问题。我要实现的系统相当大,因此我将坚持使用我关注的对象:项目和类别。一个项目具有可变数量的属性,具体取决于它所属的类别。例如,属于“T恤”类别的商品将具有尺寸属性,而属于“汽车”类别的商品将具有模型属性。以管理员身份登录系统的人可以创建具有全新属性的新类别。在我的Java代码和数据库中构造此代码的最佳方法是什么?

如果类别不是动态创建的,我将使用继承,以便我将填充特定属性的TShirtItem对象。但是由于它是动态的,所以我很困惑。我看到了一个类似的问题,建议使用Map数据结构,但是我不确定这将如何工作...

我在顶部提到的问题将在数据库端建议我有一个Category表和Attributes表,以及将哪些属性与哪个Category关联起来的关系表。这很有道理。但是当我想到Item对象时,我又被绊倒了。我可以在项目表中存储唯一的Category_ID,但是每个项目的属性应该存储在哪里?

最佳答案

这是一种简单的Java方法。在设计大型系统时,我总是建议从更大的角度来看。这里的问题是动态更改属性。这并非易事,但是的,这很有趣。

您的商品类的结构必须类似于以下内容:

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
}

这种方法可以满足您的需求,此外,您还可以使用工厂模式根据类别实例化Items并将其制成精美的代码。

如果您仍有疑问,请回来。

编辑:
现在,在编程时将有一种复杂的方法来获取代码中元素的所有属性,因为您没有属性的getter或setter方法。好的,如果您可以维护在Item类中添加到Item的一组属性,或者可以查询item类的attributeMap属性的keySet,则该方法将有所帮助。
private Set<ItemAttibuteName> attributes;

要么
attributeMap.keySet();

乐于帮助

达兰

09-30 15:21
查看更多