我看过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();
乐于帮助
达兰