2

一連の値が常に同じ ID を生成し、一意である必要がある方法を見つける必要があります。

これの主な理由は、以前は多くの結合を行う必要があったクエリを 1 回の比較だけに高速化することです。私は自分のドメインを知っていますが、悲しいことに値は閉じられていません (つまり、値は何でもかまいません)。

ハッシュで試してみましたが、定義上、ハッシュ関数は一意性を保証しません。方法はありますか?

編集: いくつかのより多くのコンテキスト

私は、さまざまなデバイス セットからのイベントを関連付けるシステムで作業しています。

相関関係は、いくつかのイベント属性を通じて計算されます。

  • どこから来たのか。
  • どのようなイベントですか。
  • そこから派生し、異なるグループの同じ種類のイベントとは異なる値。

例えば、こんなことを考えてみてください。私のデバイスが冷蔵庫だと想像してください。内部の温度と食べ物に関するイベントを送信します。したがって、次の順序でイベントを受け取ると想像してください。

Event1: {type: temperature, values: [{temperature: -1]}
Event2: {type: food, values: [{group: vegetable, name: brocollis, quantity: 2, weight: 0.1]}
Event3: {type: food, values: [{group: vegetable, name: lettuce, quantity: 1,  weight: 0.1]}
Event4: {type: temperature, values: [{temperature: -5]}

タイプのすべてのイベントはtemperature相関する必要がありますが、タイプfoodの相関はそのnameおよびからも与えられgroupます。すなわち、相関識別子の数は可変である。

この相関関係は、このような構造に保存されます

@Entity
public class EventCorrelation {
    @Id @GeneratedValue
    @Audit
    private Long id;

    @ElementCollection
    @CollectionTable(
       name = "evt_corr_extra_id",
       joinColumns = @JoinColumn(name = "correlation_id"))
    @Column(name = "extra_id")
    @LazyCollection(LazyCollectionOption.TRUE)
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    private Collection<String> identifiers;
    // getters/setters
}

相関関係を識別する値を保存するのは、identifiers 配列内です。イベント相関を検索するクエリを高速化したいのですが、最初のアイデアは、相関から一意の ID を作成することでしたidentifiers

特定のイベントから、特定の属性が相関識別子であることを認識しているナレッジ データベースがあります。

任意のヒント?

4

3 に答える 3

4

考えられる解決策の 1 つは、値を文字列に変換し、ある種の予約済み区切り文字を使用してそれらを連結し、順序を確実に保持することです。文字列が一意の ID になります。

たとえば、値 1、"Bob"、7383.234、"{asdf}"、および 2013-01-08 には、次の一意の ID があります。

"1|Bob|7383.234|{asdf}|2013-01-08"

これは一種のメモ化技術です。

于 2013-01-08T18:37:48.953 に答える
1

たとえば、2 つのフード イベント:

Event11: {type: food, values: [{group: vegetable, name: brocollis, quantity: 2, weight: 0.1]}
Event12: {type: food, values: [{group: vegetable, name: brocollis, quantity: 3, weight: 0.27]}

どちらのイベントも brocollis 用ですが、数量と重量は ID の一部ではないのでしょうか? これは、特定のイベントから特定の属性が相関識別子であることを知っている知識データベースによって回答されると思います

たとえば、{type, group, name} などの ID の属性を設定したら、それらを並べ替えて ID を作成できます。たとえば、"{group:vegetable,name:broccolis,type:food}" = ID は文字列、属性は属性名で並べ替えられます。

ところで、あなたのドメインは閉鎖されていないと言いましたが、知識データベースがあるという事実は、これが許可されたタイプを既知のセットのみに制限することを意味するはずです。したがって、少なくともタイプについては、ID を少し短くしたい場合は、タイプを表す数値を見つけることができるはずです。

于 2013-01-08T19:36:30.657 に答える
0

唯一の方法は、文字列の辞書を作成することです。一意の文字列ごとに、この辞書で一意のIDを取得します。ただし、この方法ではパフォーマンスが低下し、メモリ使用量が増加します。

編集1:ちなみに、考えられるアイデアの1つは、ネイティブStringのオブジェクトIDを使用することです。つまり、Javaではすべての文字列がネイティブにキャッシュされます。したがって、オブジェクトのメモリアドレスにリンクされているネイティブハッシュを使用してみることができます。を使用するようなものSystem.identityHashCode()

編集2:私の前のステートメントでは、文字列のキャッシュについては正確ではありませんでした。いずれにせよ、このようなキャッシュを手動で(を使用してHashMap)作成し、キャッシュされた値オブジェクトをで使用することができます。System.identityHashCode()

于 2013-01-08T18:48:14.717 に答える