【问题标题】:Creating a bridge table equivalent realm class?创建一个桥表等效领域类?
【发布时间】:2017-01-22 19:25:41
【问题描述】:

我正在设计一个数据库,我打算使用 Realm 在 Android 上实现它。我仍在探索和阅读有关使用图书馆的信息,但我有一个问题与我有关。是否可以使用 Realm 实现桥接表(见下图)?

从我在文档link 的“关系”部分读到的内容,我可以使用 RealmList 对象来处理多对多关系。例如,对于“User_Activity”表。但是,我仍然不确定如何将数据库设计“转换”为等效的 Realm 类。

【问题讨论】:

  • 一个用户可以属于多个activity吗?一个活动可以属于多个用户吗?
  • @EpicPandaForce 一项活动(例如静态、跑步、步行)可以属于多个用户。这就是我在脑海中看到的。 Activity 表将仅存储 4 个条目 - 步行、跑步、骑自行车和静态,这些条目将在 UserActivity 中引用并与不同的用户相关联。
  • 啊,你还按日期记录这些以前的用户活动。
  • @EpicPandaForce 正确!我的计划是稍后按日期对用户活动进行排序,并将它们显示在 Android 上的 ListView 中:)

标签: database database-design realm realm-list


【解决方案1】:
public class User extends RealmObject {
    @PrimaryKey
    private String userId;

    private String password;

    @Index
    private String username;

    private String paGoal; // ?

    private long maxInactivityInterval;

    private RealmList<UserActivity> userActivities;

    private Activity currentActivity; // optional
}

public class UserActivity extends RealmObject {
    @PrimaryKey
    private String userIdAndActivityIdAndDate; // userid_activityid_2017-01-23

    @Index
    private Date date;

    private long duration;

    private User user;

    @Index
    private String userId;

    private Activity activity;

    @Index
    private String activityId;
}

public class Activity extends RealmObject {
    @PrimaryKey
    private String activityId;

    @Index
    private String type;
}

我认为这个架构适合你。

【讨论】:

  • 感谢您的回答。看起来非常好。一个问题,不过。字段“userIdAndActivityIdAndDate”将是一个“compaund key”,例如,如果我有一个 userId = 1 的用户和一个 activityId = 1 的活动,那么密钥看起来像这样 -> 112017-01-23 对吗?
  • @GeorgiKoemdzhiev 是的,确切地说(虽然我更喜欢用_s 将它们分开)〜如果你的主键需要小时/分钟,那也是你应该在那里想象的东西,就像@ 987654323@左右。
【解决方案2】:

你可以简单地定义你的类:

public class User {
    private int id;
    private String username;
    ...
    private UserActivity userActivity;
}

public class UserActivity {
   private int id;
   private Activity activity;
}

您不必在模型中存储“外部 ID”。 Realm 实际上将相关的链接对象存储为下面的指针。所以只需按照领域的链接doc 并将链接对象定义为字段

【讨论】:

  • 感谢您的回答。我认为让我感到困惑的是,我试图使用典型数据库的知识来设计数据库,却忘记了 Realm 是非常面向对象的,几乎就像一个典型的类。
  • 我主要关心的是如何将特定用户与特定活动相关联。你认为在 User 类中创建一个 RealmList 字段可以解决问题吗?
【解决方案3】:

User_Activity 表是数据库中的辅助表。辅助表有助于绑定来自具有多对多关系的 2 个不同表的相关记录。所以,我认为没有理由在 Realm 中定义 UserActivity 类。

public class User {
   private RealmList<Activity> activities;
}

public class Activity {
   private RealmList<Users> users;
}

如果你想要多对多关系就足够了。

但至于你的问题,我相信你需要一对多的关系,比如

所以,正确的定义如下:

public class User {
   private RealmList<Activity> activities;
}

public class Activity {
   private user = User;
}

【讨论】:

  • realm-java 尚不支持链接对象github.com/realm/realm-java/issues/607
  • 我真的在考虑采用你的方法(这很简单) - 有 2 个表 - 具有 userId 的用户(以及上面提到的其他字段和活动的 RealmList)和具有“类型”的活动表、“日期”和“持续时间”字段(没有 id,因为我计划通过用户的 id 获取活动)。
  • 谢谢。想,这很快:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多