3

How to store data with dynamic number of attributes in a database を見てきましたが、私の質問にはあまり答えませんでした。私が実装しているシステムはかなり大きいので、私が懸念しているオブジェクトである Item と Category に固執します。アイテムは、それが属するカテゴリに応じて可変数の属性を持ちます。たとえば、「T シャツ」カテゴリに属する​​アイテムにはサイズの属性があり、「車」カテゴリに属する​​アイテムにはモデルの属性があります。管理者としてシステムにログインした人は、まったく新しい属性を持つ新しいカテゴリを作成できます。これを機能させるために、Java コードとデータベースの両方でこれを構造化する最良の方法は何ですか?

カテゴリが動的に作成されていない場合は、継承を使用して、特定の属性が入力された TShirtItem オブジェクトを作成します。しかし、動的であるため、当惑します。Map データ構造の使用を提案する同様の質問を見ましたが、それがどのように機能するかわかりません...

一番上で言及した質問は、データベース側で、カテゴリ テーブル、属性テーブル、およびどの属性がどのカテゴリに対応するかをリンクする関係テーブルを持つことを示唆しています。意味あり。しかし、Item オブジェクトのことを考えていると、またつまずきます。Item テーブルに一意の Category_ID を格納することはできますが、各 Item の属性はどこに格納すればよいでしょうか?

4

5 に答える 5

3

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 マップとしてモデル化するのは簡単です。上記の構造には冗長性があります。たとえば、属性行の文字「タイプ」フィールドです。整合性チェックを行うためのトリガーを検討してください。

于 2012-11-20T05:56:22.437 に答える
2

これを行うための簡単な 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        
}

このアプローチはニーズに合っています。さらに、ファクトリ パターンを使用して、カテゴリに応じてアイテムをインスタンス化し、エレガントなコードにすることができます。

少しでも疑問を感じたらまた来てください。

EDIT: 属性のゲッターまたはセッターがないため、プログラミング中にコード内の要素のすべての属性を取得する複雑な方法があります。このアプローチは、Item クラスで Item に追加された属性のセットを維持できる場合、または item クラスの attributeMap プロパティの keySet を照会できる場合に役立ちます。

private Set<ItemAttibuteName> attributes;

また

attributeMap.keySet();

お力になれて、嬉しいです

ダラム

于 2012-11-20T05:26:03.827 に答える
0

Java ではなく、設計レベルの問題です。DBテーブルを定義する方法を理解する必要があり、それはJavaオブジェクトを見つけるのに役立ちます...

カテゴリから始めましょう...カテゴリには多くのアイテムが含まれる場合があり、アイテムは1つのカテゴリにのみ属します(実際のシナリオでは正しい仮定ではありません)。

DATABASE には、Category というテーブルがあります。カテゴリに基づいて属性を定義する場合は、属性のデフォルト値を保持する Category_attribute という別のテーブルを用意します。

それではアイテムに移りましょう。アイテムはカテゴリに属しているため、アイテム テーブルには、アイテム n カテゴリのマッピングを持つための category_key があります...アイテムには、ITEM_Attribute テーブルに格納されている属性があります...

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オブジェクトを簡単に作成できます...

于 2012-11-20T06:16:09.643 に答える
0

テーブル内のすべてのオブジェクトタイプを定義し、後で以下のアプローチを使用するような方法でデータを構造化できると思います。

次のようなテーブルを定義できます。

  • OBJECT_TYPE

  • オブジェクト

  • OBJ_PROPERTY_DEF

  • OBJ_PROP_VALUES

例えば。
In OBJECT_TYPE ここですべてのオブジェクト タイプを定義します

object_type_code(pk) obj_name

4                              car
5                              t-shirt

オブジェクトで

obj_code(pk) object_type_code(fk) obj_name


1           4       BMW  
2           4       Maruti  
3           4       Honda  

4           5       levis  
5           5       polo  
6           5       reebock  

OBJ_PROPERTY_DEF 内

このテーブルのオブジェクトに対応するすべてのプロパティを定義します。

注: 定数ファイルを使用してプロパティ タイプを定義すると、別のテーブルが回避されます。データ型を以前に知っていれば幸いです。

obj_prop_code(pk) obj_code(fk) property_type プロパティ名

------------- -------- ------------- -------------

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  

OBJ_PROP_VALUES では、上記の指定されたプロパティの値を挿入できます

obj_prop_val_code(pk) obj_prop_code(fk) obj_prop_value(VARCHAR) prop_value_sufix

----------------- ------------- -------------- ------ -----------

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     -   

Reg 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

于 2012-11-20T06:30:50.493 に答える