当前位置: 首页 > 知识库问答 >
问题:

在房间中使用嵌套数据库最正确的方法是什么?

龚远
2023-03-14

我正在考虑创建一个包含一对多和多对多元素的模式。由于我在这方面有点新手,我搜索了一些资源,发现了两种类型的示例;1.将下层对象的内容放入上层,然后进行处理。第二种类型是创建外键,您认为哪一种更正确?

1.

@Entity
public class User {
   @PrimaryKey
   public final int id;
   public final String login;
   public final String avatarUrl;

}

@Entity
public class Tweet {
   @PrimaryKey
   public long id;
   public String body;
   public String createdAt;
   public long userId;

   // this field will be ignored by Room, but still can be used in other places in the Twitter app
   @Ignore 
   public User user;
}


@Entity
public class User {
    @PrimaryKey
    public final int id;
    public final String login;
    public final String avatarUrl;
}


@Entity(foreignKeys = @ForeignKey(entity = User.class,
                                  parentColumns = "id",
                                  childColumns = "userId",
                                  onDelete = CASCADE))
public class Tweet {
    @PrimaryKey
    public long id;
    public String body;
    public String createdAt;
    public long userId;
}



这两个选项中,哪一个是正确且有效的?

另外,这是我想要创建的数据库模式。。你觉得我该怎么办。。请用java展示我不认识kotlin的例子


{
 "UserDatabase":
 [
   {
     "sql_id": 0,
     "name": "Test Name",
     "username": "null",
     "gender": "male",
     "profile_photo_path": "path",
     "pro_version": true,
     "date_of_birth": "01/01/0000",
     "weight": 100,
     "height": 186,
     "waist_size": 0,
     "neck_size": 0,
     "hip_size": 0,
     "bmr_formula": "Benedict",
     "macro_formula": "Fitness",
     "starting_date": "18/02/2022",
     "saved_items":
     [
       {
         "sql_id": 0,
         "parent_id": 0,
         "item_id": 0,
         "item_name": "name",
         "item_image": "item image",
         "item_url": "url",
         "item_editor": "editor"
       }
     ],
     "days":
     [
       {
         "sql_id": 0,
         "parent_id": 0,
         "id": 0,
         "date": "16/02/2022",
         "weight": 96,
         "steps": 25252525,
         "taken_kcal": 257.56,
         "burned_kcal": 27.86,
         "carb": 25.52,
         "protein": 5.2,
         "fat": 8.4,
         "water_ml": "3250",
         "water_percent": 27.68,
         "daily_water_list":
         [
           {
             "sql_id": 0,
             "parent_id": 0,
             "id": 0,
             "time": 1644999314504,
             "water_ml": 300
           }
         ],
         "daily_meals":
         [
           {
             "sql_id": 0,
             "parent_id": 0,
             "id": 0,
             "food_meal_time": "Meal Time",
             "food_name": "Name",
             "food_image": "image url",
             "food_kcal": 300.56,
             "food_portion": "Portion"
           }
         ]
       }
     ]
   }
 ]
}

共有1个答案

裴昕
2023-03-14

更好的方法是使用外键,因为这样可以加强引用完整性。

除此之外,除了在子(ren)(Tweet)中包含父(用户)之外,没有什么区别。这是不需要的(因为你引用了父),它与正常化相矛盾(即它复制数据)。

更具体地说

添加外键引入了约束(规则),这些约束(规则)表示引用父表(用户)的子表(鸣叫)中的值必须是父表中存在的值,否则会发生冲突。

CASCADE的onDelete操作将自动删除父级,从而帮助/简化维护引用完整性。

 类似资料:
  • 问题内容: 嵌套的RAL居? 假设我正在尝试做Spark中的“嵌套循环”。就像普通语言一样,假设我在内部循环中有一个例程,该例程以Pi Average Spark示例 的方式估算Pi(请参见估算Pi) 我可以在Spark中嵌套并行化调用吗?我正在尝试,但还没有解决。乐于张贴错误和代码,但我想我要问一个更概念性的问题,即这是否是Spark中的正确方法。 我已经可以并行化一个Spark实例/ Pi估计

  • 问题内容: 我正在使用multiprocessor.Pool()模块来加速“令人尴尬的并行”循环。其实我有一个嵌套的循环,现在用multiprocessor.Pool加快内循环。例如,在不并行化循环的情况下,我的代码如下: 使用并行化: 我的主要问题是这是否正确,我应该在循环内包含multiprocessing.Pool(),或者是否应该在循环外创建池,即: 另外,我不知道我是否应该包括线“poo

  • 在Haskell中执行嵌套循环有两种明显的“惯用”方法:使用列表monad或使用 : 在1s内运行。这个库使用得不多,也远不是惯用的,那么,获得快速恒定空间二维计算的惯用方法是什么呢?(注意,这不是REPA的情况,因为我想在网格上执行任意IO操作。)

  • 考虑到我正在使用以下RESTful APIendpoint: /users/:显示所有用户 /users/$user_id/:显示特定用户 /users/$user_id/posts/:按用户显示所有帖子 /users/$user_id/posts/$post_id/:按用户显示特定帖子 这个数据模型中的约束:一篇文章总是有一个用户。 “处理嵌套资源”是指处理CRUD操作。 我应该在 /users

  • 在学习Java 8 streams和lambas时,我尝试用streams替换以下嵌套for循环: 循环迭代“ProvidedService”对象的列表,对于每个对象,循环遍历“Desk”对象的列表属性,并将“Id”字段提取到列表中。 我使用streams生成了以下代码: 这是正确/最佳的方法吗?或者有没有一种方法可以在没有第二个嵌套流的情况下实现这一点?

  • 我正在尝试用Mockito模拟我的房间数据库,以便我可以在我的存储库中测试复杂的算法。无论我朝哪个方向走,我都会遇到很多不同的错误。 首先,我试图模仿整个数据库对象,这创建了一个空接口异常。 为了解决这个问题,我使用了房间的静态对象生成器。(这是一个仪器化的单元测试,所以我可以访问底层的Android依赖项) 有了这个,我收到了一个被滥用的匹配器异常… org.mockito.exceptions