1

Card クラス内のフィールドである Reward タイプのオブジェクトがあります。Card クラスをデータベースに格納しようとしています。Card 内の他のフィールドは、データベースの永続性の問題ではないため、簡潔にするために、Card 内の Reward フィールドのみに関係します。

こちらがリワードクラスです。簡潔にするために、ゲッター/セッターは削除されました。

public class Reward {
private RewardType rewardType;
//Value should be 1 for weapons
private int amount;
//Null unless RewardType is weapon
private WeaponData weaponData;

public Reward() {
}

public Reward(RewardType rewardType, int amount) {
    if (rewardType == RewardType.WEAPON) {
        throw new IllegalArgumentException("A weapon must contain a non-null WeaponData field");
    }
    this.rewardType = rewardType;
    this.amount = amount;
}

public static class WeaponData {
    private int attack;
    private int durability;

    public WeaponData(int attack, int durability) {
        this.attack = attack;
        this.durability = durability;
    }

    public int getAttack() {
        return attack;
    }

    public void setAttack(int attack) {
        this.attack = attack;
    }

    public int getDurability() {
        return durability;
    }

    public void setDurability(int durability) {
        this.durability = durability;
    }
}

}

Card クラス内に存在するこのオブジェクトをデータベースにマップしようとするときに遭遇する問題は、Reward が固有のエンティティではないため、id が含まれていないことです。これは、1 つのクラスにまとめられた Card プロパティのセットです。

私がこれまでに思いついた唯一の解決策は、データベース内の Reward への外部キーを持たず、代わりにすべての Reward フィールドを非正規化して Cards テーブル内に配置することです。

たとえば、Cards テーブルには、報酬への外部キーではなく、reward_type、amount、および weapon_data 列が含まれます。

この方法について友達に尋ねたところ、非正規化されているため、エレガントなソリューションではないと言われました。

また、Sql2o という名前のシン JDBC ラッパーを使用してこれをマッピングする際にも問題が発生します。オブジェクトをデータベース テーブルにスムーズにマッピングするのに役立つからです。

オブジェクトが JSON ドキュメントに簡単にマップされ、データベース内に格納されるため、データベース テーブルの一部を NoSql データベースに切り替えることを検討しました。これにより、この状況がはるかに簡単になります。

ただし、データベース内の他のテーブルには Cards テーブルへの外部キー参照が含まれているため、いくつかの大きな問題が発生します。

これらの Reward オブジェクトをクリーンな方法でデータベースにマップするソリューションを誰かが持っている場合は、すべての助けをいただければ幸いです。

これを読んでくれてありがとう。

4

1 に答える 1